From 93b2788c5851a584f777813dde6db2d07f11c047 Mon Sep 17 00:00:00 2001 From: Ivory Date: Wed, 1 Feb 2023 18:16:58 -0500 Subject: [PATCH] camera clamping --- src/main/java/xyz/valnet/engine/math/Vector2f.java | 6 ++++++ .../java/xyz/valnet/hadean/gameobjects/Camera.java | 10 ++++++++++ .../java/xyz/valnet/hadean/gameobjects/Terrain.java | 2 ++ 3 files changed, 18 insertions(+) diff --git a/src/main/java/xyz/valnet/engine/math/Vector2f.java b/src/main/java/xyz/valnet/engine/math/Vector2f.java index a7a3565..daf4e27 100644 --- a/src/main/java/xyz/valnet/engine/math/Vector2f.java +++ b/src/main/java/xyz/valnet/engine/math/Vector2f.java @@ -51,4 +51,10 @@ public class Vector2f implements Serializable { public String toString() { return "<" + x + ", " + y + ">"; } + + public Vector2f clamp(Box box) { + float x = Math.min(Math.max(this.x, box.x), box.x2); + float y = Math.min(Math.max(this.y, box.y), box.y2); + return new Vector2f(x, y); + } } diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java index 615dbde..ffbc2a5 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Camera.java @@ -31,6 +31,8 @@ public class Camera extends GameObject implements ITransient, IMouseCaptureArea private float minY, maxY; + private Box focusBounds = null; + @Override public void start() { IWorldBoundsAdapter worldBoundsAdapter = get(IWorldBoundsAdapter.class); @@ -39,6 +41,10 @@ public class Camera extends GameObject implements ITransient, IMouseCaptureArea maxY = bounds.w; } + public void setFocusBounds(Box box) { + this.focusBounds = box; + } + public Vector2f getWorldMouse() { return screen2world(App.mouseX, App.mouseY); } @@ -67,6 +73,10 @@ public class Camera extends GameObject implements ITransient, IMouseCaptureArea Vector2f dragDifference = screen2world(App.mouseX, App.mouseY).subtract(focus); focus = dragOrigin.subtract(dragDifference); } + + if(focusBounds != null) { + focus = focus.clamp(focusBounds); + } } public void focus(float x, float y) { diff --git a/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java b/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java index 236bd62..2cd8e63 100644 --- a/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java +++ b/src/main/java/xyz/valnet/hadean/gameobjects/Terrain.java @@ -1,5 +1,6 @@ package xyz.valnet.hadean.gameobjects; +import xyz.valnet.engine.math.Box; import xyz.valnet.engine.math.FastNoiseLite; import xyz.valnet.engine.math.Vector2i; import xyz.valnet.engine.math.Vector4f; @@ -42,6 +43,7 @@ public class Terrain extends GameObject implements IPathable, IWorldBoundsAdapte @Override protected void start() { camera.focus(WORLD_SIZE / 2, WORLD_SIZE / 2); + camera.setFocusBounds(new Box(0, 0, WORLD_SIZE, WORLD_SIZE)); } public Tile getTile(int x, int y) {