From 5931cfb67eb50123d76b742bf903a1704a2ecce7 Mon Sep 17 00:00:00 2001 From: co012 Date: Fri, 1 Apr 2022 21:30:44 +0200 Subject: [PATCH 01/18] chore: Init gui --- assets/map.png | Bin 0 -> 37340 bytes assets/map10x10.png | Bin 0 -> 18631 bytes assets/map20x20.bmp | Bin 0 -> 1228854 bytes assets/someDude.png | Bin 0 -> 4692 bytes assets/someDudeButGreen.png | Bin 0 -> 4692 bytes src/main/java/io/rpg/HelloApplication.java | 22 ++++-- src/main/java/io/rpg/gui/DisplayLayer.java | 32 +++++++++ .../java/io/rpg/gui/LocationController.java | 59 ++++++++++++++++ .../java/io/rpg/gui/model/LocationModel.java | 64 ++++++++++++++++++ .../java/io/rpg/model/GameObjectStandIn.java | 26 +++++++ src/main/java/module-info.java | 2 +- .../resources/io/rpg/gui/location-view.fxml | 22 ++++++ 12 files changed, 221 insertions(+), 6 deletions(-) create mode 100644 assets/map.png create mode 100644 assets/map10x10.png create mode 100644 assets/map20x20.bmp create mode 100644 assets/someDude.png create mode 100644 assets/someDudeButGreen.png create mode 100644 src/main/java/io/rpg/gui/DisplayLayer.java create mode 100644 src/main/java/io/rpg/gui/LocationController.java create mode 100644 src/main/java/io/rpg/gui/model/LocationModel.java create mode 100644 src/main/java/io/rpg/model/GameObjectStandIn.java create mode 100644 src/main/resources/io/rpg/gui/location-view.fxml diff --git a/assets/map.png b/assets/map.png new file mode 100644 index 0000000000000000000000000000000000000000..4df2990aeacfe80dbd2dbf8439bb15f7b8a8646e GIT binary patch literal 37340 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 bPqTQ`%A|19x)*4WzNN`Y^Am56UyAr&`1@8& literal 0 HcmV?d00001 diff --git a/assets/map10x10.png b/assets/map10x10.png new file mode 100644 index 0000000000000000000000000000000000000000..de67ef4ae4c1621fb560904af214fd5a6ce4db0f GIT binary patch literal 18631 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 DZe&PK literal 0 HcmV?d00001 diff --git a/assets/someDude.png b/assets/someDude.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5b27a3808a0db5d7ca141b6d81970636ca79bb GIT binary patch literal 4692 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFt%noI|q0=J1Z0v<)>xlq%tsQ zOst(~>v1?hq}Bhjm#dcOEyp8@&ZV0av>s`M>NK@p3d^{9@X6Bp3r8j_*YU_2=>Y*Jmo zU=0-EEbxddW?;}$24TjErS@e&LG}_)Usv{LER4buhCKmd7l1;NC9V-A&iT2ysd*&~ z&PAz-C8;S2<(VZJ3hti10pX2&;tUJ|+MX_sArYL63Ig}v1NDr8(GVEe5MU%={eJ@T zq)216iv@=XaEl-ANynjtcwu>$nK%{WasUH0EXHXok^~bHdq9{&%K`Q&-VDI_#G05u z!AD3QTM&~R0tyP7;0Y9)frRAI_2BZ&e`+Q|q+EbuAITwr?gL`@_&h@w2jFugP6r?b z8$SIM%i(eWMqE*16F$%2asb#qd>V;$5Rw^KJ%v>e$#A?`4oMv$CQf^BO5if_fs_

%m-IK;6Flk5PPF%KU2p@bf(4H1|* d1D*y(9k7L2|LNBH7Y{&D;_2$=vd$@?2>^%{80`Q6 literal 0 HcmV?d00001 diff --git a/assets/someDudeButGreen.png b/assets/someDudeButGreen.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3c70249023a506278c06c04d48f6ee198233ff GIT binary patch literal 4692 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFt%noI|q0=J1Z0v<)>xlq%tsQ zOst(~>v1?hq}Bhjm#dcOEyp8@&ZV0av>s`M>NK@p3d^{9@X6Bp3r8j_*YU_2=>Y*Jmo zU=0-EEbxddW?;}$24TjErS@e&LG}_)Usv{LER4dEN`hb0{DDG}C9V-A&iT2ysd*&~ z&PAz-C8;S2<(VZJ3hti10pX2&;tUJ|+MX_sArYL63Ig}v1NDr8(GVEe5MU%={eJ@T zq)216iv@=XaEl-ANynjtcwu>$nK%{WasUH0EXHXok^~bHdq9{&%K_(nof#zUCSSl6 zRD|TQ=_5G=w(@TsxFXeHWcBzwgUbP6{rEH@TY!&^WCm7GVHHF&5MC!B ziIKy^X%9{bT()Gc7sl(T>49%aGLvYEa*#jN|1MUE#f(bdy3FQW2Q$Ng1k{zI+unBKD@Zf(0,0), someDude1)) + .addMapObject(new GameObjectStandIn(new Pair<>(0,5), someDude1)) + .addMapObject(new GameObjectStandIn(new Pair<>(5,5), someDude2)); + + } public static void main(String[] args) { diff --git a/src/main/java/io/rpg/gui/DisplayLayer.java b/src/main/java/io/rpg/gui/DisplayLayer.java new file mode 100644 index 00000000..5535e3e1 --- /dev/null +++ b/src/main/java/io/rpg/gui/DisplayLayer.java @@ -0,0 +1,32 @@ +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(new Scene(locationController.getParent())); + + return locationController.getModel() + .clear(); + } + + +} diff --git a/src/main/java/io/rpg/gui/LocationController.java b/src/main/java/io/rpg/gui/LocationController.java new file mode 100644 index 00000000..9a8a2ac8 --- /dev/null +++ b/src/main/java/io/rpg/gui/LocationController.java @@ -0,0 +1,59 @@ +package io.rpg.gui; + +import io.rpg.gui.model.LocationModel; +import io.rpg.model.GameObjectStandIn; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.scene.Parent; +import javafx.scene.image.ImageView; +import javafx.scene.input.KeyEvent; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; + +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; + @FXML private HBox parent; + + private LocationModel model; + + 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) { + foregroundPane.prefWidthProperty().bind(mapImageView.imageProperty().get().widthProperty()); + foregroundPane.prefHeightProperty().bind(mapImageView.imageProperty().get().heightProperty()); + + model = new LocationModel(mapImageView.imageProperty(), foregroundPane.getChildren(), this); + } + + @FXML + private void onKeyTyped(KeyEvent event) { + + } + + public Parent getParent(){ + return parent; + } + + public LocationModel getModel(){ + return model; + } + + +} diff --git a/src/main/java/io/rpg/gui/model/LocationModel.java b/src/main/java/io/rpg/gui/model/LocationModel.java new file mode 100644 index 00000000..e7584055 --- /dev/null +++ b/src/main/java/io/rpg/gui/model/LocationModel.java @@ -0,0 +1,64 @@ +package io.rpg.gui.model; + +import io.rpg.gui.LocationController; +import io.rpg.model.GameObjectStandIn; +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 { + + private final ObjectProperty background; + // TODO: 01.04.2022 Think about a better name + private final ObservableList mapObjects; + + private HashMap gameObject2NodeMap; + private final LocationController controller; + + public LocationModel(ObjectProperty background, ObservableList mapObjects, LocationController controller) { + this.background = background; + this.mapObjects = mapObjects; + this.gameObject2NodeMap = new HashMap<>(); + this.controller = controller; + } + + public LocationModel clear(){ + this.gameObject2NodeMap = new HashMap<>(); + mapObjects.clear(); + return this; + } + + public LocationModel setBackgroundImage(Image backgroundImage){ + background.setValue(backgroundImage); + return this; + } + + public LocationModel addMapObject(GameObjectStandIn gameObject){ + ImageView imageView = new ImageView(gameObject.getImage()); + Pair mapPosition = getMapPosition(gameObject.getPosition()); + imageView.setX(mapPosition.getKey()); + imageView.setY(mapPosition.getValue()); + gameObject2NodeMap.put(gameObject, imageView); + mapObjects.add(imageView); + imageView.setOnMouseClicked((e) -> onGameObjectAction(gameObject)); + return this; + } + + private void onGameObjectAction(GameObjectStandIn source){ + // TODO: 01.04.2022 What to do when some GameObject was clicked + System.out.println(source); + } + + // TODO: 01.04.2022 Replace with Position + private Pair getMapPosition(Pair position){ + int scale = 32; + return new Pair<>(position.getKey() * scale, position.getValue() * scale); + } + + +} diff --git a/src/main/java/io/rpg/model/GameObjectStandIn.java b/src/main/java/io/rpg/model/GameObjectStandIn.java new file mode 100644 index 00000000..ff7e92d2 --- /dev/null +++ b/src/main/java/io/rpg/model/GameObjectStandIn.java @@ -0,0 +1,26 @@ +package io.rpg.model; + +import javafx.scene.image.Image; +import javafx.util.Pair; + +/** + * A Temporary Class waiting to be replaced with GameObject class from branch RPG-79 + */ +public class GameObjectStandIn { + + private Pair 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/module-info.java b/src/main/java/module-info.java index 28297aa0..0db4b668 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -8,6 +8,6 @@ requires org.kordamp.ikonli.javafx; requires org.kordamp.bootstrapfx.core; - opens io.rpg to javafx.fxml; + opens io.rpg.gui to javafx.fxml; exports io.rpg; } \ No newline at end of file diff --git a/src/main/resources/io/rpg/gui/location-view.fxml b/src/main/resources/io/rpg/gui/location-view.fxml new file mode 100644 index 00000000..e34150e2 --- /dev/null +++ b/src/main/resources/io/rpg/gui/location-view.fxml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + From 363fc49291134ac720c63741b365293a95b89822 Mon Sep 17 00:00:00 2001 From: co012 Date: Fri, 1 Apr 2022 23:20:24 +0200 Subject: [PATCH 02/18] feat: now location is centered --- src/main/java/io/rpg/HelloApplication.java | 16 +++++++++ src/main/java/io/rpg/gui/DisplayLayer.java | 3 +- .../java/io/rpg/gui/LocationController.java | 34 ++++++++++++++----- .../resources/io/rpg/gui/location-view.fxml | 7 ++-- 4 files changed, 45 insertions(+), 15 deletions(-) diff --git a/src/main/java/io/rpg/HelloApplication.java b/src/main/java/io/rpg/HelloApplication.java index 1ff1b9f4..b279f9ec 100644 --- a/src/main/java/io/rpg/HelloApplication.java +++ b/src/main/java/io/rpg/HelloApplication.java @@ -3,6 +3,7 @@ import io.rpg.gui.DisplayLayer; import io.rpg.model.GameObjectStandIn; import javafx.application.Application; +import javafx.application.Platform; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.image.Image; @@ -16,6 +17,7 @@ public class HelloApplication extends Application { @Override public void start(Stage stage) throws IOException { Image someMap = new Image("C:\\Dev\\rpg-io\\assets\\map.png"); + Image someMap10x10 = new Image("C:\\Dev\\rpg-io\\assets\\map10x10.png"); Image someDude1 = new Image("C:\\Dev\\rpg-io\\assets\\someDude.png"); Image someDude2 = new Image("C:\\Dev\\rpg-io\\assets\\someDudeButGreen.png"); @@ -26,6 +28,20 @@ public void start(Stage stage) throws IOException { .addMapObject(new GameObjectStandIn(new Pair<>(0,5), someDude1)) .addMapObject(new GameObjectStandIn(new Pair<>(5,5), someDude2)); + new Thread(() -> { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Platform.runLater(() ->{ + displayLayer.showLocation() + .setBackgroundImage(someMap10x10) + .addMapObject(new GameObjectStandIn(new Pair<>(0,0), someDude1)) + .addMapObject(new GameObjectStandIn(new Pair<>(0,2), someDude1)) + .addMapObject(new GameObjectStandIn(new Pair<>(5,9), someDude2)); + }); + }).start(); } diff --git a/src/main/java/io/rpg/gui/DisplayLayer.java b/src/main/java/io/rpg/gui/DisplayLayer.java index 5535e3e1..3a2ac83e 100644 --- a/src/main/java/io/rpg/gui/DisplayLayer.java +++ b/src/main/java/io/rpg/gui/DisplayLayer.java @@ -22,8 +22,7 @@ public DisplayLayer(Stage mainStage) throws IOException { public LocationModel showLocation(){ // maybe initialize the scene only once - mainStage.setScene(new Scene(locationController.getParent())); - + 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 9a8a2ac8..58bdd9e8 100644 --- a/src/main/java/io/rpg/gui/LocationController.java +++ b/src/main/java/io/rpg/gui/LocationController.java @@ -2,10 +2,13 @@ import io.rpg.gui.model.LocationModel; import io.rpg.model.GameObjectStandIn; +import javafx.event.EventType; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; +import javafx.geometry.Rectangle2D; import javafx.scene.Parent; +import javafx.scene.Scene; import javafx.scene.image.ImageView; import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; @@ -19,10 +22,11 @@ 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; + @FXML private Pane foregroundPane, contentPane; @FXML private HBox parent; private LocationModel model; + private Scene scene; public static LocationController load() throws IOException { FXMLLoader loader = new FXMLLoader(FXML_URL); @@ -36,24 +40,36 @@ public LocationController() { @Override public void initialize(URL location, ResourceBundle resources) { - foregroundPane.prefWidthProperty().bind(mapImageView.imageProperty().get().widthProperty()); - foregroundPane.prefHeightProperty().bind(mapImageView.imageProperty().get().heightProperty()); + 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); } - @FXML - private void onKeyTyped(KeyEvent event) { + public void onKeyTyped(KeyEvent event) { + // TODO: 01.04.2022 Implement key actions - } + System.out.println(event); - public Parent getParent(){ - return parent; } public LocationModel getModel(){ return model; } - + public Scene getScene() { + return scene; + } } diff --git a/src/main/resources/io/rpg/gui/location-view.fxml b/src/main/resources/io/rpg/gui/location-view.fxml index e34150e2..2e91c75d 100644 --- a/src/main/resources/io/rpg/gui/location-view.fxml +++ b/src/main/resources/io/rpg/gui/location-view.fxml @@ -5,12 +5,11 @@ - - + - + - + From ddb2dde1d144a4b8920a120406b7e9afc209fa35 Mon Sep 17 00:00:00 2001 From: mhawryluk Date: Sat, 2 Apr 2022 16:41:29 +0200 Subject: [PATCH 03/18] feat: Add popup creation class for point earning --- src/main/java/io/rpg/HelloApplication.java | 8 ++--- .../java/io/rpg/gui/LocationController.java | 3 ++ .../java/io/rpg/gui/PointsEarnedPopup.java | 30 +++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 src/main/java/io/rpg/gui/PointsEarnedPopup.java diff --git a/src/main/java/io/rpg/HelloApplication.java b/src/main/java/io/rpg/HelloApplication.java index b279f9ec..cd5910bf 100644 --- a/src/main/java/io/rpg/HelloApplication.java +++ b/src/main/java/io/rpg/HelloApplication.java @@ -16,10 +16,10 @@ public class HelloApplication extends Application { @Override public void start(Stage stage) throws IOException { - Image someMap = new Image("C:\\Dev\\rpg-io\\assets\\map.png"); - Image someMap10x10 = new Image("C:\\Dev\\rpg-io\\assets\\map10x10.png"); - Image someDude1 = new Image("C:\\Dev\\rpg-io\\assets\\someDude.png"); - Image someDude2 = new Image("C:\\Dev\\rpg-io\\assets\\someDudeButGreen.png"); + 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"); DisplayLayer displayLayer = new DisplayLayer(stage); displayLayer.showLocation() diff --git a/src/main/java/io/rpg/gui/LocationController.java b/src/main/java/io/rpg/gui/LocationController.java index 58bdd9e8..845d1da5 100644 --- a/src/main/java/io/rpg/gui/LocationController.java +++ b/src/main/java/io/rpg/gui/LocationController.java @@ -9,6 +9,7 @@ import javafx.geometry.Rectangle2D; import javafx.scene.Parent; import javafx.scene.Scene; +import javafx.scene.SubScene; import javafx.scene.image.ImageView; import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; @@ -63,6 +64,8 @@ public void onKeyTyped(KeyEvent event) { System.out.println(event); + PointsEarnedPopup.showPopup(5, scene); + } public LocationModel getModel(){ diff --git a/src/main/java/io/rpg/gui/PointsEarnedPopup.java b/src/main/java/io/rpg/gui/PointsEarnedPopup.java new file mode 100644 index 00000000..02adff31 --- /dev/null +++ b/src/main/java/io/rpg/gui/PointsEarnedPopup.java @@ -0,0 +1,30 @@ +package io.rpg.gui; + +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; +import javafx.stage.Modality; +import javafx.stage.Stage; +import javafx.stage.StageStyle; + +public class PointsEarnedPopup { + public static void showPopup(int pointsCount, Scene scene){ + VBox pauseRoot = new VBox(5); + pauseRoot.getChildren().add(new Label("Earned " + pointsCount + " points")); + + Stage popupStage = new Stage(StageStyle.TRANSPARENT); + popupStage.initOwner(scene.getWindow()); + popupStage.initModality(Modality.APPLICATION_MODAL); + + popupStage.setScene(new Scene(pauseRoot, Color.TRANSPARENT)); + + popupStage.show(); + + popupStage.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> { + if (!isNowFocused) { + popupStage.close(); + } + }); + } +} From a2c4aac9b0abe1faefe022ac4799670e55c6c33b Mon Sep 17 00:00:00 2001 From: mhawryluk Date: Sat, 2 Apr 2022 17:26:56 +0200 Subject: [PATCH 04/18] feat: Read popup layout from FXML and set pointCount via controller --- .../java/io/rpg/gui/PointsEarnedPopup.java | 24 +++++++++++++++---- .../io/rpg/gui/PointsPopupController.java | 14 +++++++++++ .../io/rpg/gui/points-earned-view.fxml | 15 ++++++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 src/main/java/io/rpg/gui/PointsPopupController.java create mode 100644 src/main/resources/io/rpg/gui/points-earned-view.fxml diff --git a/src/main/java/io/rpg/gui/PointsEarnedPopup.java b/src/main/java/io/rpg/gui/PointsEarnedPopup.java index 02adff31..994d6b40 100644 --- a/src/main/java/io/rpg/gui/PointsEarnedPopup.java +++ b/src/main/java/io/rpg/gui/PointsEarnedPopup.java @@ -1,23 +1,37 @@ package io.rpg.gui; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; import javafx.scene.Scene; -import javafx.scene.control.Label; -import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.stage.StageStyle; +import java.io.IOException; +import java.util.Objects; + public class PointsEarnedPopup { + + public static void showPopup(int pointsCount, Scene scene){ - VBox pauseRoot = new VBox(5); - pauseRoot.getChildren().add(new Label("Earned " + pointsCount + " points")); + Parent root = null; + + FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(PointsEarnedPopup.class.getResource("points-earned-view.fxml"))); + try { + root = loader.load(); + } catch (IOException e) { + e.printStackTrace(); + } Stage popupStage = new Stage(StageStyle.TRANSPARENT); popupStage.initOwner(scene.getWindow()); popupStage.initModality(Modality.APPLICATION_MODAL); - popupStage.setScene(new Scene(pauseRoot, Color.TRANSPARENT)); + popupStage.setScene(new Scene(root, Color.TRANSPARENT)); + + PointsPopupController controller = loader.getController(); + controller.setPointsCount(pointsCount); popupStage.show(); diff --git a/src/main/java/io/rpg/gui/PointsPopupController.java b/src/main/java/io/rpg/gui/PointsPopupController.java new file mode 100644 index 00000000..7761e853 --- /dev/null +++ b/src/main/java/io/rpg/gui/PointsPopupController.java @@ -0,0 +1,14 @@ +package io.rpg.gui; + +import javafx.fxml.FXML; +import javafx.scene.control.Label; + +public class PointsPopupController { + + @FXML + private Label label; + + protected void setPointsCount(int pointsCount) { + label.setText("Earned " + pointsCount + " points"); + } +} \ No newline at end of file diff --git a/src/main/resources/io/rpg/gui/points-earned-view.fxml b/src/main/resources/io/rpg/gui/points-earned-view.fxml new file mode 100644 index 00000000..fc332765 --- /dev/null +++ b/src/main/resources/io/rpg/gui/points-earned-view.fxml @@ -0,0 +1,15 @@ + + + + + + + + + + + From eeb1ed74ef6d46cf6056b35b462086ddd6c212c8 Mon Sep 17 00:00:00 2001 From: mhawryluk Date: Sat, 2 Apr 2022 18:02:17 +0200 Subject: [PATCH 05/18] refactor: Move popup classes into popups package --- src/main/java/io/rpg/gui/LocationController.java | 6 +----- .../java/io/rpg/gui/{ => popups}/PointsEarnedPopup.java | 2 +- .../java/io/rpg/gui/{ => popups}/PointsPopupController.java | 2 +- src/main/java/module-info.java | 1 + .../io/rpg/gui/{ => popups}/points-earned-view.fxml | 2 +- 5 files changed, 5 insertions(+), 8 deletions(-) rename src/main/java/io/rpg/gui/{ => popups}/PointsEarnedPopup.java (97%) rename src/main/java/io/rpg/gui/{ => popups}/PointsPopupController.java (90%) rename src/main/resources/io/rpg/gui/{ => popups}/points-earned-view.fxml (90%) diff --git a/src/main/java/io/rpg/gui/LocationController.java b/src/main/java/io/rpg/gui/LocationController.java index 845d1da5..70b8ce7f 100644 --- a/src/main/java/io/rpg/gui/LocationController.java +++ b/src/main/java/io/rpg/gui/LocationController.java @@ -1,15 +1,11 @@ package io.rpg.gui; import io.rpg.gui.model.LocationModel; -import io.rpg.model.GameObjectStandIn; -import javafx.event.EventType; +import io.rpg.gui.popups.PointsEarnedPopup; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; -import javafx.geometry.Rectangle2D; -import javafx.scene.Parent; import javafx.scene.Scene; -import javafx.scene.SubScene; import javafx.scene.image.ImageView; import javafx.scene.input.KeyEvent; import javafx.scene.layout.HBox; diff --git a/src/main/java/io/rpg/gui/PointsEarnedPopup.java b/src/main/java/io/rpg/gui/popups/PointsEarnedPopup.java similarity index 97% rename from src/main/java/io/rpg/gui/PointsEarnedPopup.java rename to src/main/java/io/rpg/gui/popups/PointsEarnedPopup.java index 994d6b40..ffb5b135 100644 --- a/src/main/java/io/rpg/gui/PointsEarnedPopup.java +++ b/src/main/java/io/rpg/gui/popups/PointsEarnedPopup.java @@ -1,4 +1,4 @@ -package io.rpg.gui; +package io.rpg.gui.popups; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; diff --git a/src/main/java/io/rpg/gui/PointsPopupController.java b/src/main/java/io/rpg/gui/popups/PointsPopupController.java similarity index 90% rename from src/main/java/io/rpg/gui/PointsPopupController.java rename to src/main/java/io/rpg/gui/popups/PointsPopupController.java index 7761e853..959424b8 100644 --- a/src/main/java/io/rpg/gui/PointsPopupController.java +++ b/src/main/java/io/rpg/gui/popups/PointsPopupController.java @@ -1,4 +1,4 @@ -package io.rpg.gui; +package io.rpg.gui.popups; import javafx.fxml.FXML; import javafx.scene.control.Label; diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 0db4b668..98ccf0b8 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -10,4 +10,5 @@ opens io.rpg.gui to javafx.fxml; exports io.rpg; + opens io.rpg.gui.popups to javafx.fxml; } \ No newline at end of file diff --git a/src/main/resources/io/rpg/gui/points-earned-view.fxml b/src/main/resources/io/rpg/gui/popups/points-earned-view.fxml similarity index 90% rename from src/main/resources/io/rpg/gui/points-earned-view.fxml rename to src/main/resources/io/rpg/gui/popups/points-earned-view.fxml index fc332765..0c45b2d7 100644 --- a/src/main/resources/io/rpg/gui/points-earned-view.fxml +++ b/src/main/resources/io/rpg/gui/popups/points-earned-view.fxml @@ -4,7 +4,7 @@ - +

%m-IK;6Flk5PPF%KU2p@bf(4H1|* d1D*y(9k7L2|LNBH7Y{&D;_2$=vd$@?2>^%{80`Q6 literal 0 HcmV?d00001 diff --git a/assets/someDudeButGreen.png b/assets/someDudeButGreen.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3c70249023a506278c06c04d48f6ee198233ff GIT binary patch literal 4692 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFt%noI|q0=J1Z0v<)>xlq%tsQ zOst(~>v1?hq}Bhjm#dcOEyp8@&ZV0av>s`M>NK@p3d^{9@X6Bp3r8j_*YU_2=>Y*Jmo zU=0-EEbxddW?;}$24TjErS@e&LG}_)Usv{LER4dEN`hb0{DDG}C9V-A&iT2ysd*&~ z&PAz-C8;S2<(VZJ3hti10pX2&;tUJ|+MX_sArYL63Ig}v1NDr8(GVEe5MU%={eJ@T zq)216iv@=XaEl-ANynjtcwu>$nK%{WasUH0EXHXok^~bHdq9{&%K_(nof#zUCSSl6 zRD|TQ=_5G=w(@TsxFXeHWcBzwgUbP6{rEH@TY!&^WCm7GVHHF&5MC!B ziIKy^X%9{bT()Gc7sl(T>49%aGLvYEa*#jN|1MUE#f(bdy3FQW2Q$Ng1k{zI+unBKD@Zf(0,0), someDude1)) + .addMapObject(new GameObjectStandIn(new Pair<>(0,5), someDude1)) + .addMapObject(new GameObjectStandIn(new Pair<>(5,5), someDude2)); + } } \ No newline at end of file diff --git a/src/main/java/io/rpg/gui/DisplayLayer.java b/src/main/java/io/rpg/gui/DisplayLayer.java new file mode 100644 index 00000000..3a2ac83e --- /dev/null +++ b/src/main/java/io/rpg/gui/DisplayLayer.java @@ -0,0 +1,31 @@ +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(); + } + + +} diff --git a/src/main/java/io/rpg/gui/LocationController.java b/src/main/java/io/rpg/gui/LocationController.java new file mode 100644 index 00000000..58bdd9e8 --- /dev/null +++ b/src/main/java/io/rpg/gui/LocationController.java @@ -0,0 +1,75 @@ +package io.rpg.gui; + +import io.rpg.gui.model.LocationModel; +import io.rpg.model.GameObjectStandIn; +import javafx.event.EventType; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.fxml.Initializable; +import javafx.geometry.Rectangle2D; +import javafx.scene.Parent; +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 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; + + 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); + } + + public void onKeyTyped(KeyEvent event) { + // TODO: 01.04.2022 Implement key actions + + System.out.println(event); + + } + + 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 new file mode 100644 index 00000000..e7584055 --- /dev/null +++ b/src/main/java/io/rpg/gui/model/LocationModel.java @@ -0,0 +1,64 @@ +package io.rpg.gui.model; + +import io.rpg.gui.LocationController; +import io.rpg.model.GameObjectStandIn; +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 { + + private final ObjectProperty background; + // TODO: 01.04.2022 Think about a better name + private final ObservableList mapObjects; + + private HashMap gameObject2NodeMap; + private final LocationController controller; + + public LocationModel(ObjectProperty background, ObservableList mapObjects, LocationController controller) { + this.background = background; + this.mapObjects = mapObjects; + this.gameObject2NodeMap = new HashMap<>(); + this.controller = controller; + } + + public LocationModel clear(){ + this.gameObject2NodeMap = new HashMap<>(); + mapObjects.clear(); + return this; + } + + public LocationModel setBackgroundImage(Image backgroundImage){ + background.setValue(backgroundImage); + return this; + } + + public LocationModel addMapObject(GameObjectStandIn gameObject){ + ImageView imageView = new ImageView(gameObject.getImage()); + Pair mapPosition = getMapPosition(gameObject.getPosition()); + imageView.setX(mapPosition.getKey()); + imageView.setY(mapPosition.getValue()); + gameObject2NodeMap.put(gameObject, imageView); + mapObjects.add(imageView); + imageView.setOnMouseClicked((e) -> onGameObjectAction(gameObject)); + return this; + } + + private void onGameObjectAction(GameObjectStandIn source){ + // TODO: 01.04.2022 What to do when some GameObject was clicked + System.out.println(source); + } + + // TODO: 01.04.2022 Replace with Position + private Pair getMapPosition(Pair position){ + int scale = 32; + return new Pair<>(position.getKey() * scale, position.getValue() * scale); + } + + +} diff --git a/src/main/java/io/rpg/model/GameObjectStandIn.java b/src/main/java/io/rpg/model/GameObjectStandIn.java new file mode 100644 index 00000000..ff7e92d2 --- /dev/null +++ b/src/main/java/io/rpg/model/GameObjectStandIn.java @@ -0,0 +1,26 @@ +package io.rpg.model; + +import javafx.scene.image.Image; +import javafx.util.Pair; + +/** + * A Temporary Class waiting to be replaced with GameObject class from branch RPG-79 + */ +public class GameObjectStandIn { + + private Pair 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/module-info.java b/src/main/java/module-info.java index 08bc4677..65ea568b 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -18,5 +18,6 @@ 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; exports io.rpg; } diff --git a/src/main/resources/io/rpg/gui/location-view.fxml b/src/main/resources/io/rpg/gui/location-view.fxml new file mode 100644 index 00000000..2e91c75d --- /dev/null +++ b/src/main/resources/io/rpg/gui/location-view.fxml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + From dbb5dd27a69055cd5de453fe5b5f7a5e63f29e32 Mon Sep 17 00:00:00 2001 From: Marcin Hawryluk <70582973+mhawryluk@users.noreply.github.com> Date: Thu, 7 Apr 2022 18:11:33 +0200 Subject: [PATCH 18/18] @mhawryluk/rpg 82 points earned popup (#9) * chore: Init gui * feat: now location is centered * feat: Add popup creation class for point earning * feat: Read popup layout from FXML and set pointCount via controller * refactor: Move popup classes into popups package * chore: Add background image and improve styling of points popup * fix: Add background image to assets * refactor: Add comments to popup class * refactor: Make showPopup method not static * refactor: Turn showPopup into getPopup, make it return Stage * test: Add test for hiding a popup when no focus * fix: Quick fix * fix: Remove tests for now * fix: module-info Co-authored-by: co012 Co-authored-by: Kacper Kafara --- assets/point-popup-bg.png | Bin 0 -> 2048 bytes src/main/java/io/rpg/HelloApplication.java | 14 +++-- .../java/io/rpg/gui/LocationController.java | 10 +-- .../io/rpg/gui/popups/PointsEarnedPopup.java | 58 ++++++++++++++++++ .../rpg/gui/popups/PointsPopupController.java | 28 +++++++++ src/main/java/module-info.java | 3 +- .../io/rpg/gui/popups/points-earned-view.fxml | 15 +++++ 7 files changed, 118 insertions(+), 10 deletions(-) create mode 100644 assets/point-popup-bg.png create mode 100644 src/main/java/io/rpg/gui/popups/PointsEarnedPopup.java create mode 100644 src/main/java/io/rpg/gui/popups/PointsPopupController.java create mode 100644 src/main/resources/io/rpg/gui/popups/points-earned-view.fxml diff --git a/assets/point-popup-bg.png b/assets/point-popup-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..5311546904a602495126d440604f6da56e7d4a03 GIT binary patch literal 2048 zcmeAS@N?(olHy`uVBq!ia0y~yV2lH@*K@D|$*q&N2>~g_;vjb?hIQv;UNSJS@A7nU z45^5Fd)F{4Bv9n|!%mJ{H@L-`Zrs|Je&}{ut{@{5OC2}I`fi5? zhQ>6;hq-Lq`+%~CUh@ekI4p>CsF;0lt+GSIfomV);$tT%f>b#&_0O~U``q)8HOIAN z4grM?-VPOad6`%^Ot?Anjdzr?a0m#*m4oa!%XH{APo6B$3O=s)w?7v*0i_f+I6wG0 z+dTTeTScrSP?HEJN50^i<3b7!3DX-s?2-m5$q*B`msao^s8(UmJD@QvvshcUOWv^p zs^(a4jo+a_BbY~xfJ7P{!XjI!;{UsQYxmEczJA}`U)MK$;TE{JG%3!%;Xpj&!?SwL zAJX!caR}VVF*`Inmigh?J3fNIIQ=LqaBs#r1x6;jk7?x&6~^YlEPj3pop1W}W zeg5$8QM$};^E)l&A16vF6wG2eWc}_=Yx$g|>Vgql8$R?|$32uyf9c5*rmL{$abI}F z@yIHn#!zmK_d6bo-Yc9o&n4k1NJ|A&OY4D22l{@jY<0dk?a!6N8~KW%6 zABT$9{2>*udvg^GrZ#-ICO`edHR;<930jN~*V^knTx-6q@jwXEq3HUUL(%y;%#ABq z%395Ty4||_T%ND){eAs7ow{S|@^}1vb}PvXnC412IP&*y^566In3=!~FQD1|-lUk_ zvi;wVmhJa$urUR5ZfW`c`0-xfefAaGzGwg6bD@8-u9`706XtROt=LDB6}k^&6&{tF z-Z`*q->y5SzJL2u!?=37kV1hE$YWA=9|`#QkJ6W4kA?14B};Sos4DFFdR&!q|E(5? z5PD*tZ}C(AVSduvUw3!?ceb7O|5)wy>l%Aj|4@JEE3iUb;9lXeL)PamP3Bk=(0,0), someDude1)) .addMapObject(new GameObjectStandIn(new Pair<>(0,5), someDude1)) .addMapObject(new GameObjectStandIn(new Pair<>(5,5), someDude2)); - } + } } \ No newline at end of file diff --git a/src/main/java/io/rpg/gui/LocationController.java b/src/main/java/io/rpg/gui/LocationController.java index 58bdd9e8..80a092d1 100644 --- a/src/main/java/io/rpg/gui/LocationController.java +++ b/src/main/java/io/rpg/gui/LocationController.java @@ -1,18 +1,16 @@ package io.rpg.gui; import io.rpg.gui.model.LocationModel; -import io.rpg.model.GameObjectStandIn; -import javafx.event.EventType; +import io.rpg.gui.popups.PointsEarnedPopup; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; -import javafx.geometry.Rectangle2D; -import javafx.scene.Parent; 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; @@ -28,6 +26,8 @@ public class LocationController implements Initializable { private LocationModel model; private Scene scene; + private final PointsEarnedPopup pointsPopup = new PointsEarnedPopup(); + public static LocationController load() throws IOException { FXMLLoader loader = new FXMLLoader(FXML_URL); loader.load(); @@ -63,6 +63,8 @@ public void onKeyTyped(KeyEvent event) { System.out.println(event); + Stage pointPopupStage = pointsPopup.getPopup(5, scene); + pointPopupStage.show(); } public LocationModel getModel(){ diff --git a/src/main/java/io/rpg/gui/popups/PointsEarnedPopup.java b/src/main/java/io/rpg/gui/popups/PointsEarnedPopup.java new file mode 100644 index 00000000..bec00a61 --- /dev/null +++ b/src/main/java/io/rpg/gui/popups/PointsEarnedPopup.java @@ -0,0 +1,58 @@ +package io.rpg.gui.popups; + +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.paint.Color; +import javafx.stage.Stage; +import javafx.stage.StageStyle; +import javafx.stage.Window; +import javafx.util.Pair; + +import java.io.IOException; +import java.util.Objects; + +public class PointsEarnedPopup { + + private final FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(PointsEarnedPopup.class.getResource("points-earned-view.fxml")));; + private Parent root; + private PointsPopupController controller; + private final Scene popupScene; + + public PointsEarnedPopup(){ + // read FXML view + try { + root = loader.load(); + } catch (IOException e) { + e.printStackTrace(); + } + + popupScene = new Scene(root, Color.TRANSPARENT); + } + + public Stage getPopup(int pointsCount, Scene scene){ + // fill dynamic view components + if (controller == null) controller = loader.getController(); + controller.setPointsCount(pointsCount); + Pair backgroundDims = controller.setBackgroundImage("file:assets/point-popup-bg.png"); + + // create popup stage + Stage popupStage = new Stage(StageStyle.TRANSPARENT); + Window window = scene.getWindow(); + popupStage.initOwner(window); + + // add and center popupScene on popup stage + popupStage.setScene(popupScene); + popupStage.setX(window.getX() + window.getWidth()/2 - backgroundDims.getKey()/2); + popupStage.setY(window.getY() + window.getHeight()/2 - backgroundDims.getValue()/2); + + // close popup after clicking aside + popupStage.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> { + if (!isNowFocused) { + popupStage.close(); + } + }); + + return popupStage; + } +} diff --git a/src/main/java/io/rpg/gui/popups/PointsPopupController.java b/src/main/java/io/rpg/gui/popups/PointsPopupController.java new file mode 100644 index 00000000..a5d60352 --- /dev/null +++ b/src/main/java/io/rpg/gui/popups/PointsPopupController.java @@ -0,0 +1,28 @@ +package io.rpg.gui.popups; + +import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.layout.*; +import javafx.util.Pair; + +public class PointsPopupController { + + @FXML private Label label; + @FXML private Pane background; + + protected void setPointsCount(int pointsCount) { + label.setText("Earned " + pointsCount + " points!"); + } + + protected Pair setBackgroundImage(String url){ + BackgroundImage backgroundImg= new BackgroundImage( + new Image(url), + BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, + BackgroundPosition.DEFAULT, + BackgroundSize.DEFAULT + ); + 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 65ea568b..b613de50 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -17,7 +17,8 @@ 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; + exports io.rpg; } diff --git a/src/main/resources/io/rpg/gui/popups/points-earned-view.fxml b/src/main/resources/io/rpg/gui/popups/points-earned-view.fxml new file mode 100644 index 00000000..bbde17d2 --- /dev/null +++ b/src/main/resources/io/rpg/gui/popups/points-earned-view.fxml @@ -0,0 +1,15 @@ + + + + + + + + + + +