summaryrefslogtreecommitdiffstats
path: root/core/src/ch/asynk/zproject/screens
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2018-09-13 11:51:01 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2018-09-13 11:51:01 +0200
commitb4fe20c457a33c78a52180d0ca07dd5ccda3789a (patch)
treec8c230cf9265d838cbee2977eefe7732bd40fe0f /core/src/ch/asynk/zproject/screens
parent53a9ce3f19632f4e68507330e4e80822e969bea7 (diff)
downloadgdx-boardgame-b4fe20c457a33c78a52180d0ca07dd5ccda3789a.zip
gdx-boardgame-b4fe20c457a33c78a52180d0ca07dd5ccda3789a.tar.gz
screens/GameCamera.java -> engine/Camera.java
Diffstat (limited to 'core/src/ch/asynk/zproject/screens')
-rw-r--r--core/src/ch/asynk/zproject/screens/GameCamera.java210
-rw-r--r--core/src/ch/asynk/zproject/screens/GameScreen.java5
2 files changed, 3 insertions, 212 deletions
diff --git a/core/src/ch/asynk/zproject/screens/GameCamera.java b/core/src/ch/asynk/zproject/screens/GameCamera.java
deleted file mode 100644
index 54b1f82..0000000
--- a/core/src/ch/asynk/zproject/screens/GameCamera.java
+++ /dev/null
@@ -1,210 +0,0 @@
-package ch.asynk.zproject.screens;
-
-import com.badlogic.gdx.graphics.glutils.HdpiUtils;
-import com.badlogic.gdx.graphics.OrthographicCamera;
-
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.math.Vector3;
-import com.badlogic.gdx.math.MathUtils;
-import com.badlogic.gdx.math.Matrix4;
-
-public class GameCamera extends OrthographicCamera
-{
- private static final float ZEROF = 0.01f;
-
- private int padding;
- private float boardWidth;
- private float boardHeight;
- private float boardAspectRatio;
- private float zoomMax;
- private float zoomMin;
- private int screenWidth;
- private int screenHeight;
- private float widthFactor;
- private float heightFactor;
- private Rectangle viewport;
-
- private Rectangle hud;
- private Matrix4 hudMatrix;
- private Matrix4 hudInvProjMatrix;
- private int hudLeft;
- private int hudBottom;
- private boolean hudInBoard;
-
- public GameCamera(int padding, float boardWidth, float boardHeight, float zoomMax, float zoomMin, boolean hudInBoard)
- {
- super(boardWidth, boardHeight);
- this.boardWidth = boardWidth;
- this.boardHeight = boardHeight;
- this.padding = padding;
- this.boardAspectRatio = (boardWidth / boardHeight);
- this.zoomMax = zoomMax;
- this.zoomMin = zoomMin;
- this.viewport = new Rectangle();
-
- this.hudInBoard = hudInBoard;
- this.hud = new Rectangle();
- this.hudMatrix = new Matrix4();
- this.hudInvProjMatrix = new Matrix4();
- }
-
- public void updateViewport(int screenWidth, int screenHeight)
- {
- this.screenWidth = screenWidth;
- this.screenHeight = screenHeight;
-
- float screenAvailableWidth = screenWidth - (2 * padding);
- float screenAvailableHeight = screenHeight - (2 * padding);
- float screenAspectRatio = (screenWidth / (float) screenHeight);
- float diff = (boardAspectRatio - screenAspectRatio);
-
- if (diff <= -ZEROF) {
- // screen wider than board : use max height, width grows up until max available on zooming
- viewport.height = screenAvailableHeight;
- viewport.width = java.lang.Math.min((screenAvailableHeight * boardAspectRatio / zoom), screenAvailableWidth);
- viewport.x = padding + ((screenAvailableWidth - viewport.width) / 2f);
- viewport.y = padding;
- // camera aspect ratio must follow viewport aspect ration
- viewportHeight = boardHeight;
- viewportWidth = (viewportHeight * (viewport.width / viewport.height));
- // hud
- hud.y = 0;
- hud.x = (hud.y * viewportWidth / viewportHeight);
- } else if (diff > ZEROF) {
- // word is wider than screen : use max width, height grows up until max available on zooming
- viewport.width = screenAvailableWidth;
- viewport.height = java.lang.Math.min((screenAvailableWidth / boardAspectRatio / zoom), screenAvailableHeight);
- viewport.y = padding + ((screenAvailableHeight - viewport.height) / 2f);
- viewport.x = padding;
- // camera aspect ratio must follow viewport aspect ration
- viewportWidth = boardWidth;
- viewportHeight = (viewportWidth * (viewport.height / viewport.width));
- // hud
- hud.x = 0;
- hud.y = (hud.x * viewportHeight / viewportWidth);
- }
-
- if (hudInBoard) {
- hud.x = 0;
- hud.y = 0;
- hud.width = screenWidth;
- hud.height = screenHeight;
- } else {
- hud.width = (viewport.width - (2 * hud.x));
- hud.height = (viewport.height - (2 * hud.y));
- }
-
- // ratio viewport -> camera
- widthFactor = (viewportWidth / viewport.width);
- heightFactor = (viewportHeight / viewport.height);
-
- clampPosition();
- update(true);
-
- hudMatrix.setToOrtho2D(hud.x, hud.y, hud.width, hud.height);
- hudInvProjMatrix.set(hudMatrix);
- Matrix4.inv(hudInvProjMatrix.val);
- }
-
- public void applyMapViewport()
- {
- HdpiUtils.glViewport((int)viewport.x, (int)viewport.y, (int)viewport.width, (int)viewport.height);
- }
-
- public void applyHudViewport()
- {
- if (hudInBoard)
- HdpiUtils.glViewport(0, 0, screenWidth, screenHeight);
- else
- applyMapViewport();
- }
-
- public void centerOnWorld()
- {
- position.set((boardWidth / 2f), (boardHeight / 2f), 0f);
- }
-
- public void zoom(float dz)
- {
- zoom += dz;
- clampZoom();
- }
-
- public void clampZoom()
- {
- zoom = MathUtils.clamp(zoom, zoomMin, zoomMax);
- }
-
- public void translate(float dx, float dy)
- {
- float deltaX = (dx * zoom * widthFactor);
- float deltaY = (dy * zoom * heightFactor);
- translate(deltaX, -deltaY, 0);
- clampPosition();
- update(true);
- }
-
- public void clampPosition()
- {
- float cameraWidth = (viewportWidth * zoom);
- float cameraHeight = (viewportHeight * zoom);
-
- // on each axis, clamp on [ cameraDim/2 ; boardDim - cameraDim/2 ]
-
- if ((boardWidth - cameraWidth) > ZEROF) {
- cameraWidth /= 2f;
- position.x = MathUtils.clamp(position.x, cameraWidth, (boardWidth - cameraWidth));
- } else {
- position.x = (boardWidth / 2f);
- }
-
- if ((boardHeight - cameraHeight) > ZEROF) {
- cameraHeight /= 2f;
- position.y = MathUtils.clamp(position.y, cameraHeight, (boardHeight - cameraHeight));
- } else {
- position.y = (boardHeight / 2f);
- }
- }
-
- public void unproject(int x, int y, Vector3 v)
- {
- unproject(v.set(x, y, 0), viewport.x, viewport.y, viewport.width, viewport.height);
- }
-
- public void unprojectHud(float x, float y, Vector3 v)
- {
- Rectangle r = (hudInBoard ? hud : viewport);
- x = x - r.x;
- y = screenHeight - y - 1;
- y = y - r.y;
- v.x = (2 * x) / r.width - 1;
- v.y = (2 * y) / r.height - 1;
- v.z = 2 * v.z - 1;
- v.prj(hudInvProjMatrix);
- }
-
- public int getScreenWidth()
- {
- return screenWidth;
- }
-
- public int getScreenHeight()
- {
- return screenHeight;
- }
-
- public Matrix4 getHudMatrix()
- {
- return hudMatrix;
- }
-
- public Rectangle getViewport()
- {
- return viewport;
- }
-
- public Rectangle getHud()
- {
- return hud;
- }
-}
diff --git a/core/src/ch/asynk/zproject/screens/GameScreen.java b/core/src/ch/asynk/zproject/screens/GameScreen.java
index 30e6b67..a784acc 100644
--- a/core/src/ch/asynk/zproject/screens/GameScreen.java
+++ b/core/src/ch/asynk/zproject/screens/GameScreen.java
@@ -17,6 +17,7 @@ import com.badlogic.gdx.math.Vector3;
import ch.asynk.zproject.ZProject;
import ch.asynk.zproject.GameHud;
import ch.asynk.zproject.GameBoard;
+import ch.asynk.zproject.engine.Camera;
public class GameScreen implements Screen
{
@@ -29,7 +30,7 @@ public class GameScreen implements Screen
private final ZProject zproject;
private final GameHud hud;
private final GameBoard board;
- private final GameCamera camera;
+ private final Camera camera;
private final SpriteBatch batch;
private ShapeRenderer debugShapes = null;
@@ -47,7 +48,7 @@ public class GameScreen implements Screen
this.hud = new GameHud(zproject.assets);
this.board = new GameBoard(zproject.assets);
this.batch = new SpriteBatch();
- this.camera = new GameCamera(10, board.getWidth(), board.getHeight(), 1.0f, 0.3f, false);
+ this.camera = new Camera(10, board.getWidth(), board.getHeight(), 1.0f, 0.3f, false);
Gdx.input.setInputProcessor(getMultiplexer(this));
this.paused = false;
this.inputDelay = 0f;