From c7d09579026611d7630d3c3229d4419929631765 Mon Sep 17 00:00:00 2001 From: Stefan-5422 <32109571+Stefan-5422@users.noreply.github.com> Date: Thu, 24 Feb 2022 15:11:15 +0100 Subject: [PATCH] Added Chunk Loading and player movement code --- src/main/java/com/yes/yes/MainController.java | 9 ++ src/main/java/com/yes/yes/YesApplication.java | 6 ++ .../yes/entities/machines/TestMachine.java | 5 +- .../com/yes/yes/managers/GameManager.java | 10 ++- .../com/yes/yes/managers/PlayerManager.java | 90 +++++++++++++++++++ .../java/com/yes/yes/utils/Coordinate.java | 17 ++++ src/main/java/com/yes/yes/utils/Size.java | 28 ++++++ .../ChunkAlreadyExistsException.java | 22 +++++ target/classes/com/yes/yes/main-view.fxml | 2 +- 9 files changed, 181 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/yes/yes/utils/Size.java create mode 100644 src/main/java/com/yes/yes/utils/exceptions/ChunkAlreadyExistsException.java diff --git a/src/main/java/com/yes/yes/MainController.java b/src/main/java/com/yes/yes/MainController.java index 1650831..20548b8 100644 --- a/src/main/java/com/yes/yes/MainController.java +++ b/src/main/java/com/yes/yes/MainController.java @@ -1,6 +1,9 @@ package com.yes.yes; import com.yes.yes.managers.GameManager; +import com.yes.yes.managers.PlayerManager; +import com.yes.yes.utils.Coordinate; +import javafx.application.Platform; import javafx.fxml.FXML; import javafx.scene.layout.VBox; @@ -12,5 +15,11 @@ public class MainController { public void initialize() { GameManager gameManager = new GameManager(root); gameManager.setup(); + + Platform.runLater(() -> { + PlayerManager playerManager = new PlayerManager(gameManager.getWorld()); + playerManager.setup(); + }); + } } \ No newline at end of file diff --git a/src/main/java/com/yes/yes/YesApplication.java b/src/main/java/com/yes/yes/YesApplication.java index fdfb029..312ba77 100644 --- a/src/main/java/com/yes/yes/YesApplication.java +++ b/src/main/java/com/yes/yes/YesApplication.java @@ -2,6 +2,7 @@ package com.yes.yes; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; +import javafx.scene.transform.Scale; import javafx.stage.Stage; import java.io.IOException; @@ -13,6 +14,11 @@ public class YesApplication extends javafx.application.Application { Scene scene = new Scene(fxmlLoader.load(), 320, 240); stage.setTitle("Hello!"); stage.setScene(scene); + + //Scale scale = new Scale(0.25,0.25, 0, 0); + //scene.getRoot().getTransforms().add(scale); + + stage.setMaximized(true); stage.show(); } diff --git a/src/main/java/com/yes/yes/entities/machines/TestMachine.java b/src/main/java/com/yes/yes/entities/machines/TestMachine.java index 4ed20ec..f8e9e15 100644 --- a/src/main/java/com/yes/yes/entities/machines/TestMachine.java +++ b/src/main/java/com/yes/yes/entities/machines/TestMachine.java @@ -1,5 +1,6 @@ package com.yes.yes.entities.machines; +import com.yes.yes.utils.Coordinate; import com.yes.yes.utils.Entity; import javafx.scene.shape.Circle; @@ -7,8 +8,6 @@ public class TestMachine extends Entity { public TestMachine() { super(); - Circle shape = new Circle(25); - shape.setStyle("-fx-fill: #ff0000"); - this.getChildren().add(shape); + this.getChildren().add(new Circle(25)); } } diff --git a/src/main/java/com/yes/yes/managers/GameManager.java b/src/main/java/com/yes/yes/managers/GameManager.java index eb076f2..93fcd6a 100644 --- a/src/main/java/com/yes/yes/managers/GameManager.java +++ b/src/main/java/com/yes/yes/managers/GameManager.java @@ -7,17 +7,19 @@ import javafx.scene.layout.VBox; public class GameManager { VBox root; + World world; + + public World getWorld() { + return world; + } public GameManager(VBox root) { this.root = root; } public void setup() { - World world = new World(); + world = new World(); root.getChildren().add(world); - - world.getChunk(new Coordinate(1, 1)).setEntity(new TestMachine(), new Coordinate(1, 1)); - world.getChunk(new Coordinate(1, 1)).setEntity(new TestMachine(), new Coordinate(1, 2)); } } diff --git a/src/main/java/com/yes/yes/managers/PlayerManager.java b/src/main/java/com/yes/yes/managers/PlayerManager.java index 0a32b4a..8ea2476 100644 --- a/src/main/java/com/yes/yes/managers/PlayerManager.java +++ b/src/main/java/com/yes/yes/managers/PlayerManager.java @@ -1,4 +1,94 @@ package com.yes.yes.managers; +import com.yes.yes.utils.Coordinate; +import com.yes.yes.world.Chunk; +import com.yes.yes.world.World; +import javafx.scene.Scene; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import javafx.scene.input.KeyEvent; + public class PlayerManager { + + final KeyCombination leftKey = new KeyCodeCombination(KeyCode.A); + final KeyCombination rightKey = new KeyCodeCombination(KeyCode.D); + final KeyCombination upKey = new KeyCodeCombination(KeyCode.W); + final KeyCombination downKey = new KeyCodeCombination(KeyCode.S); + + World world; + Coordinate chunkPos = new Coordinate(0, 0); + + public PlayerManager(World world) { + this.world = world; + } + + public void setup() { + Scene scene = world.getScene(); + scene.setOnKeyPressed(this::ProcessKeyPress); + + world.setTranslateX(Integer.MAX_VALUE / -5000); + world.setTranslateY(Integer.MAX_VALUE / -5000); + } + + void ProcessKeyPress(KeyEvent key) { + if (leftKey.match(key)) { + world.setTranslateX(world.getTranslateX() + 45); + } + if (rightKey.match(key)) { + + world.setTranslateX(world.getTranslateX() - 45); + } + if (upKey.match(key)) { + world.setTranslateY(world.getTranslateY() + 45); + } + if (downKey.match(key)) { + world.setTranslateY(world.getTranslateY() - 45); + } + + double offset = +Chunk.CHUNK_SIZE * Chunk.ENTITY_SIZE; + + + System.out.println("World pos: X: " + (-world.getTranslateX() + offset) + "; Y: " + (-world.getTranslateY() + offset)); + + //NOTE: WHAT??? + + + int chunkX = -(int) Math.floor((world.getTranslateX() + offset) / Chunk.CHUNK_SIZE / Chunk.ENTITY_SIZE); + int chunkY = -(int) Math.floor((world.getTranslateY() + offset) / Chunk.CHUNK_SIZE / Chunk.ENTITY_SIZE); + System.out.println("Chunk pos: X: " + chunkX + "; Y: " + chunkY); + + if (chunkX < chunkPos.x) { + for (int i = 0; i < 6; i++) { + world.load(new Coordinate(chunkX, chunkY + i)); + world.unload(new Coordinate(chunkPos.x + 5, chunkY + i)); + } + } + + if (chunkX > chunkPos.x) { + for (int i = 0; i < 6; i++) { + world.load(new Coordinate(chunkX + 5, chunkY + i)); + world.unload(new Coordinate(chunkPos.x, chunkY + i)); + } + } + + if (chunkY > chunkPos.y) { + for (int i = 0; i < 6; i++) { + world.load(new Coordinate(chunkX + i, chunkY + 5)); + world.unload(new Coordinate(chunkX + i, chunkPos.y)); + } + } + + if (chunkY < chunkPos.y) { + for (int i = 0; i < 6; i++) { + world.load(new Coordinate(chunkX + i, chunkY)); + world.unload(new Coordinate(chunkX + i, chunkPos.y + 5)); + } + } + + + chunkPos = new Coordinate(chunkX, chunkY); + + //world.load(new Coordinate(chunkX, chunkY)); + } } diff --git a/src/main/java/com/yes/yes/utils/Coordinate.java b/src/main/java/com/yes/yes/utils/Coordinate.java index 38ae34f..270bf34 100644 --- a/src/main/java/com/yes/yes/utils/Coordinate.java +++ b/src/main/java/com/yes/yes/utils/Coordinate.java @@ -1,5 +1,7 @@ package com.yes.yes.utils; +import com.yes.yes.world.Chunk; + import java.util.Objects; public class Coordinate { @@ -14,6 +16,7 @@ public class Coordinate { public Coordinate() { } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -26,4 +29,18 @@ public class Coordinate { public int hashCode() { return Objects.hash(x, y); } + + public static Coordinate WorldToChunkCoordinate(Coordinate worldPos) { + int chunksize = Chunk.CHUNK_SIZE * Chunk.ENTITY_SIZE; + + return new Coordinate(worldPos.x / chunksize, worldPos.y / chunksize); + } + + public static Coordinate WorldToChunkBlock(Coordinate worldPos) { + int chunksize = Chunk.CHUNK_SIZE * Chunk.ENTITY_SIZE; + worldPos.x = worldPos.x % chunksize; + worldPos.y = worldPos.y % chunksize; + + return new Coordinate(worldPos.x / Chunk.ENTITY_SIZE, worldPos.y / Chunk.ENTITY_SIZE); + } } \ No newline at end of file diff --git a/src/main/java/com/yes/yes/utils/Size.java b/src/main/java/com/yes/yes/utils/Size.java new file mode 100644 index 0000000..faf8300 --- /dev/null +++ b/src/main/java/com/yes/yes/utils/Size.java @@ -0,0 +1,28 @@ +package com.yes.yes.utils; + +import java.util.Objects; + +public class Size { + public int x; + public int y; + + public Size(int x, int y) { + this.x = x; + this.y = y; + } + + public Size() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Size that)) return false; + return x == that.x && y == that.y; + } + + @Override + public int hashCode() { + return Objects.hash(x, y); + } +} diff --git a/src/main/java/com/yes/yes/utils/exceptions/ChunkAlreadyExistsException.java b/src/main/java/com/yes/yes/utils/exceptions/ChunkAlreadyExistsException.java new file mode 100644 index 0000000..5a2f67c --- /dev/null +++ b/src/main/java/com/yes/yes/utils/exceptions/ChunkAlreadyExistsException.java @@ -0,0 +1,22 @@ +package com.yes.yes.utils.exceptions; + +public class ChunkAlreadyExistsException extends Exception { + public ChunkAlreadyExistsException() { + } + + public ChunkAlreadyExistsException(String message) { + super(message); + } + + public ChunkAlreadyExistsException(String message, Throwable cause) { + super(message, cause); + } + + public ChunkAlreadyExistsException(Throwable cause) { + super(cause); + } + + public ChunkAlreadyExistsException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/target/classes/com/yes/yes/main-view.fxml b/target/classes/com/yes/yes/main-view.fxml index 943c89f..2b46388 100644 --- a/target/classes/com/yes/yes/main-view.fxml +++ b/target/classes/com/yes/yes/main-view.fxml @@ -5,6 +5,6 @@ -