Removed GameState

main
Matthias 1 year ago
parent e7dfc8fa78
commit 3eab0e3730

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<map version="1.9" tiledversion="1.9.1" orientation="orthogonal" renderorder="right-down" width="64" height="64" tilewidth="64" tileheight="64" infinite="0" nextlayerid="13" nextobjectid="55"> <map version="1.9" tiledversion="1.9.1" orientation="orthogonal" renderorder="right-down" width="64" height="64" tilewidth="64" tileheight="64" infinite="0" nextlayerid="13" nextobjectid="57">
<properties> <properties>
<property name="description" value="01.10.2001"/> <property name="description" value="01.10.2001"/>
<property name="id" type="int" value="1"/> <property name="id" type="int" value="1"/>
@ -709,6 +709,16 @@
<property name="item" value="screwdriver"/> <property name="item" value="screwdriver"/>
</properties> </properties>
</object> </object>
<object id="55" x="1600" y="2304" width="64" height="64">
<properties>
<property name="item" value="compass"/>
</properties>
</object>
<object id="56" x="1664" y="2368" width="64" height="64">
<properties>
<property name="item" value="compass"/>
</properties>
</object>
</objectgroup> </objectgroup>
<objectgroup id="8" name="Spawnpoints"> <objectgroup id="8" name="Spawnpoints">
<object id="1" x="2081" y="2330"> <object id="1" x="2081" y="2330">

@ -1,20 +1,14 @@
package com.last.commit package com.last.commit
import com.badlogic.gdx.Game import com.badlogic.gdx.Game
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Screen import com.badlogic.gdx.Screen
import com.badlogic.gdx.graphics.g2d.BitmapFont import com.badlogic.gdx.graphics.g2d.BitmapFont
import com.badlogic.gdx.scenes.scene2d.ui.Skin
import com.last.commit.inventory.Inventory
import com.last.commit.screen.* import com.last.commit.screen.*
import com.last.commit.stages.DialogStage
/** [com.badlogic.gdx.ApplicationListener] implementation shared by all platforms. */ /** [com.badlogic.gdx.ApplicationListener] implementation shared by all platforms. */
class Game : Game() { class Game : Game() {
lateinit var state: GameState
lateinit var loading: Screen lateinit var loading: Screen
lateinit var menu: Screen lateinit var menu: Screen
lateinit var gameplay: Screen lateinit var gameplay: Screen
@ -24,7 +18,6 @@ class Game : Game() {
override fun create() { override fun create() {
font = BitmapFont() font = BitmapFont()
createState()
createScreens() createScreens()
changeScreen(Screens.LOADING) changeScreen(Screens.LOADING)
@ -46,12 +39,4 @@ class Game : Game() {
Screens.GAME -> setScreen(gameplay) Screens.GAME -> setScreen(gameplay)
} }
} }
fun createState() {
state = GameState(
Inventory(),
null,
DialogStage(Skin(Gdx.files.internal("ui/uiskin.json")))
)
}
} }

@ -1,12 +0,0 @@
package com.last.commit
import com.last.commit.inventory.Inventory
import com.last.commit.map.MapState
import com.last.commit.stages.DialogStage
data class GameState(
val inventory: Inventory,
var map: MapState? = null,
val dialogStage: DialogStage
) {
}

@ -5,9 +5,14 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion
import com.badlogic.gdx.math.Rectangle import com.badlogic.gdx.math.Rectangle
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.last.commit.audio.SoundEngine import com.last.commit.audio.SoundEngine
import com.last.commit.inventory.Inventory
import com.last.commit.inventory.InventoryItem
import com.last.commit.map.Collectible
import com.last.commit.map.Door
import com.last.commit.map.Interactable
class Player(private val textureRegion: TextureRegion, private val gameState: GameState) : Collidable { class Player(private val textureRegion: TextureRegion) : Collidable {
private var collider: Rectangle = Rectangle(0f, 0f, 0f, 0f) private var collider: Rectangle = Rectangle(0f, 0f, 0f, 0f)
var position: Vector2 = Vector2.Zero var position: Vector2 = Vector2.Zero
@ -16,10 +21,13 @@ class Player(private val textureRegion: TextureRegion, private val gameState: Ga
private val interactionRange = 60f private val interactionRange = 60f
private var lastStep = 0L private var lastStep = 0L
val inventory: Inventory;
init { init {
val size = Math.max(textureRegion.regionWidth, textureRegion.regionHeight).toFloat() val size = Math.max(textureRegion.regionWidth, textureRegion.regionHeight).toFloat()
collider = Rectangle(0f, 0f, size, size) collider = Rectangle(0f, 0f, size, size)
position = Vector2() position = Vector2()
inventory = Inventory()
} }
fun getX(): Float { fun getX(): Float {
@ -125,4 +133,48 @@ class Player(private val textureRegion: TextureRegion, private val gameState: Ga
getRotation() getRotation()
) )
} }
fun canInteractWith(interactable: Interactable): Boolean {
if (interactable is Door) {
val requiredItem: String =
interactable.cell.getTile().getProperties().get("requiredItem", "", String::class.java)
val item: InventoryItem? = inventory.items.find { it.name == requiredItem }
val result: Boolean
if (item == null) {
result = requiredItem == ""
} else {
result = requiredItem == item.name
}
return result
} else if (interactable is Collectible) {
if (interactable.requiredItem == "") {
return true
}
inventory.items.find { it.name == interactable.requiredItem } ?: return false
return true
}
return false;
}
fun interactWith(interactable: Interactable): Boolean {
if (interactable is Door) {
//check Collision
if (getCollider().overlaps(interactable.getCollider())) {
return false;
}
interactable.interact()
} else if (interactable is Collectible) {
if (inventory.hasItem(interactable.name) || inventory.isFull()) {
return false
} else {
inventory.add(interactable.name)
return true
}
}
return false
}
} }

@ -3,7 +3,6 @@ package com.last.commit.map
import com.badlogic.gdx.math.Rectangle import com.badlogic.gdx.math.Rectangle
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.ui.Image import com.badlogic.gdx.scenes.scene2d.ui.Image
import com.last.commit.GameState
import com.last.commit.audio.SoundEngine import com.last.commit.audio.SoundEngine
class Collectible( class Collectible(
@ -22,29 +21,9 @@ class Collectible(
this.collider = Rectangle(pos.x, pos.y, size.x, size.y) this.collider = Rectangle(pos.x, pos.y, size.x, size.y)
} }
override fun interact(otherCollider: Rectangle, state: GameState): Boolean { override fun interact() {
println("Interacting with item $name") println("Interacting with item $name")
SoundEngine.play("GRAB") SoundEngine.play("GRAB")
if (state.inventory.hasItem(this.name)) {
state.dialogStage.setTexts("You already have this item.")
state.dialogStage.show()
} else if (state.inventory.isFull()) {
state.dialogStage.setTexts("You can't carry anymore items.")
} else {
state.inventory.add(this.name)
return true
}
return false
}
override fun canInteract(state: GameState): Boolean {
if (requiredItem == "") {
return true
}
state.inventory.items.find { it.name == requiredItem } ?: return false
return true
} }
override fun getCollider(): Rectangle { override fun getCollider(): Rectangle {

@ -2,51 +2,27 @@ package com.last.commit.map
import com.badlogic.gdx.maps.tiled.TiledMapTileLayer.Cell import com.badlogic.gdx.maps.tiled.TiledMapTileLayer.Cell
import com.badlogic.gdx.math.Rectangle import com.badlogic.gdx.math.Rectangle
import com.last.commit.GameState
import com.last.commit.Wall import com.last.commit.Wall
import com.last.commit.audio.SoundEngine import com.last.commit.audio.SoundEngine
import com.last.commit.inventory.InventoryItem
class Door(gridX: Int, gridY: Int, wallCollider: Rectangle, cell: Cell) : class Door(gridX: Int, gridY: Int, wallCollider: Rectangle, cell: Cell) :
Wall(gridX, gridY, wallCollider, cell), Interactable { Wall(gridX, gridY, wallCollider, cell), Interactable {
fun getRequiredItem() {
override fun canInteract(state: GameState): Boolean {
val requiredItem: String = cell.getTile().getProperties().get("requiredItem", "", String::class.java)
val item: InventoryItem? = state.inventory.items.find { it.name == requiredItem }
val result: Boolean
if (item == null) {
result = requiredItem == ""
} else {
result = requiredItem == item.name
}
if (!result) {
state.dialogStage.setTexts("This dor is blocked. You need a key")
state.dialogStage.show()
}
return result
} }
override fun interact(otherCollider: Rectangle, state: GameState): Boolean { override fun interact() {
println("interacting with door $this") println("interacting with door $this")
if (isClosed) { if (isClosed) {
SoundEngine.play("DOOR_OPEN") SoundEngine.play("DOOR_OPEN")
isOpen = true isOpen = true
} else if (isOpen) { } else if (isOpen) {
if (getCollider().overlaps(otherCollider)) { SoundEngine.play("DOOR_CLOSE")
// can't close the door cause it is colliding with given collider isOpen = false
} else {
SoundEngine.play("DOOR_CLOSE")
isOpen = false
}
} }
println("Door is now open = $isOpen") println("Door is now open = $isOpen")
return false
} }
var isOpen: Boolean var isOpen: Boolean

@ -1,12 +1,10 @@
package com.last.commit.map package com.last.commit.map
import com.badlogic.gdx.math.Rectangle import com.badlogic.gdx.math.Rectangle
import com.last.commit.GameState
interface Interactable { interface Interactable {
fun getCollider(): Rectangle fun getCollider(): Rectangle
fun interact(otherCollider: Rectangle, state: GameState): Boolean fun interact()
fun canInteract(state: GameState): Boolean
} }

@ -6,17 +6,16 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.badlogic.gdx.maps.tiled.TiledMap import com.badlogic.gdx.maps.tiled.TiledMap
import com.badlogic.gdx.maps.tiled.TmxMapLoader import com.badlogic.gdx.maps.tiled.TmxMapLoader
import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer import com.badlogic.gdx.maps.tiled.renderers.OrthogonalTiledMapRenderer
import com.badlogic.gdx.math.Rectangle
import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector2
import com.badlogic.gdx.scenes.scene2d.ui.Image import com.badlogic.gdx.scenes.scene2d.ui.Image
import com.last.commit.Collidable import com.last.commit.Collidable
import com.last.commit.GameState
import com.last.commit.Player import com.last.commit.Player
import com.last.commit.audio.SoundEngine import com.last.commit.audio.SoundEngine
import com.last.commit.inventory.SpritesheetTextureLoader import com.last.commit.inventory.SpritesheetTextureLoader
import com.last.commit.stages.DialogStage
class TimeMap(fileName: String, val state: GameState) { class TimeMap(fileName: String, val dialogStage: DialogStage) {
private val CELL_SIZE = 64 private val CELL_SIZE = 64
val textureLoader = SpritesheetTextureLoader("sprites/genericItems_spritesheet_colored") val textureLoader = SpritesheetTextureLoader("sprites/genericItems_spritesheet_colored")
@ -47,7 +46,6 @@ class TimeMap(fileName: String, val state: GameState) {
init { init {
map = mapLoader.load(fileName) map = mapLoader.load(fileName)
mapState = MapState(map, textureLoader) mapState = MapState(map, textureLoader)
state.map = mapState
mapStates[fileName] = mapState mapStates[fileName] = mapState
mapRenderer = OrthogonalTiledMapRenderer(map) mapRenderer = OrthogonalTiledMapRenderer(map)
} }
@ -63,8 +61,8 @@ class TimeMap(fileName: String, val state: GameState) {
System.out.println("Teleporting to targetMap $targetMap") System.out.println("Teleporting to targetMap $targetMap")
loadMap("tiled/$targetMap") loadMap("tiled/$targetMap")
val mapDescription = mapState.description val mapDescription = mapState.description
state.dialogStage.setTexts(4000L, "You teleported to $mapDescription") dialogStage.setTexts(4000L, "You teleported to $mapDescription")
state.dialogStage.show() dialogStage.show()
} }
} }
@ -79,7 +77,6 @@ class TimeMap(fileName: String, val state: GameState) {
mapState = MapState(map, textureLoader) mapState = MapState(map, textureLoader)
mapStates[name] = mapState mapStates[name] = mapState
} }
state.map = mapState
} }
fun getPlayerSpawn(): Vector2 { fun getPlayerSpawn(): Vector2 {
@ -115,7 +112,7 @@ class TimeMap(fileName: String, val state: GameState) {
return null return null
} }
fun interactWith(x: Float, y: Float, blockingCollider: Rectangle) { fun interactWith(x: Float, y: Float, player: Player) {
val gridX = x.toInt() / CELL_SIZE val gridX = x.toInt() / CELL_SIZE
val gridY = y.toInt() / CELL_SIZE val gridY = y.toInt() / CELL_SIZE
@ -123,13 +120,18 @@ class TimeMap(fileName: String, val state: GameState) {
val interactable: Interactable = this.findInteractableAtPosition(gridX, gridY) ?: return val interactable: Interactable = this.findInteractableAtPosition(gridX, gridY) ?: return
//else continue //else continue
if (interactable.canInteract(state)) { if (player.canInteractWith(interactable)) {
println("Interacting with element at $gridX:$gridY") println("Interacting with element at $gridX:$gridY")
val collected = interactable.interact(blockingCollider, state) val interacted = player.interactWith(interactable);
if (collected && interactable is Collectible) { if (interacted && interactable is Collectible) {
state.map?.collectibles?.remove(interactable) mapState.collectibles.remove(interactable)
} else if (!interacted && interactable is Collectible) {
dialogStage.setTexts("You cannot use this at the moment.")
dialogStage.show()
} }
} else { } else {
dialogStage.setTexts("You cannot interact with this now.")
dialogStage.show()
println("Cannot interact with $gridX:$gridY") println("Cannot interact with $gridX:$gridY")
} }
} }

@ -19,6 +19,7 @@ import com.last.commit.Player
import com.last.commit.config.GameConfig import com.last.commit.config.GameConfig
import com.last.commit.map.Interactable import com.last.commit.map.Interactable
import com.last.commit.map.TimeMap import com.last.commit.map.TimeMap
import com.last.commit.stages.DialogStage
import com.last.commit.stages.PromptStage import com.last.commit.stages.PromptStage
import com.last.commit.stages.UIStage import com.last.commit.stages.UIStage
import kotlin.math.floor import kotlin.math.floor
@ -26,8 +27,6 @@ import kotlin.math.floor
/** First screen of the application. Displayed after the application is created. */ /** First screen of the application. Displayed after the application is created. */
class FirstScreen(private val parent: Game) : Screen, InputProcessor { class FirstScreen(private val parent: Game) : Screen, InputProcessor {
val gameState = parent.state
val viewportSize = 1200f val viewportSize = 1200f
private var isColliding = false private var isColliding = false
@ -39,30 +38,28 @@ class FirstScreen(private val parent: Game) : Screen, InputProcessor {
lateinit var map: TimeMap lateinit var map: TimeMap
val playerTexture = Texture("sprites/characters.png") val playerTexture = Texture("sprites/characters.png")
val player = Player(TextureRegion(playerTexture, 300, 44, 35, 43), gameState) val player = Player(TextureRegion(playerTexture, 300, 44, 35, 43))
var shapeRenderer = ShapeRenderer() var shapeRenderer = ShapeRenderer()
val highlightColor = Color(0f, 0f, 1f, 0.5f) val highlightColor = Color(0f, 0f, 1f, 0.5f)
lateinit var uiStage: UIStage lateinit var uiStage: UIStage
lateinit var promptStage: PromptStage lateinit var promptStage: PromptStage
lateinit var dialogStage: DialogStage
val inputProcessors = InputMultiplexer() val inputProcessors = InputMultiplexer()
init {
}
override fun show() { override fun show() {
val gameConfig = this.loadGameConfig() val gameConfig = this.loadGameConfig()
val randomMap = gameConfig.getRandomMap() val randomMap = gameConfig.getRandomMap()
map = TimeMap(randomMap, gameState) dialogStage = DialogStage(Skin(Gdx.files.internal("ui/uiskin.json")))
map = TimeMap(randomMap, dialogStage)
this.spawnPlayer() this.spawnPlayer()
this.updateCamera() this.updateCamera()
uiStage = UIStage("sprites/genericItems_spritesheet_colored", gameState) uiStage = UIStage("sprites/genericItems_spritesheet_colored", player, map)
shapeRenderer.setAutoShapeType(true) shapeRenderer.setAutoShapeType(true)
promptStage = PromptStage(Skin(Gdx.files.internal("ui/uiskin.json"))) promptStage = PromptStage(Skin(Gdx.files.internal("ui/uiskin.json")))
@ -107,7 +104,7 @@ class FirstScreen(private val parent: Game) : Screen, InputProcessor {
viewport.apply() viewport.apply()
resume() resume()
inputProcessors.addProcessor(gameState.dialogStage) inputProcessors.addProcessor(dialogStage)
inputProcessors.addProcessor(promptStage) inputProcessors.addProcessor(promptStage)
inputProcessors.addProcessor(this) inputProcessors.addProcessor(this)
Gdx.input.inputProcessor = inputProcessors Gdx.input.inputProcessor = inputProcessors
@ -122,9 +119,9 @@ class FirstScreen(private val parent: Game) : Screen, InputProcessor {
override fun render(delta: Float) { override fun render(delta: Float) {
uiStage.act(delta) uiStage.act(delta)
gameState.dialogStage.act(delta) dialogStage.act(delta)
promptStage.act(delta) promptStage.act(delta)
if (gameState.inventory.checkVictoryCondition()) { if (player.inventory.checkVictoryCondition()) {
promptStage.visible = true promptStage.visible = true
promptStage.clearText() promptStage.clearText()
promptStage.addText("You won!") promptStage.addText("You won!")
@ -153,7 +150,7 @@ class FirstScreen(private val parent: Game) : Screen, InputProcessor {
} }
promptStage.draw() promptStage.draw()
uiStage.draw() uiStage.draw()
gameState.dialogStage.draw() dialogStage.draw()
} }
fun renderInteractables(interactables: List<Interactable>) { fun renderInteractables(interactables: List<Interactable>) {
@ -262,7 +259,7 @@ class FirstScreen(private val parent: Game) : Screen, InputProcessor {
// Resize your screen here. The parameters represent the new window size. // Resize your screen here. The parameters represent the new window size.
uiStage.resize(width, height) uiStage.resize(width, height)
promptStage.resize(width, height) promptStage.resize(width, height)
gameState.dialogStage.resize(width, height) dialogStage.resize(width, height)
viewport.update(width, height) viewport.update(width, height)
viewport.apply() viewport.apply()
camera.update() camera.update()
@ -292,7 +289,7 @@ class FirstScreen(private val parent: Game) : Screen, InputProcessor {
fun openDoor() { fun openDoor() {
val playerDirection: Vector2 = player.getAbsoluteDirection() val playerDirection: Vector2 = player.getAbsoluteDirection()
map.interactWith(playerDirection.x, playerDirection.y, player.getCollider()) map.interactWith(playerDirection.x, playerDirection.y, player)
} }
fun toWorldCoordinates(x: Float, y: Float): Vector2 { fun toWorldCoordinates(x: Float, y: Float): Vector2 {
@ -333,7 +330,7 @@ class FirstScreen(private val parent: Game) : Screen, InputProcessor {
val mouseCoordinates: Vector2 = toWorldCoordinates(screenX.toFloat(), screenY.toFloat()) val mouseCoordinates: Vector2 = toWorldCoordinates(screenX.toFloat(), screenY.toFloat())
val playerDirection: Vector2 = player.getAbsoluteDirection() val playerDirection: Vector2 = player.getAbsoluteDirection()
map.interactWith(playerDirection.x, playerDirection.y, player.getCollider()) map.interactWith(playerDirection.x, playerDirection.y, player)
return false return false
} }

@ -6,10 +6,11 @@ import com.badlogic.gdx.scenes.scene2d.Stage
import com.badlogic.gdx.scenes.scene2d.ui.Image import com.badlogic.gdx.scenes.scene2d.ui.Image
import com.badlogic.gdx.scenes.scene2d.ui.Label import com.badlogic.gdx.scenes.scene2d.ui.Label
import com.badlogic.gdx.utils.viewport.ExtendViewport import com.badlogic.gdx.utils.viewport.ExtendViewport
import com.last.commit.GameState import com.last.commit.Player
import com.last.commit.inventory.SpritesheetTextureLoader import com.last.commit.inventory.SpritesheetTextureLoader
import com.last.commit.map.TimeMap
class UIStage(path: String, val state: GameState) : Stage(ExtendViewport(512f, 512f)) { class UIStage(path: String, val player: Player, val map: TimeMap) : Stage(ExtendViewport(512f, 512f)) {
val textureLoader = SpritesheetTextureLoader(path) val textureLoader = SpritesheetTextureLoader(path)
private val labelStyle = Label.LabelStyle(BitmapFont(), Color.BLACK) private val labelStyle = Label.LabelStyle(BitmapFont(), Color.BLACK)
var mapLabel = Label("unknown time", labelStyle) var mapLabel = Label("unknown time", labelStyle)
@ -18,7 +19,7 @@ class UIStage(path: String, val state: GameState) : Stage(ExtendViewport(512f, 5
fun refresh() { fun refresh() {
super.clear() super.clear()
state.inventory.items.forEachIndexed { index, inventoryItem -> player.inventory.items.forEachIndexed { index, inventoryItem ->
val image = Image(textureLoader.getTexture(inventoryItem.name)) val image = Image(textureLoader.getTexture(inventoryItem.name))
image.x = index * 32f image.x = index * 32f
image.width = 32f image.width = 32f
@ -33,9 +34,9 @@ class UIStage(path: String, val state: GameState) : Stage(ExtendViewport(512f, 5
} }
override fun act(delta: Float) { override fun act(delta: Float) {
if (state.inventory.updated) { if (player.inventory.updated) {
this.refresh() this.refresh()
state.inventory.updated = false player.inventory.updated = false
} }
this.addFpsLabel(delta) this.addFpsLabel(delta)
this.addMapDescriptionLabel() this.addMapDescriptionLabel()
@ -58,9 +59,9 @@ class UIStage(path: String, val state: GameState) : Stage(ExtendViewport(512f, 5
} }
private fun addMapDescriptionLabel() { private fun addMapDescriptionLabel() {
if (state.map != null) { if (map.mapState != null) {
this.actors.removeValue(this.mapLabel, true) this.actors.removeValue(this.mapLabel, true)
this.mapLabel = Label(state.map!!.description, labelStyle) this.mapLabel = Label(map.mapState!!.description, labelStyle)
mapLabel.x = 0f mapLabel.x = 0f
mapLabel.y = this.viewport.worldHeight - mapLabel.height mapLabel.y = this.viewport.worldHeight - mapLabel.height
addActor(mapLabel) addActor(mapLabel)

Loading…
Cancel
Save