Broken viewport stuff
parent
2a4820db24
commit
563de84132
@ -1,9 +1,22 @@
|
|||||||
import com.last.commit.inventory.Inventory
|
import com.last.commit.inventory.Inventory
|
||||||
import com.last.commit.config.GameSettings
|
import com.last.commit.config.GameSettings
|
||||||
|
import com.last.commit.config.GameConfig
|
||||||
import com.last.commit.audio.SoundEngine
|
import com.last.commit.audio.SoundEngine
|
||||||
|
import com.badlogic.gdx.Gdx
|
||||||
|
import com.badlogic.gdx.utils.Json
|
||||||
|
|
||||||
data class GameState(
|
class GameState(
|
||||||
val inventory: Inventory,
|
val inventory: Inventory,
|
||||||
val settings: GameSettings,
|
val settings: GameSettings,
|
||||||
public val soundEngine: SoundEngine,
|
val soundEngine: SoundEngine,
|
||||||
)
|
) {
|
||||||
|
val gameConfig: GameConfig
|
||||||
|
get() = loadGameConfig()
|
||||||
|
|
||||||
|
fun loadGameConfig(): GameConfig {
|
||||||
|
val jsonFileHandle = Gdx.files.local("config.json")
|
||||||
|
val json = Json()
|
||||||
|
|
||||||
|
return json.fromJson(GameConfig::class.java, jsonFileHandle)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,190 @@
|
|||||||
|
package com.last.commit.stages
|
||||||
|
|
||||||
|
import GameState
|
||||||
|
import com.badlogic.gdx.graphics.Texture
|
||||||
|
import com.badlogic.gdx.graphics.g2d.TextureRegion
|
||||||
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch
|
||||||
|
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
|
||||||
|
import com.badlogic.gdx.graphics.GL20
|
||||||
|
import com.badlogic.gdx.graphics.Color
|
||||||
|
import com.badlogic.gdx.scenes.scene2d.Stage
|
||||||
|
import com.badlogic.gdx.utils.viewport.FillViewport
|
||||||
|
import com.badlogic.gdx.math.Vector2
|
||||||
|
import com.badlogic.gdx.math.MathUtils
|
||||||
|
import com.badlogic.gdx.math.Vector3
|
||||||
|
import com.badlogic.gdx.Gdx
|
||||||
|
import com.last.commit.Player
|
||||||
|
import com.last.commit.map.TimeMap
|
||||||
|
import com.last.commit.map.Interactable
|
||||||
|
import com.last.commit.config.ActionCommand
|
||||||
|
import com.badlogic.gdx.Input.Keys
|
||||||
|
import kotlin.math.floor
|
||||||
|
|
||||||
|
public class WorldStage(height: Float, width: Float, val state: GameState) :
|
||||||
|
Stage(FillViewport(height, width)) {
|
||||||
|
|
||||||
|
val player = Player(TextureRegion(Texture("sprites/characters.png"), 300, 44, 35, 43), state)
|
||||||
|
var map = TimeMap(state.gameConfig.getRandomMap(), state)
|
||||||
|
var overlayRenderer = ShapeRenderer()
|
||||||
|
val highlightColor = Color(0f, 0f, 1f, 0.5f)
|
||||||
|
|
||||||
|
init {
|
||||||
|
player.addItemToInventory("drill")
|
||||||
|
this.spawnPlayer()
|
||||||
|
this.updateCamera()
|
||||||
|
overlayRenderer.setAutoShapeType(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun resize(width: Int, height: Int) {
|
||||||
|
this.viewport.update(width, height, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun act(delta: Float) {
|
||||||
|
super.act(delta)
|
||||||
|
this.handleInput(delta)
|
||||||
|
this.handleMapBorderCollision()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun draw() {
|
||||||
|
super.draw()
|
||||||
|
val interactables = map.getInteractablesAt(player.getAbsoluteDirection())
|
||||||
|
this.renderInteractables(interactables)
|
||||||
|
val mousePosition: Vector2 = getMousePosition()
|
||||||
|
player.lookAt(mousePosition)
|
||||||
|
|
||||||
|
batch.projectionMatrix = camera.combined
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun keyTyped(character: Char): Boolean {
|
||||||
|
super.keyTyped(character)
|
||||||
|
val characterUpperCase = character.uppercase()
|
||||||
|
val characterKey = Keys.valueOf(characterUpperCase)
|
||||||
|
|
||||||
|
if (state.settings.getAction(characterKey) == ActionCommand.INTERACT) {
|
||||||
|
openDoor()
|
||||||
|
} else if (state.settings.getAction(characterKey) == ActionCommand.TIME_TRAVEL) {
|
||||||
|
map.teleport(player)
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun touchDown(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean {
|
||||||
|
val mouseCoordinates: Vector2 = toWorldCoordinates(screenX.toFloat(), screenY.toFloat())
|
||||||
|
println("Mouse World coordinates is ${mouseCoordinates.x}:${mouseCoordinates.y}")
|
||||||
|
|
||||||
|
val playerDirection: Vector2 = player.getAbsoluteDirection()
|
||||||
|
println("Player interactor is ${playerDirection.x}:${playerDirection.y}")
|
||||||
|
map.interactWith(playerDirection.x, playerDirection.y, player.getCollider())
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun openDoor() {
|
||||||
|
println("Attempt to toggle door")
|
||||||
|
val playerDirection: Vector2 = player.getAbsoluteDirection()
|
||||||
|
println("Player interactor is ${playerDirection.x}:${playerDirection.y}")
|
||||||
|
map.interactWith(playerDirection.x, playerDirection.y, player.getCollider())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun spawnPlayer() {
|
||||||
|
val playerSpawn: Vector2 = map.getPlayerSpawn()
|
||||||
|
this.player.position = playerSpawn
|
||||||
|
this.addActor(player)
|
||||||
|
this.addActor(map)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun renderInteractables(interactables: List<Interactable>) {
|
||||||
|
Gdx.gl.glEnable(GL20.GL_BLEND)
|
||||||
|
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)
|
||||||
|
overlayRenderer.setProjectionMatrix(this.camera.combined)
|
||||||
|
overlayRenderer.setColor(highlightColor)
|
||||||
|
overlayRenderer.begin(ShapeRenderer.ShapeType.Filled)
|
||||||
|
|
||||||
|
for (interactable in interactables) {
|
||||||
|
overlayRenderer
|
||||||
|
.rect(
|
||||||
|
interactable.getCollider().x,
|
||||||
|
interactable.getCollider().y,
|
||||||
|
interactable.getCollider().width,
|
||||||
|
interactable.getCollider().height
|
||||||
|
)
|
||||||
|
}
|
||||||
|
overlayRenderer.end()
|
||||||
|
Gdx.gl.glDisable(GL20.GL_BLEND)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateCamera() {
|
||||||
|
val mapSize = Vector2(map.width.toFloat(), map.height.toFloat())
|
||||||
|
|
||||||
|
val scale = viewport.worldHeight / viewport.screenHeight
|
||||||
|
camera.position.x = MathUtils.clamp(
|
||||||
|
player.position.x,
|
||||||
|
(viewport.worldWidth / 2f) + (viewport.leftGutterWidth * scale),
|
||||||
|
mapSize.x - (viewport.worldWidth / 2f) - (viewport.rightGutterWidth * scale)
|
||||||
|
)
|
||||||
|
camera.position.y = MathUtils.clamp(
|
||||||
|
player.position.y,
|
||||||
|
(viewport.worldHeight / 2f) + (viewport.topGutterHeight * scale),
|
||||||
|
mapSize.y - (viewport.worldHeight / 2f) - (viewport.bottomGutterHeight * scale)
|
||||||
|
)
|
||||||
|
camera.update()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleInput(delta: Float) {
|
||||||
|
val horizontalMovement = Vector2()
|
||||||
|
if (Gdx.input.isKeyPressed(Keys.A) || Gdx.input.isKeyPressed(Keys.LEFT)) {
|
||||||
|
horizontalMovement.sub(Vector2.X)
|
||||||
|
}
|
||||||
|
if (Gdx.input.isKeyPressed(Keys.D) || Gdx.input.isKeyPressed(Keys.RIGHT)) {
|
||||||
|
horizontalMovement.add(Vector2.X)
|
||||||
|
}
|
||||||
|
this.player.move(horizontalMovement, delta)
|
||||||
|
var isColliding = this.map.isCollidingWith(player)
|
||||||
|
|
||||||
|
if (isColliding) {
|
||||||
|
horizontalMovement.rotateDeg(180f)
|
||||||
|
this.player.move(horizontalMovement, delta)
|
||||||
|
}
|
||||||
|
val verticalMovement = Vector2()
|
||||||
|
if (Gdx.input.isKeyPressed(Keys.W) || Gdx.input.isKeyPressed(Keys.UP)) {
|
||||||
|
verticalMovement.add(Vector2.Y)
|
||||||
|
}
|
||||||
|
if (Gdx.input.isKeyPressed(Keys.S) || Gdx.input.isKeyPressed(Keys.DOWN)) {
|
||||||
|
verticalMovement.sub(Vector2.Y)
|
||||||
|
}
|
||||||
|
this.player.move(verticalMovement, delta)
|
||||||
|
isColliding = this.map.isCollidingWith(player)
|
||||||
|
if (isColliding) {
|
||||||
|
verticalMovement.rotateDeg(180f)
|
||||||
|
this.player.move(verticalMovement, delta)
|
||||||
|
}
|
||||||
|
val hasMoved = !horizontalMovement.isZero || !verticalMovement.isZero
|
||||||
|
|
||||||
|
if (hasMoved) {
|
||||||
|
this.updateCamera()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun handleMapBorderCollision() {
|
||||||
|
val mapWidth: Int = map.width
|
||||||
|
val mapHeight: Int = map.height
|
||||||
|
val playerSize: Float = player.getSize()
|
||||||
|
val playerX: Float = MathUtils.clamp(this.player.getX(), 0f, mapWidth - playerSize)
|
||||||
|
val playerY: Float = MathUtils.clamp(this.player.getY(), 0f, mapHeight - playerSize)
|
||||||
|
this.player.setPosition(playerX, playerY)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getMousePosition(): Vector2 {
|
||||||
|
val unprojectedMousePosition =
|
||||||
|
viewport.unproject(Vector3(Gdx.input.x.toFloat(), Gdx.input.y.toFloat(), 0f))
|
||||||
|
return Vector2(unprojectedMousePosition.x, unprojectedMousePosition.y)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun toWorldCoordinates(x: Float, y: Float): Vector2 {
|
||||||
|
val mouseInWorldPosition = viewport.unproject(Vector3(x, y, 0f))
|
||||||
|
return Vector2(
|
||||||
|
floor(mouseInWorldPosition.x.toDouble() / this.map.getTileWidth()).toFloat(),
|
||||||
|
floor(mouseInWorldPosition.y.toDouble() / this.map.getTileHeight()).toFloat()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue