Skip to content

Commit 384316c

Browse files
committed
Tempest: Add 3rd dimension. Also refactor GameScreen to allow PerspectiveCamera's
1 parent 7a4b2bd commit 384316c

File tree

7 files changed

+52
-18
lines changed

7 files changed

+52
-18
lines changed

core/src/com/serwylo/retrowars/games/GameScreen.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package com.serwylo.retrowars.games
33
import com.badlogic.gdx.Gdx
44
import com.badlogic.gdx.InputAdapter
55
import com.badlogic.gdx.Screen
6+
import com.badlogic.gdx.graphics.Camera
67
import com.badlogic.gdx.graphics.OrthographicCamera
8+
import com.badlogic.gdx.graphics.PerspectiveCamera
79
import com.badlogic.gdx.scenes.scene2d.Actor
810
import com.badlogic.gdx.scenes.scene2d.actions.Actions
911
import com.badlogic.gdx.scenes.scene2d.actions.Actions.*
@@ -33,7 +35,8 @@ abstract class GameScreen(
3335
positiveDescription: String,
3436
negativeDescription: String,
3537
minWorldWidth: Float,
36-
maxWorldWidth: Float
38+
maxWorldWidth: Float,
39+
isOrthographic: Boolean = false,
3740
) : Screen {
3841

3942
companion object {
@@ -45,7 +48,9 @@ abstract class GameScreen(
4548
Finished,
4649
}
4750

48-
private val camera = OrthographicCamera()
51+
private val camera = if (isOrthographic) { OrthographicCamera() } else {
52+
PerspectiveCamera(67f, 1f, 1f)
53+
}
4954
protected val viewport = GameViewport(minWorldWidth, maxWorldWidth, camera)
5055

5156
private val hud: HUD
@@ -76,6 +81,13 @@ abstract class GameScreen(
7681
init {
7782
viewport.update(Gdx.graphics.width, Gdx.graphics.height)
7883
viewport.apply(true)
84+
camera.apply {
85+
position.set(0f, 0f, -10f)
86+
lookAt(0f, 0f, 0f)
87+
near = 0f
88+
far = 1000f
89+
update()
90+
}
7991
hud = HUD(game.uiAssets)
8092

8193
if (controller != null) {
@@ -188,7 +200,7 @@ abstract class GameScreen(
188200
}
189201

190202
protected abstract fun updateGame(delta: Float)
191-
protected abstract fun renderGame(camera: OrthographicCamera)
203+
protected abstract fun renderGame(camera: Camera)
192204

193205
/**
194206
* When another player performs well, we will receive a message to tell us to get handicaped in some way.

core/src/com/serwylo/retrowars/games/asteroids/AsteroidsGameScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.serwylo.retrowars.games.asteroids
22

33
import com.badlogic.gdx.Gdx
44
import com.badlogic.gdx.Input
5-
import com.badlogic.gdx.graphics.OrthographicCamera
5+
import com.badlogic.gdx.graphics.Camera
66
import com.badlogic.gdx.math.Vector2
77
import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup
88
import com.badlogic.gdx.scenes.scene2d.ui.Label
@@ -185,7 +185,7 @@ class AsteroidsGameScreen(game: RetrowarsGame) : GameScreen(game, Games.asteroid
185185
state.asteroids.addAll(Asteroid.spawn(strength, viewport.worldWidth, viewport.worldHeight))
186186
}
187187

188-
override fun renderGame(camera: OrthographicCamera) {
188+
override fun renderGame(camera: Camera) {
189189
val r = game.uiAssets.shapeRenderer
190190

191191
// Make the ship disappear when respawning. It will then reappear in the future when ready to

core/src/com/serwylo/retrowars/games/missilecommand/MissileCommandGameScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.serwylo.retrowars.games.missilecommand
22

33
import com.badlogic.gdx.Gdx
44
import com.badlogic.gdx.InputAdapter
5-
import com.badlogic.gdx.graphics.OrthographicCamera
5+
import com.badlogic.gdx.graphics.Camera
66
import com.badlogic.gdx.math.Vector2
77
import com.serwylo.retrowars.RetrowarsGame
88
import com.serwylo.retrowars.games.GameScreen
@@ -65,7 +65,7 @@ class MissileCommandGameScreen(game: RetrowarsGame) : GameScreen(game, Games.mis
6565
}
6666
}
6767

68-
override fun renderGame(camera: OrthographicCamera) {
68+
override fun renderGame(camera: Camera) {
6969

7070
val r = game.uiAssets.shapeRenderer
7171

core/src/com/serwylo/retrowars/games/snake/SnakeGameScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package com.serwylo.retrowars.games.snake
22

33
import com.badlogic.gdx.Gdx
44
import com.badlogic.gdx.Input
5+
import com.badlogic.gdx.graphics.Camera
56
import com.badlogic.gdx.graphics.Color
6-
import com.badlogic.gdx.graphics.OrthographicCamera
77
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
88
import com.serwylo.retrowars.RetrowarsGame
99
import com.serwylo.retrowars.games.GameScreen
@@ -128,7 +128,7 @@ class SnakeGameScreen(game: RetrowarsGame) : GameScreen(game, Games.snake, "Eat
128128
state.queuedGrowth += strength
129129
}
130130

131-
override fun renderGame(camera: OrthographicCamera) {
131+
override fun renderGame(camera: Camera) {
132132

133133
val numCellsHigh = state.cells.size
134134
val numCellsWide = state.cells[0].size

core/src/com/serwylo/retrowars/games/tempest/TempestGameScreen.kt

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,25 @@ package com.serwylo.retrowars.games.tempest
22

33
import com.badlogic.gdx.Gdx
44
import com.badlogic.gdx.Input
5+
import com.badlogic.gdx.graphics.Camera
56
import com.badlogic.gdx.graphics.Color
67
import com.badlogic.gdx.graphics.OrthographicCamera
8+
import com.badlogic.gdx.graphics.g3d.utils.CameraInputController
79
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
810
import com.serwylo.retrowars.RetrowarsGame
911
import com.serwylo.retrowars.games.GameScreen
1012
import com.serwylo.retrowars.games.Games
1113
import com.serwylo.retrowars.games.tetris.ButtonState
1214
import com.serwylo.retrowars.input.TempestSoftController
13-
import com.serwylo.retrowars.input.TetrisSoftController
1415

1516
class TempestGameScreen(game: RetrowarsGame) : GameScreen(
1617
game,
1718
Games.tempest,
1819
"Shoot the enemies",
1920
"Don't let them touch you",
20-
400f,
21-
400f
21+
40f,
22+
40f,
23+
isOrthographic = false,
2224
) {
2325

2426
companion object {
@@ -79,22 +81,37 @@ class TempestGameScreen(game: RetrowarsGame) : GameScreen(
7981
override fun onReceiveDamage(strength: Int) {
8082
}
8183

82-
override fun renderGame(camera: OrthographicCamera) {
84+
override fun renderGame(camera: Camera) {
85+
camera.apply {
86+
position.set(viewport.worldWidth / 2f, viewport.worldHeight / 2f - viewport.worldHeight / 8f, viewport.worldHeight.coerceAtMost(viewport.worldWidth))
87+
lookAt(viewport.worldWidth / 2f, viewport.worldHeight / 2f, 0f)
88+
update()
89+
}
8390
renderLevel(camera)
8491
}
8592

86-
private fun renderLevel(camera: OrthographicCamera) {
93+
private fun renderLevel(camera: Camera) {
8794
val r = game.uiAssets.shapeRenderer
8895

8996
r.begin(ShapeRenderer.ShapeType.Line)
9097
r.projectionMatrix = camera.combined
9198

99+
r.color = Color.BLUE
92100
state.level.segments.forEach { segment ->
93-
r.color = if (segment == state.playerSegment) Color.YELLOW else Color.BLUE
94-
r.line(segment.start, segment.end)
101+
renderSegment(r, segment)
95102
}
96103

104+
r.color = Color.YELLOW
105+
renderSegment(r, state.playerSegment)
106+
97107
r.end()
98108
}
99109

110+
private fun renderSegment(shapeRenderer: ShapeRenderer, segment: Segment) {
111+
shapeRenderer.line(segment.start.x, segment.start.y, -100f, segment.end.x, segment.end.y, -100f)
112+
shapeRenderer.line(segment.start.x, segment.start.y, 0f, segment.start.x, segment.start.y, -100f)
113+
shapeRenderer.line(segment.end.x, segment.end.y, 0f, segment.end.x, segment.end.y, -100f)
114+
shapeRenderer.line(segment.start, segment.end)
115+
}
116+
100117
}

core/src/com/serwylo/retrowars/games/tetris/TetrisGameScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package com.serwylo.retrowars.games.tetris
22

33
import com.badlogic.gdx.Gdx
44
import com.badlogic.gdx.Input
5+
import com.badlogic.gdx.graphics.Camera
56
import com.badlogic.gdx.graphics.Color
6-
import com.badlogic.gdx.graphics.OrthographicCamera
77
import com.badlogic.gdx.graphics.glutils.ShapeRenderer
88
import com.badlogic.gdx.scenes.scene2d.ui.Label
99
import com.serwylo.retrowars.RetrowarsGame
@@ -314,7 +314,7 @@ class TetrisGameScreen(game: RetrowarsGame) : GameScreen(game, Games.tetris, "Fi
314314
}
315315
}
316316

317-
override fun renderGame(camera: OrthographicCamera) {
317+
override fun renderGame(camera: Camera) {
318318

319319
val numCellsHigh = state.cells.size
320320
val numCellsWide = state.cells[0].size

core/src/com/serwylo/retrowars/ui/GameViewport.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.serwylo.retrowars.ui
22

33
import com.badlogic.gdx.Gdx
44
import com.badlogic.gdx.graphics.Camera
5+
import com.badlogic.gdx.graphics.PerspectiveCamera
56
import com.badlogic.gdx.graphics.glutils.HdpiUtils
67
import com.badlogic.gdx.utils.viewport.ExtendViewport
78

@@ -33,6 +34,10 @@ class GameViewport(minWorldWidth: Float, minWorldHeight: Float, camera: Camera)
3334
}
3435

3536
fun renderIn(render: () -> Unit) {
37+
// Note: This call to apply() will not work very well with PerspectiveCamera's, because the
38+
// Z position will be forceably set to 0f which usually isn't desired. However, it is likely
39+
// better for the game to manage its own camera if it needs a PerspectiveCamera anyway.
40+
// See Tempest for an example of how this is done in the render method.
3641
apply(true)
3742
render()
3843
HdpiUtils.glViewport(0, 0, Gdx.graphics.width, Gdx.graphics.height)

0 commit comments

Comments
 (0)