From 13c0a66af0f2feff12257303579a7fb42b1a1d5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Sat, 3 Apr 2021 17:55:54 +0200 Subject: [PATCH] Create CameraController interface and following camera implementation --- .../base/lib/camera/CameraController.java | 5 ++ .../lib/camera/FollowingCameraController.java | 50 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 api/src/main/java/com/bartlomiejpluta/base/lib/camera/CameraController.java create mode 100644 api/src/main/java/com/bartlomiejpluta/base/lib/camera/FollowingCameraController.java diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/camera/CameraController.java b/api/src/main/java/com/bartlomiejpluta/base/lib/camera/CameraController.java new file mode 100644 index 00000000..0d5b1402 --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/camera/CameraController.java @@ -0,0 +1,5 @@ +package com.bartlomiejpluta.base.lib.camera; + +public interface CameraController { + void update(); +} diff --git a/api/src/main/java/com/bartlomiejpluta/base/lib/camera/FollowingCameraController.java b/api/src/main/java/com/bartlomiejpluta/base/lib/camera/FollowingCameraController.java new file mode 100644 index 00000000..bde6682f --- /dev/null +++ b/api/src/main/java/com/bartlomiejpluta/base/lib/camera/FollowingCameraController.java @@ -0,0 +1,50 @@ +package com.bartlomiejpluta.base.lib.camera; + +import com.bartlomiejpluta.base.api.camera.Camera; +import com.bartlomiejpluta.base.api.map.model.GameMap; +import com.bartlomiejpluta.base.api.screen.Screen; +import lombok.NonNull; +import org.joml.Vector2fc; + +public class FollowingCameraController implements CameraController { + private final Vector2fc screenSize; + private final Vector2fc mapSize; + private final Camera camera; + + private Vector2fc target; + + private FollowingCameraController(@NonNull Screen screen, @NonNull Camera camera, @NonNull GameMap map) { + this.screenSize = screen.getSize(); + this.camera = camera; + this.mapSize = map.getSize(); + } + + public FollowingCameraController follow(@NonNull Vector2fc target) { + this.target = target; + return this; + } + + public FollowingCameraController stop() { + this.target = null; + return this; + } + + @Override + public void update() { + if (target != null) { + final var bottomRightConstraintX = mapSize.x() - screenSize.x() / camera.getScaleX(); + final var bottomRightConstraintY = mapSize.y() - screenSize.y() / camera.getScaleY(); + final var newCameraPosX = target.x() - screenSize.x() / (2f * camera.getScaleX()); + final var newCameraPosY = target.y() - screenSize.y() / (2f * camera.getScaleY()); + + camera.setPosition( + (newCameraPosX < bottomRightConstraintX) ? (newCameraPosX > 0 ? newCameraPosX : 0) : bottomRightConstraintX, + (newCameraPosY < bottomRightConstraintY) ? (newCameraPosY > 0 ? newCameraPosY : 0) : bottomRightConstraintY + ); + } + } + + public static FollowingCameraController on(Screen screen, Camera camera, GameMap map) { + return new FollowingCameraController(screen, camera, map); + } +}