From f909673518902dfee75ffeb5fd1bbabce9e01366 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Mon, 11 Apr 2022 20:15:02 +0200 Subject: [PATCH 01/32] chore: Massive update... --- src/main/java/io/rpg/HelloApplication.java | 80 +++++++++++-------- src/main/java/io/rpg/Initializer.java | 50 ++++++++++++ src/main/java/io/rpg/World.java | 38 +++++++++ src/main/java/io/rpg/config/ConfigLoader.java | 5 +- src/main/java/io/rpg/controller/.gitkeep | 0 .../io/rpg/controller/LocationController.java | 24 ++++++ src/main/java/io/rpg/gui/DisplayLayer.java | 2 +- .../java/io/rpg/gui/LocationController.java | 4 +- .../java/io/rpg/gui/model/LocationModel.java | 15 ++-- .../java/io/rpg/model/GameWorldConfig.java | 21 ++++- .../java/io/rpg/model/location/Location.java | 7 -- .../io/rpg/model/location/LocationModel.java | 14 ++++ .../java/io/rpg/model/object/GameObject.java | 15 +++- .../io/rpg/model/object/GameObjectConfig.java | 6 ++ .../model/object/InteractiveGameObject.java | 2 +- src/main/java/io/rpg/view/LocationView.java | 16 ++++ .../java/io/rpg/config/ConfigLoaderTest.java | 5 -- 17 files changed, 247 insertions(+), 57 deletions(-) create mode 100644 src/main/java/io/rpg/Initializer.java create mode 100644 src/main/java/io/rpg/World.java delete mode 100644 src/main/java/io/rpg/controller/.gitkeep create mode 100644 src/main/java/io/rpg/controller/LocationController.java delete mode 100644 src/main/java/io/rpg/model/location/Location.java create mode 100644 src/main/java/io/rpg/model/location/LocationModel.java create mode 100644 src/main/java/io/rpg/view/LocationView.java diff --git a/src/main/java/io/rpg/HelloApplication.java b/src/main/java/io/rpg/HelloApplication.java index 4499fbe6..1e2d4d14 100644 --- a/src/main/java/io/rpg/HelloApplication.java +++ b/src/main/java/io/rpg/HelloApplication.java @@ -7,6 +7,7 @@ import io.rpg.gui.model.LocationModel; import io.rpg.model.*; import io.rpg.model.GameObject; +import io.rpg.Initializer; import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.application.Platform; @@ -26,41 +27,52 @@ public class HelloApplication extends Application { @Override public void start(Stage stage) throws IOException { - Image someMap = new Image("file:assets/map.png"); - Image someMap10x10 = new Image("file:assets/map10x10.png"); - Image someDude1 = new Image("file:assets/someDude.png"); - Image someDude2 = new Image("file:assets/someDudeButGreen.png"); - Image player = new Image("file:assets/stone.png"); - Game game=new Game(); - DisplayLayer displayLayer = new DisplayLayer(stage); - LocationModel locationModel=displayLayer.showLocation(); - LocationController locationController=displayLayer.getLocationController(); - locationController.setGame(game); - try{ - game.addGameObject(new GameObject(new Vector(0,0), someDude1)); - game.addGameObject(new GameObject(new Vector(0,5), someDude2)); - game.addGameObject(new GameObject(new Vector(5,5), someDude2)); - game.addGameObject(new Player(new Vector(7,7), player)); -// locationModel=displayLayer.showLocation(); - locationModel.setBackgroundImage(someMap); - locationModel.setGame(game); - }catch(Exception e){ - e.printStackTrace(); - } - AnimationTimer animationTimer=new AnimationTimer() { - long lastUpdate=-1; - @Override - public void handle(long now) { - if(lastUpdate!=-1){ - float difference=(now-lastUpdate)/1e6f; - game.update(difference); - locationModel.update(difference); - } - lastUpdate=now; - } + Initializer worldInitializer = new Initializer("../configurations"); + World world = worldInitializer.getWorld(); - }; - animationTimer.start(); + stage.setScene(world.getWorldView()); + stage.show(); + +// Image someMap = new Image("file:assets/map.png"); +// Image someMap10x10 = new Image("file:assets/map10x10.png"); +// Image someDude1 = new Image("file:assets/someDude.png"); +// Image someDude2 = new Image("file:assets/someDudeButGreen.png"); +// Image player = new Image("file:assets/stone.png"); +// Game game=new Game(); +// DisplayLayer displayLayer = new DisplayLayer(stage); +// LocationModel locationModel=displayLayer.showLocation(); +// LocationController locationController=displayLayer.getLocationController(); +// locationController.setGame(game); +// try{ +// game.addGameObject(new GameObject(new Vector(0,0), someDude1)); +// game.addGameObject(new GameObject(new Vector(0,5), someDude2)); +// game.addGameObject(new GameObject(new Vector(5,5), someDude2)); +// game.addGameObject(new Player(new Vector(7,7), player)); +//// locationModel=displayLayer.showLocation(); +// locationModel.setBackgroundImage(someMap); +// locationModel.setGame(game); +// }catch(Exception e){ +// e.printStackTrace(); +// } +// AnimationTimer animationTimer=new AnimationTimer() { +// long lastUpdate=-1; +// @Override +// public void handle(long now) { +// if(lastUpdate!=-1){ +// float difference=(now-lastUpdate)/1e6f; +// game.update(difference); +// locationModel.update(difference); +// } +// lastUpdate=now; +// } +// +// }; +// +// animationTimer.start(); + } + + public static void main(String[] args) { + launch(args); } } diff --git a/src/main/java/io/rpg/Initializer.java b/src/main/java/io/rpg/Initializer.java new file mode 100644 index 00000000..2c65205f --- /dev/null +++ b/src/main/java/io/rpg/Initializer.java @@ -0,0 +1,50 @@ +package io.rpg; + +import io.rpg.config.ConfigLoader; +import io.rpg.controller.LocationController; +import io.rpg.model.GameWorldConfig; +import io.rpg.model.location.LocationConfig; +import io.rpg.model.location.LocationModel; +import io.rpg.view.LocationView; +import org.jetbrains.annotations.NotNull; + +import javax.xml.stream.Location; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map; + +public class Initializer { + private Path pathToConfigDir; + private ConfigLoader configLoader; + + public Initializer(@NotNull String pathToConfigDir) { + configLoader = new ConfigLoader(pathToConfigDir); + } + + + public World getWorld() { + GameWorldConfig worldConfig = configLoader.load(); + + LinkedHashMap locationConfigLinkedHashMap = worldConfig.getTagToLocationConfigMap(); + + // todo: apply builder pattern + World world = new World(); + + for (Map.Entry entry : locationConfigLinkedHashMap.entrySet()) { + LocationModel model = LocationModel.fromConfig(entry.getValue()); + LocationController controller = LocationController.fromConfig(entry.getValue()); + LocationView view = LocationView.fromConfig(entry.getValue()); + + controller.setModel(model); + controller.setView(view);; + + + world.addLocationController(controller); + + if (controller.isRoot()) { + world.setCurrentLocationController(controller); + } + } + } +} diff --git a/src/main/java/io/rpg/World.java b/src/main/java/io/rpg/World.java new file mode 100644 index 00000000..9381e4eb --- /dev/null +++ b/src/main/java/io/rpg/World.java @@ -0,0 +1,38 @@ +package io.rpg; + +import io.rpg.controller.LocationController; +import io.rpg.gui.model.LocationModel; +import io.rpg.view.LocationView; +import javafx.scene.Scene; + +import java.util.LinkedHashMap; +import java.util.List; + +public class World { + // mapa tag lokacji na lokację + private LinkedHashMap locationTagToModelMap; + private LocationController currentLocationController; + + + + public World() { + + } + + public void addLocationController(LocationController controller) { + locationControllers.add(controller); + } + + public void setLocationControllerForLocationTag(String tag) { + // tutaj przyda sie hashmapa: nazwa lokacji -> kontroller + } + + + public LocationView getWorldView() { + return currentLocationController.getView(); + } + + public void setCurrentLocationController(LocationController currentLocationController) { + this.currentLocationController = currentLocationController; + } +} diff --git a/src/main/java/io/rpg/config/ConfigLoader.java b/src/main/java/io/rpg/config/ConfigLoader.java index a00de6fa..f4c9687d 100644 --- a/src/main/java/io/rpg/config/ConfigLoader.java +++ b/src/main/java/io/rpg/config/ConfigLoader.java @@ -61,7 +61,7 @@ public ConfigLoader(@NotNull String configDirPath) { validate(); } - public void load() { + public GameWorldConfig load() { logger.info("Load"); GameWorldConfig config; @@ -86,6 +86,8 @@ public void load() { // todo: this should be called in loadLocationConfig method? // locationConfig.validate(); + config.addLocationConfigForTag(locationTag, locationConfig); + logger.info("Location config loaded for tag: " + locationTag); logger.info(locationConfig.toString()); @@ -113,6 +115,7 @@ public void load() { e.printStackTrace(); } } + return config; } @NotNull diff --git a/src/main/java/io/rpg/controller/.gitkeep b/src/main/java/io/rpg/controller/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/io/rpg/controller/LocationController.java b/src/main/java/io/rpg/controller/LocationController.java new file mode 100644 index 00000000..539b46fb --- /dev/null +++ b/src/main/java/io/rpg/controller/LocationController.java @@ -0,0 +1,24 @@ +package io.rpg.controller; + +import io.rpg.model.location.LocationConfig; + +public class LocationController { + private LocationView view; + private LocationModel model; + + public LocationController() { + // + } + + public void setModel(LocationModel model) { + // + } + + public void setView(LocationView view) { + // + } + + public static LocationController fromConfig(LocationConfig config) { + return null; + } +} diff --git a/src/main/java/io/rpg/gui/DisplayLayer.java b/src/main/java/io/rpg/gui/DisplayLayer.java index c7187cb1..1734630e 100644 --- a/src/main/java/io/rpg/gui/DisplayLayer.java +++ b/src/main/java/io/rpg/gui/DisplayLayer.java @@ -20,7 +20,7 @@ public DisplayLayer(Stage mainStage) throws IOException { } - public LocationModel showLocation(){ + public LocationModel showLocation() { // maybe initialize the scene only once mainStage.setScene(locationController.getScene()); return locationController.getModel().clear(); diff --git a/src/main/java/io/rpg/gui/LocationController.java b/src/main/java/io/rpg/gui/LocationController.java index f9fe0ed6..3c0a7e89 100644 --- a/src/main/java/io/rpg/gui/LocationController.java +++ b/src/main/java/io/rpg/gui/LocationController.java @@ -4,6 +4,7 @@ import io.rpg.gui.popups.PointsEarnedPopup; import io.rpg.model.Game; import io.rpg.model.Vector; +import io.rpg.view.LocationView; import javafx.event.Event; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; @@ -59,7 +60,7 @@ public void initialize(URL location, ResourceBundle resources) { model = new LocationModel(mapImageView.imageProperty(), foregroundPane.getChildren(), this); scene = new Scene(parent); - scene.addEventFilter(KeyEvent.KEY_TYPED, this::onKeyTyped); + scene.addEventFilter(KeyEvent.KEY_TYPED, this::onKeyTyped; scene.addEventFilter(KeyEvent.KEY_PRESSED, this::onKeyPressed); scene.addEventFilter(KeyEvent.KEY_RELEASED, this::onKeyReleased); } @@ -133,4 +134,5 @@ public LocationModel getModel(){ public Scene getScene() { return scene; } + } diff --git a/src/main/java/io/rpg/gui/model/LocationModel.java b/src/main/java/io/rpg/gui/model/LocationModel.java index aa0f05b5..f94b8c83 100644 --- a/src/main/java/io/rpg/gui/model/LocationModel.java +++ b/src/main/java/io/rpg/gui/model/LocationModel.java @@ -3,7 +3,8 @@ import io.rpg.gui.LocationController; import io.rpg.model.GameObjectStandIn; import io.rpg.model.*; -import io.rpg.model.GameObject; +import io.rpg.model.object.GameObject; +import io.rpg.model.object.InteractiveGameObject; import javafx.beans.property.ObjectProperty; import javafx.collections.ObservableList; import javafx.scene.Node; @@ -39,12 +40,12 @@ public LocationModel clear() { return this; } - public LocationModel setBackgroundImage(Image backgroundImage){ + public LocationModel setBackgroundImage(Image backgroundImage) { background.setValue(backgroundImage); return this; } - public LocationModel addMapObject(GameObject gameObject){ + public LocationModel addMapObject(GameObject gameObject) { ImageView imageView = new ImageView(gameObject.getImage()); // gameObject Vector mapPosition = getMapPosition(gameObject.getPosition()); @@ -58,13 +59,17 @@ public LocationModel addMapObject(GameObject gameObject){ return this; } - private void onGameObjectAction(GameObject source){ + private void onGameObjectAction(GameObject source) { // TODO: 01.04.2022 What to do when some GameObject was clicked System.out.println(source); + if (source instanceof InteractiveGameObject) { + ((InteractiveGameObject) source).onAction(); + + } } // TODO: 01.04.2022 Replace with Position - private Vector getMapPosition(Vector position){ + private Vector getMapPosition(Vector position) { // size of one tile return new Vector(position.x * SCALE, position.y * SCALE); // return new Pair<>(position.x * scale, position.y * scale); diff --git a/src/main/java/io/rpg/model/GameWorldConfig.java b/src/main/java/io/rpg/model/GameWorldConfig.java index 53eade11..431bf3c0 100644 --- a/src/main/java/io/rpg/model/GameWorldConfig.java +++ b/src/main/java/io/rpg/model/GameWorldConfig.java @@ -1,16 +1,27 @@ package io.rpg.model; +import io.rpg.model.location.LocationConfig; + import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; public class GameWorldConfig { private String tag; private ArrayList locations; + private ArrayList locationConfigs; + + private LinkedHashMap tagToLocationConfigMap; + // This class is not meant to be instantiated // by hand. Only Gson should be able to do so - private GameWorldConfig() {} + private GameWorldConfig() { + tagToLocationConfigMap = new LinkedHashMap<>(); + } + public String getTag() { return tag; @@ -20,6 +31,10 @@ public List getLocations() { return locations; } + public LinkedHashMap getTagToLocationConfigMap() { + return tagToLocationConfigMap; + } + @Override public String toString() { StringBuilder builder = new StringBuilder(); @@ -29,4 +44,8 @@ public String toString() { }); return builder.append("}\n").toString(); } + + public void addLocationConfigForTag(String locationTag, LocationConfig locationConfig) { + tagToLocationConfigMap.put(locationTag, locationConfig); + } } diff --git a/src/main/java/io/rpg/model/location/Location.java b/src/main/java/io/rpg/model/location/Location.java deleted file mode 100644 index bea5b5aa..00000000 --- a/src/main/java/io/rpg/model/location/Location.java +++ /dev/null @@ -1,7 +0,0 @@ -package io.rpg.model.location; - -/** - * Represents single location in our game - */ -public class Location { -} diff --git a/src/main/java/io/rpg/model/location/LocationModel.java b/src/main/java/io/rpg/model/location/LocationModel.java new file mode 100644 index 00000000..1e69a92a --- /dev/null +++ b/src/main/java/io/rpg/model/location/LocationModel.java @@ -0,0 +1,14 @@ +package io.rpg.model.location; + +/** + * Represents single location in our game + */ +public class LocationModel { + + + public static LocationModel fromConfig(LocationConfig config) { + return null; + } + + +} diff --git a/src/main/java/io/rpg/model/object/GameObject.java b/src/main/java/io/rpg/model/object/GameObject.java index ad6350da..3ec2fead 100644 --- a/src/main/java/io/rpg/model/object/GameObject.java +++ b/src/main/java/io/rpg/model/object/GameObject.java @@ -20,6 +20,17 @@ public class GameObject { @NotNull private final String tag; + /** + * + */ + @NotNull + private String assetPath; + + @NotNull + public String getAssetPath() { + return assetPath; + } + /** * Unique identifier of this game object */ @@ -36,12 +47,14 @@ public Position getPosition() { return position; } + public void validate() { // nothing to validate for now } - public GameObject(@NotNull String tag, @NotNull Position position) { + public GameObject(@NotNull String tag, @NotNull Position position, @NotNull String assetPath) { this.tag = tag; this.position = position; + this.assetPath = assetPath; } } diff --git a/src/main/java/io/rpg/model/object/GameObjectConfig.java b/src/main/java/io/rpg/model/object/GameObjectConfig.java index ea0de3e6..4c572b2d 100644 --- a/src/main/java/io/rpg/model/object/GameObjectConfig.java +++ b/src/main/java/io/rpg/model/object/GameObjectConfig.java @@ -6,10 +6,16 @@ public class GameObjectConfig extends GameObject { private String type; + + public GameObjectConfig(@NotNull String tag, @NotNull Position position) { super(tag, position); } + public String getType() { + return type; + } + @Override public void validate() { super.validate(); diff --git a/src/main/java/io/rpg/model/object/InteractiveGameObject.java b/src/main/java/io/rpg/model/object/InteractiveGameObject.java index 8e73699a..83d9db3e 100644 --- a/src/main/java/io/rpg/model/object/InteractiveGameObject.java +++ b/src/main/java/io/rpg/model/object/InteractiveGameObject.java @@ -5,7 +5,7 @@ abstract public class InteractiveGameObject extends GameObject { public InteractiveGameObject(@NotNull String tag, @NotNull Position position) { - super(tag, position); + super(tag, position, assetPath); } abstract public void onAction(); diff --git a/src/main/java/io/rpg/view/LocationView.java b/src/main/java/io/rpg/view/LocationView.java new file mode 100644 index 00000000..106ed101 --- /dev/null +++ b/src/main/java/io/rpg/view/LocationView.java @@ -0,0 +1,16 @@ +package io.rpg.view; + +import io.rpg.model.location.LocationConfig; +import javafx.scene.Parent; +import javafx.scene.Scene; + +public class LocationView extends Scene { + + public LocationView(Parent root) { + super(root); + } + + public static LocationView fromConfig(LocationConfig config) { + return null; + } +} diff --git a/src/test/java/io/rpg/config/ConfigLoaderTest.java b/src/test/java/io/rpg/config/ConfigLoaderTest.java index 228a26bf..a459488a 100644 --- a/src/test/java/io/rpg/config/ConfigLoaderTest.java +++ b/src/test/java/io/rpg/config/ConfigLoaderTest.java @@ -2,11 +2,6 @@ import io.rpg.model.GameWorldConfig; -import io.rpg.model.data.Position; -import io.rpg.model.location.Location; -import io.rpg.model.location.LocationConfig; -import io.rpg.model.object.GameObject; -import io.rpg.model.object.GameObjectConfig; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; From 97168b4469eee9d0b8120e04aee7d1a5c2e7942b Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Tue, 12 Apr 2022 20:43:57 +0200 Subject: [PATCH 02/32] BREAKING CHANGES: Arch proposal --- build.gradle | 2 +- .../locations/location-1/location-1.json | 3 +- .../locations/location-2/location-2.json | 7 +- .../location-2/objects/object-1.json | 5 + .../location-2/objects/object-3.json | 5 + src/main/java/io/rpg/Game.java | 24 +++ src/main/java/io/rpg/HelloApplication.java | 78 ---------- src/main/java/io/rpg/HelloController.java | 14 -- src/main/java/io/rpg/Initializer.java | 90 +++++++++--- src/main/java/io/rpg/Main.java | 27 ++++ src/main/java/io/rpg/World.java | 38 ----- src/main/java/io/rpg/config/ConfigLoader.java | 8 +- .../model}/GameObjectConfig.java | 5 +- .../{ => config}/model/GameWorldConfig.java | 20 +-- .../model}/LocationConfig.java | 17 ++- .../java/io/rpg/controller/Controller.java | 75 ++++++++++ .../io/rpg/controller/LocationController.java | 24 --- src/main/java/io/rpg/gui/DisplayLayer.java | 32 ---- .../java/io/rpg/gui/LocationController.java | 138 ------------------ .../java/io/rpg/gui/model/LocationModel.java | 91 ------------ .../java/io/rpg/model/GameObjectStandIn.java | 26 ---- src/main/java/io/rpg/model/GameWorld.java | 4 - .../java/io/rpg/model/{ => data}/Vector.java | 2 +- .../io/rpg/model/location/LocationModel.java | 22 ++- src/main/java/io/rpg/model/metadata/.gitkeep | 0 .../java/io/rpg/model/object/GameObject.java | 11 ++ .../java/io/rpg/model/object/GameObjects.java | 1 + .../model/object/InteractiveGameObject.java | 2 +- .../java/io/rpg/model/{ => object}/Item.java | 4 +- .../io/rpg/model/{ => object}/Player.java | 7 +- .../rpg/{model => torefract}/GameObject.java | 7 +- .../GameToRefract.java} | 8 +- src/main/java/io/rpg/view/.gitkeep | 0 src/main/java/io/rpg/view/GameObjectView.java | 42 ++++++ src/main/java/io/rpg/view/IObservable.java | 7 + .../java/io/rpg/view/IOnClickedListener.java | 5 + .../io/rpg/view/IOnKeyPressedListener.java | 8 + src/main/java/io/rpg/view/LocationView.java | 86 ++++++++++- .../popups/PointsEarnedPopup.java | 3 +- .../io/rpg/viewmodel/LocationViewModel.java | 45 ++++++ .../PointsPopupController.java | 8 +- src/main/java/module-info.java | 9 +- src/main/resources/io/rpg/hello-view.fxml | 16 -- .../rpg/{gui => viewmodel}/location-view.fxml | 2 +- .../points-earned-view.fxml | 2 +- .../java/io/rpg/config/ConfigLoaderTest.java | 2 +- 46 files changed, 493 insertions(+), 539 deletions(-) create mode 100644 src/main/java/io/rpg/Game.java delete mode 100644 src/main/java/io/rpg/HelloApplication.java delete mode 100644 src/main/java/io/rpg/HelloController.java create mode 100644 src/main/java/io/rpg/Main.java delete mode 100644 src/main/java/io/rpg/World.java rename src/main/java/io/rpg/{model/object => config/model}/GameObjectConfig.java (82%) rename src/main/java/io/rpg/{ => config}/model/GameWorldConfig.java (60%) rename src/main/java/io/rpg/{model/location => config/model}/LocationConfig.java (76%) create mode 100644 src/main/java/io/rpg/controller/Controller.java delete mode 100644 src/main/java/io/rpg/controller/LocationController.java delete mode 100644 src/main/java/io/rpg/gui/DisplayLayer.java delete mode 100644 src/main/java/io/rpg/gui/LocationController.java delete mode 100644 src/main/java/io/rpg/gui/model/LocationModel.java delete mode 100644 src/main/java/io/rpg/model/GameObjectStandIn.java delete mode 100644 src/main/java/io/rpg/model/GameWorld.java rename src/main/java/io/rpg/model/{ => data}/Vector.java (85%) delete mode 100644 src/main/java/io/rpg/model/metadata/.gitkeep rename src/main/java/io/rpg/model/{ => object}/Item.java (90%) rename src/main/java/io/rpg/model/{ => object}/Player.java (91%) rename src/main/java/io/rpg/{model => torefract}/GameObject.java (84%) rename src/main/java/io/rpg/{model/Game.java => torefract/GameToRefract.java} (86%) delete mode 100644 src/main/java/io/rpg/view/.gitkeep create mode 100644 src/main/java/io/rpg/view/GameObjectView.java create mode 100644 src/main/java/io/rpg/view/IObservable.java create mode 100644 src/main/java/io/rpg/view/IOnClickedListener.java create mode 100644 src/main/java/io/rpg/view/IOnKeyPressedListener.java rename src/main/java/io/rpg/{gui => view}/popups/PointsEarnedPopup.java (96%) create mode 100644 src/main/java/io/rpg/viewmodel/LocationViewModel.java rename src/main/java/io/rpg/{gui/popups => viewmodel}/PointsPopupController.java (83%) delete mode 100644 src/main/resources/io/rpg/hello-view.fxml rename src/main/resources/io/rpg/{gui => viewmodel}/location-view.fxml (88%) rename src/main/resources/io/rpg/{gui/popups => viewmodel}/points-earned-view.fxml (88%) diff --git a/build.gradle b/build.gradle index 94236a0a..5041e5dd 100644 --- a/build.gradle +++ b/build.gradle @@ -25,7 +25,7 @@ tasks.withType(JavaCompile) { application { mainModule = 'io.rpg' - mainClass = 'io.rpg.HelloApplication' + mainClass = 'io.rpg.Main' } javafx { diff --git a/configurations/config-1/locations/location-1/location-1.json b/configurations/config-1/locations/location-1/location-1.json index 2b451703..3daad00e 100644 --- a/configurations/config-1/locations/location-1/location-1.json +++ b/configurations/config-1/locations/location-1/location-1.json @@ -3,5 +3,6 @@ "objects": [ { "tag": "object-1", "position": { "row": 0, "col": 5 }, "type": "collectible" }, { "tag": "object-2", "position": { "row": 1, "col": 3 }, "type": "interactive" } - ] + ], + "backgroundPath": "file:assets/map.png" } \ No newline at end of file diff --git a/configurations/config-1/locations/location-2/location-2.json b/configurations/config-1/locations/location-2/location-2.json index 7153494b..179f6ef8 100644 --- a/configurations/config-1/locations/location-2/location-2.json +++ b/configurations/config-1/locations/location-2/location-2.json @@ -1,7 +1,8 @@ { "tag": "location-2", "objects": [ - { "tag": "object-1", "position": { "row": 0, "col": 0 } }, - { "tag": "object-3", "position": { "row": 0, "col": 1 } } - ] + { "tag": "object-1", "position": { "row": 0, "col": 0 }, "type": "collectible" }, + { "tag": "object-3", "position": { "row": 0, "col": 1 }, "type": "navigable" } + ], + "backgroundPath": "file:assets/map.png" } \ No newline at end of file diff --git a/configurations/config-1/locations/location-2/objects/object-1.json b/configurations/config-1/locations/location-2/objects/object-1.json index e69de29b..6f2ed3ae 100644 --- a/configurations/config-1/locations/location-2/objects/object-1.json +++ b/configurations/config-1/locations/location-2/objects/object-1.json @@ -0,0 +1,5 @@ +{ + "tag": "object-1", + "assetPath": "/path/to/the/asset", + "type": "" +} \ No newline at end of file diff --git a/configurations/config-1/locations/location-2/objects/object-3.json b/configurations/config-1/locations/location-2/objects/object-3.json index e69de29b..791023ce 100644 --- a/configurations/config-1/locations/location-2/objects/object-3.json +++ b/configurations/config-1/locations/location-2/objects/object-3.json @@ -0,0 +1,5 @@ +{ + "tag": "object-3", + "assetPath": "/path/to/the/asset", + "type": "" +} \ No newline at end of file diff --git a/src/main/java/io/rpg/Game.java b/src/main/java/io/rpg/Game.java new file mode 100644 index 00000000..8cec3c32 --- /dev/null +++ b/src/main/java/io/rpg/Game.java @@ -0,0 +1,24 @@ +package io.rpg; + +import io.rpg.controller.Controller; +import javafx.scene.Scene; + +public class Game { + private Controller controller; + + public Game() { + + } + + public void setLocationControllerForLocationTag(String tag) { + // tutaj przyda sie hashmapa: nazwa lokacji -> kontroller + } + + public Scene getWorldView() { + return controller.getView(); + } + + public void setController(Controller controller) { + this.controller = controller; + } +} diff --git a/src/main/java/io/rpg/HelloApplication.java b/src/main/java/io/rpg/HelloApplication.java deleted file mode 100644 index 1e2d4d14..00000000 --- a/src/main/java/io/rpg/HelloApplication.java +++ /dev/null @@ -1,78 +0,0 @@ -package io.rpg; - -import io.rpg.config.ConfigLoader; -import io.rpg.gui.DisplayLayer; -import io.rpg.model.GameObjectStandIn; -import io.rpg.gui.LocationController; -import io.rpg.gui.model.LocationModel; -import io.rpg.model.*; -import io.rpg.model.GameObject; -import io.rpg.Initializer; -import javafx.animation.AnimationTimer; -import javafx.application.Application; -import javafx.application.Platform; -import javafx.fxml.FXMLLoader; -import javafx.scene.Scene; -import javafx.scene.image.Image; -import javafx.stage.Stage; -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.core.config.Configurator; -import javafx.util.Pair; - -import java.io.IOException; -import java.net.URL; - -public class HelloApplication extends Application { - @Override - public void start(Stage stage) throws IOException { - Initializer worldInitializer = new Initializer("../configurations"); - World world = worldInitializer.getWorld(); - - - stage.setScene(world.getWorldView()); - stage.show(); - -// Image someMap = new Image("file:assets/map.png"); -// Image someMap10x10 = new Image("file:assets/map10x10.png"); -// Image someDude1 = new Image("file:assets/someDude.png"); -// Image someDude2 = new Image("file:assets/someDudeButGreen.png"); -// Image player = new Image("file:assets/stone.png"); -// Game game=new Game(); -// DisplayLayer displayLayer = new DisplayLayer(stage); -// LocationModel locationModel=displayLayer.showLocation(); -// LocationController locationController=displayLayer.getLocationController(); -// locationController.setGame(game); -// try{ -// game.addGameObject(new GameObject(new Vector(0,0), someDude1)); -// game.addGameObject(new GameObject(new Vector(0,5), someDude2)); -// game.addGameObject(new GameObject(new Vector(5,5), someDude2)); -// game.addGameObject(new Player(new Vector(7,7), player)); -//// locationModel=displayLayer.showLocation(); -// locationModel.setBackgroundImage(someMap); -// locationModel.setGame(game); -// }catch(Exception e){ -// e.printStackTrace(); -// } -// AnimationTimer animationTimer=new AnimationTimer() { -// long lastUpdate=-1; -// @Override -// public void handle(long now) { -// if(lastUpdate!=-1){ -// float difference=(now-lastUpdate)/1e6f; -// game.update(difference); -// locationModel.update(difference); -// } -// lastUpdate=now; -// } -// -// }; -// -// animationTimer.start(); - } - - public static void main(String[] args) { - launch(args); - } -} diff --git a/src/main/java/io/rpg/HelloController.java b/src/main/java/io/rpg/HelloController.java deleted file mode 100644 index f927ff20..00000000 --- a/src/main/java/io/rpg/HelloController.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.rpg; - -import javafx.fxml.FXML; -import javafx.scene.control.Label; - -public class HelloController { - @FXML - private Label welcomeText; - - @FXML - protected void onHelloButtonClick() { - welcomeText.setText("Welcome to JavaFX Application!"); - } -} \ No newline at end of file diff --git a/src/main/java/io/rpg/Initializer.java b/src/main/java/io/rpg/Initializer.java index 2c65205f..77a45db9 100644 --- a/src/main/java/io/rpg/Initializer.java +++ b/src/main/java/io/rpg/Initializer.java @@ -1,50 +1,100 @@ package io.rpg; import io.rpg.config.ConfigLoader; -import io.rpg.controller.LocationController; -import io.rpg.model.GameWorldConfig; -import io.rpg.model.location.LocationConfig; +import io.rpg.controller.Controller; +import io.rpg.config.model.GameWorldConfig; +import io.rpg.config.model.LocationConfig; import io.rpg.model.location.LocationModel; +import io.rpg.model.object.GameObject; +import io.rpg.config.model.GameObjectConfig; import io.rpg.view.LocationView; +import javafx.stage.Stage; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import javax.xml.stream.Location; +import java.io.IOException; import java.nio.file.Path; -import java.util.ArrayList; import java.util.LinkedHashMap; -import java.util.Map; +import java.util.LinkedList; +import java.util.List; public class Initializer { private Path pathToConfigDir; private ConfigLoader configLoader; + private Stage mainStage; - public Initializer(@NotNull String pathToConfigDir) { + public Initializer(@NotNull String pathToConfigDir, Stage mainStage) { configLoader = new ConfigLoader(pathToConfigDir); + this.mainStage = mainStage; } - public World getWorld() { + + public Game getWorld() { GameWorldConfig worldConfig = configLoader.load(); - LinkedHashMap locationConfigLinkedHashMap = worldConfig.getTagToLocationConfigMap(); // todo: apply builder pattern - World world = new World(); + Game game = new Game(); + + Controller controller = new Controller(); - for (Map.Entry entry : locationConfigLinkedHashMap.entrySet()) { - LocationModel model = LocationModel.fromConfig(entry.getValue()); - LocationController controller = LocationController.fromConfig(entry.getValue()); - LocationView view = LocationView.fromConfig(entry.getValue()); - controller.setModel(model); - controller.setView(view);; + LinkedHashMap tagToLocationModelMap = new LinkedHashMap<>(); + LinkedHashMap tagToLocationViewMap = new LinkedHashMap<>(); + assert worldConfig.getLocationConfigs() != null; + for (LocationConfig locationConfig : worldConfig.getLocationConfigs()) { + LocationModel model = loadLocationModelFromConfig(locationConfig); + LocationView view = buildViewFromModel(locationConfig); - world.addLocationController(controller); + assert view != null; + view.addListener(controller); - if (controller.isRoot()) { - world.setCurrentLocationController(controller); - } + tagToLocationModelMap.put(locationConfig.getTag(), model); + // TODO: Set correct parent + tagToLocationViewMap.put(locationConfig.getTag(), view); } + + // TODO: recognize root location + String rootTag = "location-1"; + + System.out.println("ROOT VIEW"); + System.out.println(tagToLocationViewMap.get(rootTag)); + + controller.setTagToLocationModelMap(tagToLocationModelMap); + controller.setTagToLocationViewMap(tagToLocationViewMap); + controller.setModel(tagToLocationModelMap.get(rootTag)); + controller.setView(tagToLocationViewMap.get(rootTag)); + + + + game.setController(controller); + + return game; + } + + @Nullable + public static LocationView buildViewFromModel(LocationConfig config) { + try { + return LocationView.fromConfig(config); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public static LocationModel loadLocationModelFromConfig(LocationConfig config) { + List gameObjectConfigs = config.getObjects(); + List gameObjects = new LinkedList<>(); + + for (GameObjectConfig goconfig : gameObjectConfigs) { + gameObjects.add(GameObject.fromConfig(goconfig)); + } + + return new LocationModel( + config.getTag(), + gameObjects + ); } } diff --git a/src/main/java/io/rpg/Main.java b/src/main/java/io/rpg/Main.java new file mode 100644 index 00000000..921c9276 --- /dev/null +++ b/src/main/java/io/rpg/Main.java @@ -0,0 +1,27 @@ +package io.rpg; + +import javafx.application.Application; +import javafx.stage.Stage; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.core.config.Configurator; + +import java.io.IOException; + +public class Main extends Application { + @Override + public void start(Stage stage) throws IOException { + Configurator.setRootLevel(Level.DEBUG); + Initializer worldInitializer = new Initializer("configurations/config-1", stage); + Game game = worldInitializer.getWorld(); + + stage.setScene(game.getWorldView()); + + stage.show(); + System.out.println("SCENE"); + System.out.println(stage.getScene()); + } + + public static void main(String[] args) { + launch(args); + } +} diff --git a/src/main/java/io/rpg/World.java b/src/main/java/io/rpg/World.java deleted file mode 100644 index 9381e4eb..00000000 --- a/src/main/java/io/rpg/World.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.rpg; - -import io.rpg.controller.LocationController; -import io.rpg.gui.model.LocationModel; -import io.rpg.view.LocationView; -import javafx.scene.Scene; - -import java.util.LinkedHashMap; -import java.util.List; - -public class World { - // mapa tag lokacji na lokację - private LinkedHashMap locationTagToModelMap; - private LocationController currentLocationController; - - - - public World() { - - } - - public void addLocationController(LocationController controller) { - locationControllers.add(controller); - } - - public void setLocationControllerForLocationTag(String tag) { - // tutaj przyda sie hashmapa: nazwa lokacji -> kontroller - } - - - public LocationView getWorldView() { - return currentLocationController.getView(); - } - - public void setCurrentLocationController(LocationController currentLocationController) { - this.currentLocationController = currentLocationController; - } -} diff --git a/src/main/java/io/rpg/config/ConfigLoader.java b/src/main/java/io/rpg/config/ConfigLoader.java index f4c9687d..c45e50fc 100644 --- a/src/main/java/io/rpg/config/ConfigLoader.java +++ b/src/main/java/io/rpg/config/ConfigLoader.java @@ -2,10 +2,10 @@ import com.google.gson.Gson; -import io.rpg.model.GameWorldConfig; -import io.rpg.model.location.LocationConfig; +import io.rpg.config.model.GameWorldConfig; +import io.rpg.config.model.LocationConfig; -import io.rpg.model.object.GameObjectConfig; +import io.rpg.config.model.GameObjectConfig; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -86,7 +86,7 @@ public GameWorldConfig load() { // todo: this should be called in loadLocationConfig method? // locationConfig.validate(); - config.addLocationConfigForTag(locationTag, locationConfig); + config.addLocationConfig(locationConfig); logger.info("Location config loaded for tag: " + locationTag); logger.info(locationConfig.toString()); diff --git a/src/main/java/io/rpg/model/object/GameObjectConfig.java b/src/main/java/io/rpg/config/model/GameObjectConfig.java similarity index 82% rename from src/main/java/io/rpg/model/object/GameObjectConfig.java rename to src/main/java/io/rpg/config/model/GameObjectConfig.java index 4c572b2d..0a9f836a 100644 --- a/src/main/java/io/rpg/model/object/GameObjectConfig.java +++ b/src/main/java/io/rpg/config/model/GameObjectConfig.java @@ -1,13 +1,14 @@ -package io.rpg.model.object; +package io.rpg.config.model; import io.rpg.model.data.Position; +import io.rpg.model.object.GameObject; +import io.rpg.model.object.GameObjects; import org.jetbrains.annotations.NotNull; public class GameObjectConfig extends GameObject { private String type; - public GameObjectConfig(@NotNull String tag, @NotNull Position position) { super(tag, position); } diff --git a/src/main/java/io/rpg/model/GameWorldConfig.java b/src/main/java/io/rpg/config/model/GameWorldConfig.java similarity index 60% rename from src/main/java/io/rpg/model/GameWorldConfig.java rename to src/main/java/io/rpg/config/model/GameWorldConfig.java index 431bf3c0..c164111b 100644 --- a/src/main/java/io/rpg/model/GameWorldConfig.java +++ b/src/main/java/io/rpg/config/model/GameWorldConfig.java @@ -1,11 +1,9 @@ -package io.rpg.model; +package io.rpg.config.model; -import io.rpg.model.location.LocationConfig; +import io.rpg.config.model.LocationConfig; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; public class GameWorldConfig { private String tag; @@ -14,15 +12,13 @@ public class GameWorldConfig { private ArrayList locationConfigs; - private LinkedHashMap tagToLocationConfigMap; - // This class is not meant to be instantiated // by hand. Only Gson should be able to do so private GameWorldConfig() { - tagToLocationConfigMap = new LinkedHashMap<>(); + locations = new ArrayList<>(); + locationConfigs = new ArrayList<>(); } - public String getTag() { return tag; } @@ -31,8 +27,8 @@ public List getLocations() { return locations; } - public LinkedHashMap getTagToLocationConfigMap() { - return tagToLocationConfigMap; + public ArrayList getLocationConfigs() { + return locationConfigs; } @Override @@ -45,7 +41,7 @@ public String toString() { return builder.append("}\n").toString(); } - public void addLocationConfigForTag(String locationTag, LocationConfig locationConfig) { - tagToLocationConfigMap.put(locationTag, locationConfig); + public void addLocationConfig(LocationConfig locationConfig) { + locationConfigs.add(locationConfig); } } diff --git a/src/main/java/io/rpg/model/location/LocationConfig.java b/src/main/java/io/rpg/config/model/LocationConfig.java similarity index 76% rename from src/main/java/io/rpg/model/location/LocationConfig.java rename to src/main/java/io/rpg/config/model/LocationConfig.java index b7d8043a..2ad7b4cf 100644 --- a/src/main/java/io/rpg/model/location/LocationConfig.java +++ b/src/main/java/io/rpg/config/model/LocationConfig.java @@ -1,7 +1,6 @@ -package io.rpg.model.location; +package io.rpg.config.model; -import io.rpg.model.object.GameObjectConfig; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -19,6 +18,11 @@ public class LocationConfig { @Nullable private Path path; + @Nullable + private String backgroundPath; + + private boolean isRoot; + // This class is not meant to be instantiated // by hand. Only Gson should be able to do so private LocationConfig() { @@ -30,6 +34,11 @@ public String getTag() { return tag; } + @Nullable + public String getBackgroundPath() { + return backgroundPath; + } + @NotNull public List getObjects() { return objects; @@ -43,4 +52,8 @@ public Path getPath() { public void setPath(@NotNull Path path) { this.path = path; } + + public boolean isRoot() { + return isRoot; + } } diff --git a/src/main/java/io/rpg/controller/Controller.java b/src/main/java/io/rpg/controller/Controller.java new file mode 100644 index 00000000..dbfa0670 --- /dev/null +++ b/src/main/java/io/rpg/controller/Controller.java @@ -0,0 +1,75 @@ +package io.rpg.controller; + +import io.rpg.model.location.LocationModel; +import io.rpg.view.GameObjectView; +import io.rpg.view.IOnClickedListener; +import io.rpg.view.IOnKeyPressedListener; +import io.rpg.view.LocationView; +import javafx.scene.Scene; +import javafx.scene.input.KeyEvent; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.LinkedHashMap; + +public class Controller implements IOnClickedListener, IOnKeyPressedListener { + private Scene currentView; + private LinkedHashMap tagToLocationModelMap; + private LocationModel currentModel; + private LinkedHashMap tagToLocationViewMap; + private Logger logger; + + + public Controller() { + logger = LogManager.getLogger(Controller.class); + + tagToLocationModelMap = new LinkedHashMap<>(); + tagToLocationViewMap = new LinkedHashMap<>(); + } + + public Controller(LinkedHashMap tagToLocationModelMap, + LinkedHashMap tagToLocationViewMap, + String rootTag) { + logger = LogManager.getLogger(Controller.class); + + this.tagToLocationViewMap = tagToLocationViewMap; + this.tagToLocationModelMap = tagToLocationModelMap; + + // TODO: handle errors + this.currentModel = this.tagToLocationModelMap.get(rootTag); + this.currentView = this.tagToLocationViewMap.get(rootTag); + } + + public void setModel(LocationModel model) { + this.tagToLocationModelMap.put(model.getTag(), model); + currentModel = model; + } + + public void setView(Scene currentView) { + this.currentView = currentView; + } + + public Scene getView() { + return currentView; + } + + public void setTagToLocationModelMap(LinkedHashMap tagToLocationModelMap) { + this.tagToLocationModelMap = tagToLocationModelMap; + } + + public void setTagToLocationViewMap(LinkedHashMap tagToLocationViewMap) { + this.tagToLocationViewMap = tagToLocationViewMap; + } + + @Override + public void onClick(GameObjectView source) { + // TODO + logger.info("Controller notified on click from " + source); + } + + @Override + public void onKeyPressed(Scene source, KeyEvent event) { + // TODO + logger.info("Controller notified on key pressed from " + source); + } +} diff --git a/src/main/java/io/rpg/controller/LocationController.java b/src/main/java/io/rpg/controller/LocationController.java deleted file mode 100644 index 539b46fb..00000000 --- a/src/main/java/io/rpg/controller/LocationController.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.rpg.controller; - -import io.rpg.model.location.LocationConfig; - -public class LocationController { - private LocationView view; - private LocationModel model; - - public LocationController() { - // - } - - public void setModel(LocationModel model) { - // - } - - public void setView(LocationView view) { - // - } - - public static LocationController fromConfig(LocationConfig config) { - return null; - } -} diff --git a/src/main/java/io/rpg/gui/DisplayLayer.java b/src/main/java/io/rpg/gui/DisplayLayer.java deleted file mode 100644 index 1734630e..00000000 --- a/src/main/java/io/rpg/gui/DisplayLayer.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.rpg.gui; - -import io.rpg.gui.model.LocationModel; -import javafx.fxml.Initializable; -import javafx.scene.Scene; -import javafx.stage.Stage; - -import java.io.IOException; -import java.net.URL; -import java.util.ResourceBundle; - -public class DisplayLayer { - private final Stage mainStage; - private final LocationController locationController; - - public DisplayLayer(Stage mainStage) throws IOException { - this.mainStage = mainStage; - mainStage.show(); - locationController = LocationController.load(); - } - - - public LocationModel showLocation() { - // maybe initialize the scene only once - mainStage.setScene(locationController.getScene()); - return locationController.getModel().clear(); - } - - public LocationController getLocationController(){ - return locationController; - } -} diff --git a/src/main/java/io/rpg/gui/LocationController.java b/src/main/java/io/rpg/gui/LocationController.java deleted file mode 100644 index 3c0a7e89..00000000 --- a/src/main/java/io/rpg/gui/LocationController.java +++ /dev/null @@ -1,138 +0,0 @@ -package io.rpg.gui; - -import io.rpg.gui.model.LocationModel; -import io.rpg.gui.popups.PointsEarnedPopup; -import io.rpg.model.Game; -import io.rpg.model.Vector; -import io.rpg.view.LocationView; -import javafx.event.Event; -import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; -import javafx.fxml.Initializable; -import javafx.scene.Scene; -import javafx.scene.image.ImageView; -import javafx.scene.input.KeyEvent; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Pane; -import javafx.stage.Stage; - -import java.io.IOException; -import java.net.URL; -import java.util.ResourceBundle; - -public class LocationController implements Initializable { - private final static URL FXML_URL = LocationController.class.getResource("location-view.fxml"); - - @FXML private ImageView mapImageView; - @FXML private Pane foregroundPane, contentPane; - @FXML private HBox parent; - - private LocationModel model; - private Scene scene; - private Game game; - - private final PointsEarnedPopup pointsPopup = new PointsEarnedPopup(); - - public static LocationController load() throws IOException { - FXMLLoader loader = new FXMLLoader(FXML_URL); - loader.load(); - return loader.getController(); - } - - public LocationController() { - - } - - @Override - public void initialize(URL location, ResourceBundle resources) { - mapImageView.imageProperty().addListener((property, oldImg, newImg) -> { - contentPane.setPrefWidth(newImg.getWidth()); - contentPane.setPrefHeight(newImg.getHeight()); - - foregroundPane.setPrefWidth(newImg.getWidth()); - foregroundPane.setPrefHeight(newImg.getHeight()); - - mapImageView.setFitWidth(newImg.getWidth()); - mapImageView.setFitHeight(newImg.getHeight()); - - }); - - model = new LocationModel(mapImageView.imageProperty(), foregroundPane.getChildren(), this); - - scene = new Scene(parent); - scene.addEventFilter(KeyEvent.KEY_TYPED, this::onKeyTyped; - scene.addEventFilter(KeyEvent.KEY_PRESSED, this::onKeyPressed); - scene.addEventFilter(KeyEvent.KEY_RELEASED, this::onKeyReleased); - } - - public void onKeyPressed(KeyEvent event){ - switch(event.getCode()){ - case W: -// game.getPlayer().setDirection(new Vector(0,-1)); - game.getPlayer().setUpPressed(true); - break; - case S: -// game.getPlayer().setDirection(new Vector(0,1)); - game.getPlayer().setDownPressed(true); - break; - case A: -// game.getPlayer().setDirection(new Vector(-1,0)); - game.getPlayer().setLeftPressed(true); - break; - case D: -// game.getPlayer().setDirection(new Vector(1,0)); - game.getPlayer().setRightPressed(true); - break; - } - - } - - public void onKeyReleased(KeyEvent event){ - event.getCharacter(); -// System.out.println(); - switch(event.getCode()){ - case W: -// game.getPlayer().setDirection(new Vector(0,-1)); - game.getPlayer().setUpPressed(false); - break; - case S: -// game.getPlayer().setDirection(new Vector(0,1)); - game.getPlayer().setDownPressed(false); - break; - case A: -// game.getPlayer().setDirection(new Vector(-1,0)); - game.getPlayer().setLeftPressed(false); - break; - case D: -// game.getPlayer().setDirection(new Vector(1,0)); - game.getPlayer().setRightPressed(false); - break; - } - - } - - public void onKeyTyped(KeyEvent event) { - // TODO: 01.04.2022 Implement key actions - System.out.println(event); - String c=event.getCharacter(); -// System.out.println(); - switch(c){ - case "f": - Stage popup = pointsPopup.getPopup(5, scene); - popup.show(); - break; - } - } - - public void setGame(Game game){ - this.game=game; - } - public LocationModel getModel(){ - return model; - } - - public Scene getScene() { - return scene; - } - -} diff --git a/src/main/java/io/rpg/gui/model/LocationModel.java b/src/main/java/io/rpg/gui/model/LocationModel.java deleted file mode 100644 index f94b8c83..00000000 --- a/src/main/java/io/rpg/gui/model/LocationModel.java +++ /dev/null @@ -1,91 +0,0 @@ -package io.rpg.gui.model; - -import io.rpg.gui.LocationController; -import io.rpg.model.GameObjectStandIn; -import io.rpg.model.*; -import io.rpg.model.object.GameObject; -import io.rpg.model.object.InteractiveGameObject; -import javafx.beans.property.ObjectProperty; -import javafx.collections.ObservableList; -import javafx.scene.Node; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; -import javafx.util.Pair; - -import java.util.HashMap; - -public class LocationModel { - static final int SCALE = 32; - private Game game; - private final ObjectProperty background; - // TODO: 01.04.2022 Think about a better name -// objects which we store on the playground -// mapNodes views to be displayed - private final ObservableList mapNodes; -// private - -// private HashMap gameObject2NodeMap; - private final LocationController controller; - - public LocationModel(ObjectProperty background, ObservableList mapNodes, LocationController controller) { - this.background = background; - this.mapNodes = mapNodes; -// this.gameObject2NodeMap = new HashMap<>(); - this.controller = controller; - } - - public LocationModel clear() { -// this.gameObject2NodeMap = new HashMap<>(); - mapNodes.clear(); - return this; - } - - public LocationModel setBackgroundImage(Image backgroundImage) { - background.setValue(backgroundImage); - return this; - } - - public LocationModel addMapObject(GameObject gameObject) { - ImageView imageView = new ImageView(gameObject.getImage()); -// gameObject - Vector mapPosition = getMapPosition(gameObject.getPosition()); -// Pair mapPosition = getMapPosition(gameObject.getPosition()); - imageView.setX(mapPosition.x); - imageView.setY(mapPosition.y); -// gameObject2NodeMap.put(gameObject, imageView); - gameObject.setImageView(imageView); - mapNodes.add(imageView); - imageView.setOnMouseClicked((e) -> onGameObjectAction(gameObject)); - return this; - } - - private void onGameObjectAction(GameObject source) { - // TODO: 01.04.2022 What to do when some GameObject was clicked - System.out.println(source); - if (source instanceof InteractiveGameObject) { - ((InteractiveGameObject) source).onAction(); - - } - } - - // TODO: 01.04.2022 Replace with Position - private Vector getMapPosition(Vector position) { - // size of one tile - return new Vector(position.x * SCALE, position.y * SCALE); -// return new Pair<>(position.x * scale, position.y * scale); - } - - public LocationModel setGame(Game game) { - this.game = game; - for(int i=0;i position; - private Image image; - - public GameObjectStandIn(Pair position, Image image) { - this.position = position; - this.image = image; - } - - public Pair getPosition() { - return position; - } - - public Image getImage(){ - return image; - } -} diff --git a/src/main/java/io/rpg/model/GameWorld.java b/src/main/java/io/rpg/model/GameWorld.java deleted file mode 100644 index bfc03791..00000000 --- a/src/main/java/io/rpg/model/GameWorld.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.rpg.model; - -final public class GameWorld { -} diff --git a/src/main/java/io/rpg/model/Vector.java b/src/main/java/io/rpg/model/data/Vector.java similarity index 85% rename from src/main/java/io/rpg/model/Vector.java rename to src/main/java/io/rpg/model/data/Vector.java index 55ba4f8b..88541f35 100644 --- a/src/main/java/io/rpg/model/Vector.java +++ b/src/main/java/io/rpg/model/data/Vector.java @@ -1,4 +1,4 @@ -package io.rpg.model; +package io.rpg.model.data; public class Vector { public final float x; diff --git a/src/main/java/io/rpg/model/location/LocationModel.java b/src/main/java/io/rpg/model/location/LocationModel.java index 1e69a92a..c4aa99f3 100644 --- a/src/main/java/io/rpg/model/location/LocationModel.java +++ b/src/main/java/io/rpg/model/location/LocationModel.java @@ -1,14 +1,30 @@ package io.rpg.model.location; +import io.rpg.model.object.Player; +import io.rpg.model.object.GameObject; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + /** * Represents single location in our game */ public class LocationModel { + private String tag; + private List gameObjects; + private Player player; - - public static LocationModel fromConfig(LocationConfig config) { - return null; + public LocationModel(@NotNull String tag, @NotNull List gameObjects) { + this.tag = tag; + this.gameObjects = gameObjects; + player = null; } + public void setPlayer(@NotNull Player player) { + this.player = player; + } + public String getTag() { + return tag; + } } diff --git a/src/main/java/io/rpg/model/metadata/.gitkeep b/src/main/java/io/rpg/model/metadata/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/io/rpg/model/object/GameObject.java b/src/main/java/io/rpg/model/object/GameObject.java index 3ec2fead..4d60caa7 100644 --- a/src/main/java/io/rpg/model/object/GameObject.java +++ b/src/main/java/io/rpg/model/object/GameObject.java @@ -1,5 +1,6 @@ package io.rpg.model.object; +import io.rpg.config.model.GameObjectConfig; import io.rpg.model.data.Position; import org.jetbrains.annotations.NotNull; @@ -52,9 +53,19 @@ public void validate() { // nothing to validate for now } + public GameObject(@NotNull String tag, @NotNull Position position) { + this.tag = tag; + this.position = position; + this.assetPath = ""; // TODO + } + public GameObject(@NotNull String tag, @NotNull Position position, @NotNull String assetPath) { this.tag = tag; this.position = position; this.assetPath = assetPath; } + + public static GameObject fromConfig(GameObjectConfig config) { + return new GameObject("XD", new Position(3, 3), "file:assets/someDude.png"); + } } diff --git a/src/main/java/io/rpg/model/object/GameObjects.java b/src/main/java/io/rpg/model/object/GameObjects.java index b0f05629..b513fce7 100644 --- a/src/main/java/io/rpg/model/object/GameObjects.java +++ b/src/main/java/io/rpg/model/object/GameObjects.java @@ -3,6 +3,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Set; +import java.util.concurrent.Executors; public class GameObjects { // this class is mean to only provide static methods diff --git a/src/main/java/io/rpg/model/object/InteractiveGameObject.java b/src/main/java/io/rpg/model/object/InteractiveGameObject.java index 83d9db3e..8e73699a 100644 --- a/src/main/java/io/rpg/model/object/InteractiveGameObject.java +++ b/src/main/java/io/rpg/model/object/InteractiveGameObject.java @@ -5,7 +5,7 @@ abstract public class InteractiveGameObject extends GameObject { public InteractiveGameObject(@NotNull String tag, @NotNull Position position) { - super(tag, position, assetPath); + super(tag, position); } abstract public void onAction(); diff --git a/src/main/java/io/rpg/model/Item.java b/src/main/java/io/rpg/model/object/Item.java similarity index 90% rename from src/main/java/io/rpg/model/Item.java rename to src/main/java/io/rpg/model/object/Item.java index ee942f7f..9d9f2909 100644 --- a/src/main/java/io/rpg/model/Item.java +++ b/src/main/java/io/rpg/model/object/Item.java @@ -1,4 +1,4 @@ -package io.rpg.model; +package io.rpg.model.object; public class Item { private int strength; @@ -16,4 +16,4 @@ public int strength() { public String name() { return name; } -} \ No newline at end of file +} diff --git a/src/main/java/io/rpg/model/Player.java b/src/main/java/io/rpg/model/object/Player.java similarity index 91% rename from src/main/java/io/rpg/model/Player.java rename to src/main/java/io/rpg/model/object/Player.java index 1b8d8eb5..4db9326e 100644 --- a/src/main/java/io/rpg/model/Player.java +++ b/src/main/java/io/rpg/model/object/Player.java @@ -1,8 +1,10 @@ -package io.rpg.model; +package io.rpg.model.object; +import io.rpg.model.data.Vector; +import io.rpg.torefract.GameObject; import javafx.scene.image.Image; -public class Player extends GameObject{ +public class Player extends GameObject { int strength; float speed; @@ -47,7 +49,6 @@ public void update(float elapsed){ if(rightPressed) x+=1; - this.position=new Vector(this.position.x+speed*x*elapsed/1000,this.position.y+speed*y*elapsed/1000); } diff --git a/src/main/java/io/rpg/model/GameObject.java b/src/main/java/io/rpg/torefract/GameObject.java similarity index 84% rename from src/main/java/io/rpg/model/GameObject.java rename to src/main/java/io/rpg/torefract/GameObject.java index a9d5c3e9..121323b1 100644 --- a/src/main/java/io/rpg/model/GameObject.java +++ b/src/main/java/io/rpg/torefract/GameObject.java @@ -1,5 +1,6 @@ -package io.rpg.model; +package io.rpg.torefract; +import io.rpg.model.data.Vector; import javafx.scene.image.Image; import javafx.scene.image.ImageView; @@ -8,10 +9,10 @@ */ public class GameObject { -// private Pair position; + // private Pair position; protected Vector position; private Image image; -// control that displays objects + // control that displays objects private ImageView imageView; public GameObject(Vector position, Image image) { diff --git a/src/main/java/io/rpg/model/Game.java b/src/main/java/io/rpg/torefract/GameToRefract.java similarity index 86% rename from src/main/java/io/rpg/model/Game.java rename to src/main/java/io/rpg/torefract/GameToRefract.java index b50acc30..c6118f74 100644 --- a/src/main/java/io/rpg/model/Game.java +++ b/src/main/java/io/rpg/torefract/GameToRefract.java @@ -1,13 +1,15 @@ -package io.rpg.model; +package io.rpg.torefract; + +import io.rpg.model.object.Player; import java.util.ArrayList; -public class Game { +public class GameToRefract { private Player player; // Timer ArrayList gameObjects; - public Game(){ + public GameToRefract(){ this.gameObjects=new ArrayList<>(); this.player=null; } diff --git a/src/main/java/io/rpg/view/.gitkeep b/src/main/java/io/rpg/view/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/io/rpg/view/GameObjectView.java b/src/main/java/io/rpg/view/GameObjectView.java new file mode 100644 index 00000000..7b65edb9 --- /dev/null +++ b/src/main/java/io/rpg/view/GameObjectView.java @@ -0,0 +1,42 @@ +package io.rpg.view; + +import io.rpg.model.data.Position; +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.input.MouseEvent; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; + +public class GameObjectView extends ImageView implements IObservable { + private Path path; + private final Set onClickedListeners; + + public GameObjectView(@NotNull Path assetPath, @NotNull Position position) { + path = assetPath; + this.setImage(new Image(path.toString())); + // todo: better position class + this.setX(position.col); + this.setY(position.row); + this.onClickedListeners = new HashSet<>(); + this.setOnMouseClicked(this::notifyOnClickListeners); + } + + private void notifyOnClickListeners(MouseEvent e) { + onClickedListeners.forEach(listener -> listener.onClick(this)); + } + + @Override + public void addListener(IOnClickedListener listener) { + onClickedListeners.add(listener); + } + + @Override + public void removeListener(IOnClickedListener listener) { + onClickedListeners.remove(listener); + } +} diff --git a/src/main/java/io/rpg/view/IObservable.java b/src/main/java/io/rpg/view/IObservable.java new file mode 100644 index 00000000..3f188005 --- /dev/null +++ b/src/main/java/io/rpg/view/IObservable.java @@ -0,0 +1,7 @@ +package io.rpg.view; + +public interface IObservable { + void addListener(final T listener); + + void removeListener(final T listener); +} diff --git a/src/main/java/io/rpg/view/IOnClickedListener.java b/src/main/java/io/rpg/view/IOnClickedListener.java new file mode 100644 index 00000000..9a27448d --- /dev/null +++ b/src/main/java/io/rpg/view/IOnClickedListener.java @@ -0,0 +1,5 @@ +package io.rpg.view; + +public interface IOnClickedListener { + void onClick(GameObjectView source); +} diff --git a/src/main/java/io/rpg/view/IOnKeyPressedListener.java b/src/main/java/io/rpg/view/IOnKeyPressedListener.java new file mode 100644 index 00000000..3906a6b8 --- /dev/null +++ b/src/main/java/io/rpg/view/IOnKeyPressedListener.java @@ -0,0 +1,8 @@ +package io.rpg.view; + +import javafx.scene.Scene; +import javafx.scene.input.KeyEvent; + +public interface IOnKeyPressedListener { + void onKeyPressed(Scene source, KeyEvent event); +} diff --git a/src/main/java/io/rpg/view/LocationView.java b/src/main/java/io/rpg/view/LocationView.java index 106ed101..34378850 100644 --- a/src/main/java/io/rpg/view/LocationView.java +++ b/src/main/java/io/rpg/view/LocationView.java @@ -1,16 +1,92 @@ package io.rpg.view; -import io.rpg.model.location.LocationConfig; +import io.rpg.viewmodel.LocationViewModel; +import io.rpg.config.model.LocationConfig; +import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; +import javafx.scene.image.Image; +import javafx.scene.input.KeyEvent; +import javafx.scene.layout.HBox; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; -public class LocationView extends Scene { +import java.io.IOException; +import java.net.URL; +import java.util.HashSet; +import java.util.Set; - public LocationView(Parent root) { +public class LocationView extends Scene implements IObservable { + static final int SCALE = 32; // TODO: REMOVE THIS + private final static URL FXML_URL = LocationViewModel.class.getResource("location-view.fxml"); + + private final Logger logger; + + private final Set onKeyPressedListeners; + + private final LocationViewModel viewModel; + + public LocationView(HBox root, LocationViewModel viewModel) { super(root); + + logger = LogManager.getLogger(LocationView.class); + + this.viewModel = viewModel; + onKeyPressedListeners = new HashSet<>(); + + this.setOnKeyPressed(this::onKeyPressed); + this.setOnKeyReleased(this::onKeyReleased); + + System.out.println("CHILDREN"); + System.out.println(root.getChildrenUnmodifiable()); + + } + + private void onKeyPressed(KeyEvent event) { + logger.info("Collected key press event "); + notifyOnKeyPressedListeners(event); + } + + private void onKeyReleased(KeyEvent event) { + logger.info("Collected key press"); + notifyOnKeyPressedListeners(event); + } + + private void notifyOnKeyPressedListeners(KeyEvent event) { + onKeyPressedListeners.forEach(listener -> listener.onKeyPressed(this, event)); + } + +// private void onKeyTyped(Key) + + public LocationViewModel getViewModel() { + return viewModel; + } + + public static LocationView loadFromFXML(@NotNull URL fxmlUrl) throws IOException { + FXMLLoader loader = new FXMLLoader(fxmlUrl); + Parent parent = loader.load(); + LocationViewModel viewModel = loader.getController(); + assert parent == viewModel.getParent(); + return new LocationView(viewModel.getParent(), viewModel); + } + + public static LocationView fromConfig(LocationConfig config) throws IOException { + LocationView view = loadFromFXML(FXML_URL); + System.out.println("BACKGROUND PATH"); + System.out.println(config.getBackgroundPath()); + view.getViewModel().setBackground(new Image(config.getBackgroundPath())); + // todo: na podstawie configu ustawić pola korzystając z view modelu + return view; + } + + @Override + public void addListener(IOnKeyPressedListener listener) { + onKeyPressedListeners.add(listener); } - public static LocationView fromConfig(LocationConfig config) { - return null; + @Override + public void removeListener(IOnKeyPressedListener listener) { + onKeyPressedListeners.remove(listener); } } diff --git a/src/main/java/io/rpg/gui/popups/PointsEarnedPopup.java b/src/main/java/io/rpg/view/popups/PointsEarnedPopup.java similarity index 96% rename from src/main/java/io/rpg/gui/popups/PointsEarnedPopup.java rename to src/main/java/io/rpg/view/popups/PointsEarnedPopup.java index bda02211..d05812ef 100644 --- a/src/main/java/io/rpg/gui/popups/PointsEarnedPopup.java +++ b/src/main/java/io/rpg/view/popups/PointsEarnedPopup.java @@ -1,5 +1,6 @@ -package io.rpg.gui.popups; +package io.rpg.view.popups; +import io.rpg.viewmodel.PointsPopupController; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; diff --git a/src/main/java/io/rpg/viewmodel/LocationViewModel.java b/src/main/java/io/rpg/viewmodel/LocationViewModel.java new file mode 100644 index 00000000..b2a537d1 --- /dev/null +++ b/src/main/java/io/rpg/viewmodel/LocationViewModel.java @@ -0,0 +1,45 @@ +package io.rpg.viewmodel; + +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; + +import java.net.URL; +import java.util.ResourceBundle; + +public class LocationViewModel implements Initializable { + @FXML private ImageView mapImageView; + @FXML private Pane foregroundPane, contentPane; + @FXML private HBox parent; + + public LocationViewModel() { + + } + + public void setBackground(Image background) { + this.mapImageView.imageProperty().setValue(background); + } + + public HBox getParent() { + return parent; + } + + @Override + public void initialize(URL location, ResourceBundle resources) { + System.out.println("INITIALIZE"); + mapImageView.imageProperty().addListener((property, oldImg, newImg) -> { + System.out.println("Map image view changing"); + contentPane.setPrefWidth(newImg.getWidth()); + contentPane.setPrefHeight(newImg.getHeight()); + + foregroundPane.setPrefWidth(newImg.getWidth()); + foregroundPane.setPrefHeight(newImg.getHeight()); + + mapImageView.setFitWidth(newImg.getWidth()); + mapImageView.setFitHeight(newImg.getHeight()); + }); + } +} diff --git a/src/main/java/io/rpg/gui/popups/PointsPopupController.java b/src/main/java/io/rpg/viewmodel/PointsPopupController.java similarity index 83% rename from src/main/java/io/rpg/gui/popups/PointsPopupController.java rename to src/main/java/io/rpg/viewmodel/PointsPopupController.java index a5d60352..227026d9 100644 --- a/src/main/java/io/rpg/gui/popups/PointsPopupController.java +++ b/src/main/java/io/rpg/viewmodel/PointsPopupController.java @@ -1,4 +1,4 @@ -package io.rpg.gui.popups; +package io.rpg.viewmodel; import javafx.fxml.FXML; import javafx.scene.control.Label; @@ -11,11 +11,11 @@ public class PointsPopupController { @FXML private Label label; @FXML private Pane background; - protected void setPointsCount(int pointsCount) { + public void setPointsCount(int pointsCount) { label.setText("Earned " + pointsCount + " points!"); } - protected Pair setBackgroundImage(String url){ + public Pair setBackgroundImage(String url){ BackgroundImage backgroundImg= new BackgroundImage( new Image(url), BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, @@ -25,4 +25,4 @@ protected Pair setBackgroundImage(String url){ background.setBackground(new Background(backgroundImg)); return new Pair<>(background.getPrefWidth(), background.getPrefHeight()); } -} \ No newline at end of file +} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index b613de50..b58a401c 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -13,12 +13,13 @@ requires org.apache.logging.log4j.core; opens io.rpg to javafx.fxml; - opens io.rpg.model to com.google.gson; opens io.rpg.model.location to com.google.gson; opens io.rpg.model.object to com.google.gson; opens io.rpg.model.data to com.google.gson; - opens io.rpg.gui to javafx.fxml; - opens io.rpg.gui.popups to javafx.fxml; - + + opens io.rpg.viewmodel to javafx.fxml; + opens io.rpg.torefract to com.google.gson; + opens io.rpg.config.model to com.google.gson; + exports io.rpg; } diff --git a/src/main/resources/io/rpg/hello-view.fxml b/src/main/resources/io/rpg/hello-view.fxml deleted file mode 100644 index adb9c0f5..00000000 --- a/src/main/resources/io/rpg/hello-view.fxml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - -