From d9437c1b8aa9d3c419b127fa95ac50384278463f Mon Sep 17 00:00:00 2001
From: Bas Antonius de Jong <49651652+BAFGdeJong@users.noreply.github.com>
Date: Tue, 2 Dec 2025 10:57:46 +0100
Subject: [PATCH] Tutorials to Dev (#264)
* Fixed garbage code
* added a pop button
* Tutorial images now use ImageAsset.java
* Added button to continue and start game. Refactors
* Refactored nextScreen runnable
* Removed unused imports
* Refactored switch statement
* Added documentation
* Removed space
* Added translations
* Added function input for enabling/disabling localization p/text
---------
Co-authored-by: ramollia <>
---
.../java/org/toop/app/widget/Primitive.java | 3 +-
.../java/org/toop/app/widget/Updatable.java | 5 +
.../toop/app/widget/complex/PopupWidget.java | 14 ++
.../org/toop/app/widget/popup/QuitPopup.java | 5 +
.../widget/tutorial/BaseTutorialWidget.java | 133 +++++++++++++-----
.../tutorial/Connect4TutorialWidget.java | 42 ++----
.../tutorial/ReversiTutorialWidget.java | 44 ++----
.../tutorial/ShowEnableTutorialWidget.java | 22 +++
.../org/toop/app/widget/tutorial/TState.java | 44 ------
.../tutorial/TicTacToeTutorialWidget.java | 44 ++----
.../org/toop/app/widget/view/GameView.java | 18 +--
.../app/widget/view/LocalMultiplayerView.java | 102 ++++----------
.../localization/localization_ar.properties | 2 +
.../localization/localization_de.properties | 2 +
.../localization/localization_en.properties | 2 +
.../localization/localization_es.properties | 2 +
.../localization/localization_fr.properties | 2 +
.../localization/localization_hi.properties | 2 +
.../localization/localization_it.properties | 2 +
.../localization/localization_ja.properties | 2 +
.../localization/localization_ko.properties | 2 +
.../localization/localization_nl.properties | 2 +
.../localization/localization_ru.properties | 2 +
.../localization/localization_zh.properties | 2 +
.../resource/resources/ImageAsset.java | 5 +-
25 files changed, 224 insertions(+), 281 deletions(-)
create mode 100644 app/src/main/java/org/toop/app/widget/Updatable.java
create mode 100644 app/src/main/java/org/toop/app/widget/tutorial/ShowEnableTutorialWidget.java
delete mode 100644 app/src/main/java/org/toop/app/widget/tutorial/TState.java
diff --git a/app/src/main/java/org/toop/app/widget/Primitive.java b/app/src/main/java/org/toop/app/widget/Primitive.java
index ce68e4b..a50e4e4 100644
--- a/app/src/main/java/org/toop/app/widget/Primitive.java
+++ b/app/src/main/java/org/toop/app/widget/Primitive.java
@@ -54,8 +54,7 @@ public final class Primitive {
return text(key, true);
}
- public static ImageView image(File file) {
- ImageAsset imageAsset = new ImageAsset(file);
+ public static ImageView image(ImageAsset imageAsset) {
ImageView imageView = new ImageView(imageAsset.getImage());
imageView.getStyleClass().add("image");
imageView.setPreserveRatio(true);
diff --git a/app/src/main/java/org/toop/app/widget/Updatable.java b/app/src/main/java/org/toop/app/widget/Updatable.java
new file mode 100644
index 0000000..cdee4cb
--- /dev/null
+++ b/app/src/main/java/org/toop/app/widget/Updatable.java
@@ -0,0 +1,5 @@
+package org.toop.app.widget;
+
+public interface Updatable {
+ void update();
+}
diff --git a/app/src/main/java/org/toop/app/widget/complex/PopupWidget.java b/app/src/main/java/org/toop/app/widget/complex/PopupWidget.java
index 853bf88..4f6bee1 100644
--- a/app/src/main/java/org/toop/app/widget/complex/PopupWidget.java
+++ b/app/src/main/java/org/toop/app/widget/complex/PopupWidget.java
@@ -1,7 +1,21 @@
package org.toop.app.widget.complex;
+import javafx.geometry.Pos;
+import javafx.scene.control.Button;
+
public abstract class PopupWidget extends StackWidget {
+ private final Button popButton;
+
public PopupWidget() {
super("bg-popup");
+
+ popButton = new Button("X");
+ popButton.setOnAction(_ -> hide());
+
+ add(Pos.TOP_RIGHT, popButton);
+ }
+
+ protected void setOnPop(Runnable onPop) {
+ popButton.setOnAction(_ -> onPop.run());
}
}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/widget/popup/QuitPopup.java b/app/src/main/java/org/toop/app/widget/popup/QuitPopup.java
index 04349dc..264e936 100644
--- a/app/src/main/java/org/toop/app/widget/popup/QuitPopup.java
+++ b/app/src/main/java/org/toop/app/widget/popup/QuitPopup.java
@@ -20,5 +20,10 @@ public class QuitPopup extends PopupWidget {
});
add(Pos.CENTER, confirmWidget);
+
+ setOnPop(() -> {
+ App.stopQuit();
+ hide();
+ });
}
}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/widget/tutorial/BaseTutorialWidget.java b/app/src/main/java/org/toop/app/widget/tutorial/BaseTutorialWidget.java
index b12d727..ee963b5 100644
--- a/app/src/main/java/org/toop/app/widget/tutorial/BaseTutorialWidget.java
+++ b/app/src/main/java/org/toop/app/widget/tutorial/BaseTutorialWidget.java
@@ -1,60 +1,115 @@
package org.toop.app.widget.tutorial;
import javafx.geometry.Pos;
+import javafx.scene.control.Button;
import javafx.scene.image.ImageView;
import javafx.scene.text.Text;
+import org.apache.maven.surefire.shared.lang3.tuple.ImmutablePair;
import org.toop.app.widget.Primitive;
-import org.toop.app.widget.complex.ViewWidget;
+import org.toop.app.widget.Updatable;
+import org.toop.app.widget.WidgetContainer;
+import org.toop.app.widget.complex.PopupWidget;
-import javafx.scene.control.Button;
+import org.toop.framework.resource.resources.ImageAsset;
import org.toop.local.AppContext;
-import java.io.File;
+import java.util.List;
-public class BaseTutorialWidget extends ViewWidget {
+/**
+ * A widget base for all the tutorial widgets.
+ *
+ *
Usage example:
+ *
+ *
{@code
+ * public class Connect4TutorialWidget extends BaseTutorialWidget {
+ * public Connect4TutorialWidget(Runnable nextScreen) {
+ * super(List.of(
+ * new ImmutablePair<>("connect4.1", ResourceManager.get("connect41.png")),
+ * new ImmutablePair<>("connect4.2", ResourceManager.get("connect42.png"))
+ * ), nextScreen);
+ * }
+ * }
+ */
+public class BaseTutorialWidget extends PopupWidget implements Updatable {
- private TState state;
- private Text tutorialText;
- private Button previousButton;
- private Button nextButton;
- private Button noButton;
- private Button yesButton;
- private Button neverButton;
- private ImageView imagery;
+ private final Text tutorialText;
+ private final ImageView imagery;
+ private final Button previousButton;
+ private final Button nextButton;
+ private final List> pages;
+ private final Runnable nextScreen;
- public BaseTutorialWidget(String key, Runnable onNo, Runnable onYes, Runnable onNever) {
- System.out.println("Trying to initialize...");
- this.tutorialText = Primitive.text(key);
- this.yesButton = Primitive.button("ok", () -> onYes.run());
- this.noButton = Primitive.button("no", () -> onNo.run());
- this.neverButton = Primitive.button("never", () -> onNever.run());
- var a = Primitive.hbox(yesButton, noButton, neverButton);
- add(Pos.CENTER, Primitive.vbox(tutorialText, a));
- }
+ private int pageIndex = 0;
- public BaseTutorialWidget(TState state, String key, Runnable onPrevious, Runnable onNext) {
- this.state = state;
- this.tutorialText = Primitive.text(key);
- this.previousButton = Primitive.button("<", () -> onPrevious.run());
- this.nextButton = Primitive.button(">", () -> onNext.run());
- var w = Primitive.hbox(previousButton, nextButton);
- add(Pos.CENTER, Primitive.vbox(tutorialText, w));
- }
+ public BaseTutorialWidget(List> pages, Runnable nextScreen) {
+ this.tutorialText = Primitive.text(pages.getFirst().getKey());
+ this.imagery = Primitive.image(pages.getFirst().getValue());
+
+ this.pages = pages;
+ this.nextScreen = nextScreen;
+
+ previousButton = Primitive.button("goback", () -> { update(false); this.hide(); });
+ nextButton = Primitive.button(">", () -> update(true));
+
+ var w = Primitive.hbox(
+ previousButton,
+ nextButton
+ );
+
+ var x = Primitive.vbox(imagery, tutorialText);
- public BaseTutorialWidget(TState state, String key, File image, Runnable onPrevious, Runnable onNext) {
- this.state = state;
- this.imagery = Primitive.image(image);
- this.tutorialText = Primitive.text(key);
- this.previousButton = Primitive.button("<", () -> onPrevious.run());
- this.nextButton = Primitive.button(">", () -> onNext.run());
- var w = Primitive.hbox(previousButton, nextButton);
- var x = Primitive.vbox(imagery, tutorialText);
add(Pos.CENTER, Primitive.vbox(x, w));
+
+ WidgetContainer.add(Pos.CENTER, this);
}
- public void update(String key, File image) {
+ @Override
+ public void update() {
+ update(true);
+ }
+
+ // TODO Refactor if statements to make code easier to read.
+ public void update(boolean next) {
+ pageIndex = next ? pageIndex + 1 : pageIndex - 1;
+
+ if (pageIndex >= pages.size()) {
+ pageIndex--;
+ return;
+ } else if (pageIndex < 0) {
+ pageIndex++;
+ return;
+ }
+
+ if (pageIndex == pages.size()-1) {
+ nextButton.textProperty().unbind();
+ nextButton.setText(AppContext.getString("startgame"));
+ nextButton.setOnAction((_) -> {
+ this.hide();
+ nextScreen.run();
+ });
+ } else {
+ nextButton.textProperty().unbind();
+ nextButton.setText(AppContext.getString(">"));
+ nextButton.setOnAction((_) -> this.update(true));
+ }
+
+ if (pageIndex == 0) {
+ previousButton.textProperty().unbind();
+ previousButton.setText(AppContext.getString("goback"));
+ previousButton.setOnAction((_) -> this.hide());
+ } else {
+ previousButton.textProperty().unbind();
+ previousButton.setText(AppContext.getString("<"));
+ previousButton.setOnAction((_) -> this.update(false));
+ }
+
+ var currentPage = pages.get(pageIndex);
+
+ var text = currentPage.getKey();
+ var image = currentPage.getValue();
+
tutorialText.textProperty().unbind();
- tutorialText.setText(AppContext.getString(key));
+ tutorialText.setText(AppContext.getString(text));
imagery.setImage(Primitive.image(image).getImage());
}
}
diff --git a/app/src/main/java/org/toop/app/widget/tutorial/Connect4TutorialWidget.java b/app/src/main/java/org/toop/app/widget/tutorial/Connect4TutorialWidget.java
index 1fdd4e3..c1cec7d 100644
--- a/app/src/main/java/org/toop/app/widget/tutorial/Connect4TutorialWidget.java
+++ b/app/src/main/java/org/toop/app/widget/tutorial/Connect4TutorialWidget.java
@@ -1,39 +1,15 @@
package org.toop.app.widget.tutorial;
-import javafx.geometry.Pos;
-import org.toop.app.widget.complex.ViewWidget;
+import org.apache.maven.surefire.shared.lang3.tuple.ImmutablePair;
+import org.toop.framework.resource.ResourceManager;
-import java.io.File;
+import java.util.List;
-public class Connect4TutorialWidget extends ViewWidget {
- private TState state;
- private String[] keys = {"connect4.1", "connect4.2"};
- private File[] images = {new File("app/src/main/resources/assets/images/connect41.png"), new File("app/src/main/resources/assets/images/connect42.png")};
- private BaseTutorialWidget tutorialWidget;
-
- public Connect4TutorialWidget() {
- this.state = new TState(keys.length);
- tutorialWidget = new BaseTutorialWidget(
- state,
- keys[state.getCurrent()],
- images[state.getCurrent()],
- () -> {
- if (state.hasPrevious()) {
- state.previous();
- update();
- }
- },
- () -> {
- if (state.hasNext()) {
- state.next();
- update();
- }
- }
- );
- add(Pos.CENTER, tutorialWidget);
- }
-
- private void update() {
- tutorialWidget.update(keys[state.getCurrent()], images[state.getCurrent()]);
+public class Connect4TutorialWidget extends BaseTutorialWidget {
+ public Connect4TutorialWidget(Runnable nextScreen) {
+ super(List.of(
+ new ImmutablePair<>("connect4.1", ResourceManager.get("connect41.png")),
+ new ImmutablePair<>("connect4.2", ResourceManager.get("connect42.png"))
+ ), nextScreen);
}
}
diff --git a/app/src/main/java/org/toop/app/widget/tutorial/ReversiTutorialWidget.java b/app/src/main/java/org/toop/app/widget/tutorial/ReversiTutorialWidget.java
index 1ec990a..af72eeb 100644
--- a/app/src/main/java/org/toop/app/widget/tutorial/ReversiTutorialWidget.java
+++ b/app/src/main/java/org/toop/app/widget/tutorial/ReversiTutorialWidget.java
@@ -1,39 +1,17 @@
package org.toop.app.widget.tutorial;
-import javafx.geometry.Pos;
-import org.toop.app.widget.complex.ViewWidget;
+import org.apache.maven.surefire.shared.lang3.tuple.ImmutablePair;
+import org.toop.framework.resource.ResourceManager;
-import java.io.File;
+import java.util.List;
-public class ReversiTutorialWidget extends ViewWidget {
- private TState state;
- private String[] keys = {"reversi1", "reversi2", "reversi3", "reversi4"};
- private File[] images = {new File("app/src/main/resources/assets/images/reversi1.png"), new File("app/src/main/resources/assets/images/reversi2.png"), new File("app/src/main/resources/assets/images/cat.jpg"), new File("app/src/main/resources/assets/images/cat.jpg")};
- private BaseTutorialWidget tutorialWidget;
-
- public ReversiTutorialWidget() {
- this.state = new TState(keys.length);
- tutorialWidget = new BaseTutorialWidget(
- state,
- keys[state.getCurrent()],
- images[state.getCurrent()],
- () -> {
- if (state.hasPrevious()) {
- state.previous();
- update();
- }
- },
- () -> {
- if (state.hasNext()) {
- state.next();
- update();
- }
- }
- );
- add(Pos.CENTER, tutorialWidget);
- }
-
- private void update() {
- tutorialWidget.update(keys[state.getCurrent()], images[state.getCurrent()]);
+public class ReversiTutorialWidget extends BaseTutorialWidget {
+ public ReversiTutorialWidget(Runnable nextScreen) {
+ super(List.of(
+ new ImmutablePair<>("reversi1", ResourceManager.get("reversi1.png")),
+ new ImmutablePair<>("reversi2", ResourceManager.get("reversi2.png")),
+ new ImmutablePair<>("reversi3", ResourceManager.get("cat.jpg")),
+ new ImmutablePair<>("reversi4", ResourceManager.get("cat.jpg"))
+ ), nextScreen);
}
}
diff --git a/app/src/main/java/org/toop/app/widget/tutorial/ShowEnableTutorialWidget.java b/app/src/main/java/org/toop/app/widget/tutorial/ShowEnableTutorialWidget.java
new file mode 100644
index 0000000..62fa0c7
--- /dev/null
+++ b/app/src/main/java/org/toop/app/widget/tutorial/ShowEnableTutorialWidget.java
@@ -0,0 +1,22 @@
+package org.toop.app.widget.tutorial;
+
+import javafx.geometry.Pos;
+import org.toop.app.widget.Primitive;
+import org.toop.app.widget.WidgetContainer;
+import org.toop.app.widget.complex.PopupWidget;
+import org.toop.local.AppSettings;
+
+public class ShowEnableTutorialWidget extends PopupWidget {
+
+ public ShowEnableTutorialWidget(Runnable tutorial, Runnable nextScreen, Runnable appSettingsSetter) {
+ var a = Primitive.hbox(
+ Primitive.button("ok", () -> { appSettingsSetter.run(); tutorial.run(); this.hide(); }),
+ Primitive.button("no", () -> { appSettingsSetter.run(); nextScreen.run(); this.hide(); }),
+ Primitive.button("never", () -> { AppSettings.getSettings().setTutorialFlag(false); nextScreen.run(); this.hide(); })
+ );
+
+ var txt = Primitive.text("tutorial");
+ add(Pos.CENTER, Primitive.vbox(txt, a));
+ WidgetContainer.add(Pos.CENTER, this);
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/toop/app/widget/tutorial/TState.java b/app/src/main/java/org/toop/app/widget/tutorial/TState.java
deleted file mode 100644
index 4efc2d2..0000000
--- a/app/src/main/java/org/toop/app/widget/tutorial/TState.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.toop.app.widget.tutorial;
-
-public class TState {
-
- private int current;
- private int total;
-
- public TState(int total) {
- this.total = total;
- this.current = 0;
- }
-
- public int getCurrent() {
- return current;
- }
-
- public void setCurrent(int current) {
- this.current = current;
- }
-
- public int getTotal() {
- return total;
- }
-
- public void setTotal(int total) {
- this.total = total;
- }
-
- public void next() {
- current = current + 1;
- }
-
- public void previous() {
- current = current - 1;
- }
-
- public boolean hasNext() {
- return current < total - 1;
- }
-
- public boolean hasPrevious() {
- return current > 0;
- }
-}
diff --git a/app/src/main/java/org/toop/app/widget/tutorial/TicTacToeTutorialWidget.java b/app/src/main/java/org/toop/app/widget/tutorial/TicTacToeTutorialWidget.java
index 85355a4..6423a2a 100644
--- a/app/src/main/java/org/toop/app/widget/tutorial/TicTacToeTutorialWidget.java
+++ b/app/src/main/java/org/toop/app/widget/tutorial/TicTacToeTutorialWidget.java
@@ -1,42 +1,16 @@
package org.toop.app.widget.tutorial;
-import javafx.geometry.Pos;
-import org.toop.app.widget.complex.ViewWidget;
-import java.io.File;
+import org.apache.maven.surefire.shared.lang3.tuple.ImmutablePair;
+import org.toop.framework.resource.ResourceManager;
-public class TicTacToeTutorialWidget extends ViewWidget {
+import java.util.List;
- private TState state;
- private String[] keys = {"tictactoe1", "tictactoe2"};
- private File[] images = {
- new File("app/src/main/resources/assets/images/tictactoe1.png"),
- new File("app/src/main/resources/assets/images/tictactoe2.png")
- };
- private BaseTutorialWidget tutorialWidget;
-
- public TicTacToeTutorialWidget() {
- this.state = new TState(keys.length);
- tutorialWidget = new BaseTutorialWidget(
- state,
- keys[state.getCurrent()],
- images[state.getCurrent()],
- () -> {
- if (state.hasPrevious()) {
- state.previous();
- update();
- }
- },
- () -> {
- if (state.hasNext()) {
- state.next();
- update();
- }
- }
- );
- add(Pos.CENTER, tutorialWidget);
+public class TicTacToeTutorialWidget extends BaseTutorialWidget {
+ public TicTacToeTutorialWidget(Runnable nextScreen) {
+ super(List.of(
+ new ImmutablePair<>("tictactoe1", ResourceManager.get("tictactoe1.png")),
+ new ImmutablePair<>("tictactoe2", ResourceManager.get("tictactoe2.png"))
+ ), nextScreen);
}
- private void update() {
- tutorialWidget.update(keys[state.getCurrent()], images[state.getCurrent()]);
- }
}
diff --git a/app/src/main/java/org/toop/app/widget/view/GameView.java b/app/src/main/java/org/toop/app/widget/view/GameView.java
index 334aa51..b866ef4 100644
--- a/app/src/main/java/org/toop/app/widget/view/GameView.java
+++ b/app/src/main/java/org/toop/app/widget/view/GameView.java
@@ -53,23 +53,13 @@ public final class GameView extends ViewWidget {
switch(gameType) {
case "TicTacToe":
- this.tutorialButton = Primitive.button("tutorialstring", () -> {
- transitionNext(new TicTacToeTutorialWidget());
- });
- break;
+ this.tutorialButton = Primitive.button("tutorialstring", () -> new TicTacToeTutorialWidget(() -> {})); break;
case "Reversi":
- this.tutorialButton = Primitive.button("tutorialstring", () -> {
- transitionNext(new ReversiTutorialWidget());
- });
- break;
+ this.tutorialButton = Primitive.button("tutorialstring", () -> new ReversiTutorialWidget(() -> {})); break;
case "Connect4":
- this.tutorialButton = Primitive.button("tutorialstring", () -> {
- transitionNext(new Connect4TutorialWidget());
- });
- break;
+ this.tutorialButton = Primitive.button("tutorialstring", () -> new Connect4TutorialWidget(() -> {})); break;
default:
- this.tutorialButton = null;
- break;
+ this.tutorialButton = null; break;
}
setupLayout();
diff --git a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java
index 5cab8b7..aa11a77 100644
--- a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java
+++ b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java
@@ -10,10 +10,7 @@ import org.toop.app.widget.WidgetContainer;
import org.toop.app.widget.complex.PlayerInfoWidget;
import org.toop.app.widget.complex.ViewWidget;
import org.toop.app.widget.popup.ErrorPopup;
-import org.toop.app.widget.tutorial.BaseTutorialWidget;
-import org.toop.app.widget.tutorial.Connect4TutorialWidget;
-import org.toop.app.widget.tutorial.ReversiTutorialWidget;
-import org.toop.app.widget.tutorial.TicTacToeTutorialWidget;
+import org.toop.app.widget.tutorial.*;
import org.toop.local.AppContext;
import javafx.geometry.Pos;
@@ -40,91 +37,40 @@ public class LocalMultiplayerView extends ViewWidget {
switch (information.type) {
case TICTACTOE:
if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstTTT()) {
- BaseTutorialWidget a = new BaseTutorialWidget(
- "tutorial",
- () -> {
- AppSettings.getSettings().setFirstTTT(false);
- Platform.runLater(() -> {
- new TicTacToeGameThread(information);
- });
- },
- () -> {
- ViewWidget c = new TicTacToeTutorialWidget();
- transitionNext(c);
- WidgetContainer.setCurrentView(c);
- AppSettings.getSettings().setFirstTTT(false);
- },
- () -> {
- AppSettings.getSettings().setTutorialFlag(false);
- Platform.runLater(() -> {
- new TicTacToeGameThread(information);
- });
- }
- );
- transitionNext(a);
- break;
+ new ShowEnableTutorialWidget(
+ () -> new TicTacToeTutorialWidget(() -> new TicTacToeGameThread(information)),
+ () -> Platform.runLater(() -> new TicTacToeGameThread(information)),
+ () -> AppSettings.getSettings().setFirstTTT(false)
+ );
+ } else {
+ new TicTacToeGameThread(information);
}
- new TicTacToeGameThread(information);
break;
case REVERSI:
if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstReversi()) {
- BaseTutorialWidget a = new BaseTutorialWidget(
- "tutorial",
- () -> { Platform.runLater(() -> {
- AppSettings.getSettings().setFirstReversi(false);
- new ReversiGame(information);
- });
- },
- () -> {
- Platform.runLater(() -> {
- ViewWidget c = new ReversiTutorialWidget();
- transitionNext(c);
- WidgetContainer.setCurrentView(c);
- AppSettings.getSettings().setFirstReversi(false);
- });
- },
- () -> {
- Platform.runLater(() -> {
- AppSettings.getSettings().setTutorialFlag(false);
- new ReversiGame(information);
- });
- });
- transitionNext(a);
- break;
+ new ShowEnableTutorialWidget(
+ () -> new ReversiTutorialWidget(() -> new ReversiGame(information)),
+ () -> Platform.runLater(() -> new ReversiGame(information)),
+ () -> AppSettings.getSettings().setFirstReversi(false)
+ );
+ } else {
+ new ReversiGame(information);
}
- new ReversiGame(information);
break;
case CONNECT4:
if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstConnect4()) {
- BaseTutorialWidget a = new BaseTutorialWidget(
- "tutorial",
- () -> { Platform.runLater(() -> {
- AppSettings.getSettings().setFirstConnect4(false);
- new Connect4Game(information);
- });
- },
- () -> {
- Platform.runLater(() -> {
- ViewWidget c = new Connect4TutorialWidget();
- transitionNext(c);
- WidgetContainer.setCurrentView(c);
- AppSettings.getSettings().setFirstConnect4(false);
- });
- },
- () -> {
- Platform.runLater(() -> {
- AppSettings.getSettings().setTutorialFlag(false);
- new Connect4Game(information);
- });
- });
- transitionNext(a);
- break;
+ new ShowEnableTutorialWidget(
+ () -> new Connect4TutorialWidget(() -> new Connect4Game(information)),
+ () -> Platform.runLater(() -> new Connect4Game(information)),
+ () -> AppSettings.getSettings().setFirstConnect4(false)
+ );
+ } else {
+ new Connect4Game(information);
}
- new Connect4Game(information);
break;
- }
+ }
// case BATTLESHIP -> new BattleshipGame(information);
- });
+ });
var playerSection = setupPlayerSections();
diff --git a/app/src/main/resources/assets/localization/localization_ar.properties b/app/src/main/resources/assets/localization/localization_ar.properties
index 39a02fb..703994b 100644
--- a/app/src/main/resources/assets/localization/localization_ar.properties
+++ b/app/src/main/resources/assets/localization/localization_ar.properties
@@ -83,6 +83,8 @@ reversi2=\u0639\u0646\u062f\u0645\u0627 \u062a\u0646\u0642\u0631 \u0639\u0644\u0
reversi3=\u0645\u0631\u062a\u0643 \u0642\u062f \u064a\u062a\u063a\u0627\u0637 \u0625\u0630\u0627 \u0644\u0645 \u064a\u0643\u0646 \u0647\u0646\u0627\u0643 \u062d\u0631\u0643 \u0642\u0627\u0646\u0648\u0646\u064a.
reversi4=\u0627\u0644\u0644\u0627\u0639\u0628 \u0627\u0644\u0630\u064a \u064a\u0641\u0648\u0632 \u0641\u064a \u0646\u0647\u0627\u064a\u0629 \u0627\u0644\u0644\u0639\u0628 \u0647\u0648 \u0627\u0644\u0630\u064a \u064a\u0643\u0648\u0646 \u0644\u062f\u064a\u0647 \u0627\u0644\u0623\u0643\u062b\u0631 \u0645\u0646 \u0627\u0644\u0644\u0648\u0639\u0627\u0628 \u0639\u0644\u0649 \u0627\u0644\u0644\u0648\u062d\u0629.
tutorialstring=\u0627\u0644\u062f\u0631\u0633 \u0627\u0644\u062a\u0648\u0636\u064a\u062d\u064a
+startgame=\u0627\u0628\u062f\u0623 \u0627\u0644\u0644\u0639\u0628\u0629!
+goback=\u0627\u0631\u062c\u0639
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629
chinese=\u4e2d\u6587 (\u0627\u0644\u0635\u064a\u0646\u064a\u0629)
diff --git a/app/src/main/resources/assets/localization/localization_de.properties b/app/src/main/resources/assets/localization/localization_de.properties
index 186cd76..c8babb4 100644
--- a/app/src/main/resources/assets/localization/localization_de.properties
+++ b/app/src/main/resources/assets/localization/localization_de.properties
@@ -85,6 +85,8 @@ reversi2=Wenn du auf einen Punkt klickst, werden alle Spielsteine dazwischen umg
reversi3=Dein Zug kann übersprungen werden, wenn es keinen legalen Zug gibt. Dein Gegner spielt dann weiter, bis du einen legalen Zug machen kannst.
reversi4=Der Spieler, der am Ende die meisten Steine auf dem Brett hat, gewinnt.
tutorialstring=Tutorial
+startgame=Spiel starten!
+goback=Zurück
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Arabisch)
chinese=\u4e2d\u6587 (Chinesisch)
diff --git a/app/src/main/resources/assets/localization/localization_en.properties b/app/src/main/resources/assets/localization/localization_en.properties
index d0e20b0..44043fc 100644
--- a/app/src/main/resources/assets/localization/localization_en.properties
+++ b/app/src/main/resources/assets/localization/localization_en.properties
@@ -84,6 +84,8 @@ reversi2=Clicking on a dot will flip all the moves between where you place the d
reversi3=Your turn may be skipped if there is no legal move. This will let your opponent play again until you get an opportunity at a legal move.
reversi4=The player who wins at the end of the game is the one who has the most pieces on the board.
tutorialstring=Tutorial
+startgame=Start game!
+goback=Go back
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Arabic)
diff --git a/app/src/main/resources/assets/localization/localization_es.properties b/app/src/main/resources/assets/localization/localization_es.properties
index 4db0b7d..dd4cdf7 100644
--- a/app/src/main/resources/assets/localization/localization_es.properties
+++ b/app/src/main/resources/assets/localization/localization_es.properties
@@ -84,6 +84,8 @@ reversi2=Al hacer clic en un punto, se voltear
reversi3=Tu turno puede ser saltado si no hay un movimiento legal. Esto permitirá que tu oponente juegue nuevamente hasta que tengas una oportunidad legal.
reversi4=El jugador que gane al final del juego es quien tenga más fichas en el tablero.
tutorialstring=Tutorial
+startgame=\u00a1Iniciar juego!
+goback=Volver
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Ar\u00e1bigo)
diff --git a/app/src/main/resources/assets/localization/localization_fr.properties b/app/src/main/resources/assets/localization/localization_fr.properties
index eda968e..4a06650 100644
--- a/app/src/main/resources/assets/localization/localization_fr.properties
+++ b/app/src/main/resources/assets/localization/localization_fr.properties
@@ -84,6 +84,8 @@ reversi2=Cliquer sur un point retournera tous les pions entre le point plac
reversi3=Votre tour peut ętre sauté s'il n'y a pas de coup légal. Cela permettra ŕ votre adversaire de jouer jusqu'ŕ ce que vous ayez un coup légal.
reversi4=Le joueur qui a le plus de pions ŕ la fin du jeu gagne.
tutorialstring=Tutoriel
+startgame=D\u00e9marrer le jeu!
+goback=Retour
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Arabe)
chinese=\u4e2d\u6587 (Chinois)
diff --git a/app/src/main/resources/assets/localization/localization_hi.properties b/app/src/main/resources/assets/localization/localization_hi.properties
index 15990f9..668378a 100644
--- a/app/src/main/resources/assets/localization/localization_hi.properties
+++ b/app/src/main/resources/assets/localization/localization_hi.properties
@@ -84,6 +84,8 @@ reversi2=\u0915\u093f\u0938 \u092a\u0930 \u092a\u093f\u0938 \u092a\u0948\u0918 \
reversi3=\u092f\u0939 \u092a\u0930\u094d\u092f \u0938\u0947 \u0938\u0947\u091a \u0915\u0940 \u091c\u093e\u0902\u091c \u0928\u0939\u0940\u0902 \u0939\u0948 \u0914\u0938\u0924\u0947 \u0915\u0948 \u092a\u0948\u0928 \u092a\u0930\u094d\u092f \u0939\u0948 \u0914\u092a\u0915\u0940 \u0915\u0940 \u092a\u0932\u0947 \u092d\u0942\u0924 \u0915\u0940 \u0906\u0927\u093e \u092a\u0948\u0928 \u091c\u093e\u0902\u091c \u0915\u0930 \u0938\u0915\u0924\u0947 \u0939\u0948\u0902.
reversi4=\u0916\u0941\u092f \u0915\u093f \u0915\u0940 \u0928\u093f\u092e\u0940 \u092e\u0947\u0902 \u091a\u093e\u0932 \u0938\u092c\u0938\u0947 \u091a\u0942\u0928\u094d\u0928\u0947 \u0939\u0948, \u0935\u0949 \u0915\u0947 \u092e\u093e\u0924\u094d\u0930 \u091c\u0940\u0924\u0947 \u0939\u0948.
tutorialstring=\u0924\u0942\u091f\u0949\u0930\u093f\u092f\u0932
+startgame=\u0916\u0947\u0932 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902!
+goback=\u0935\u093e\u092a\u0938 \u091c\u093e\u090f\u0901
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (\u0905\u0930\u092c\u0940)
chinese=\u4e2d\u6587 (\u091a\u0940\u0928\u0940)
diff --git a/app/src/main/resources/assets/localization/localization_it.properties b/app/src/main/resources/assets/localization/localization_it.properties
index ee85d99..63b27ba 100644
--- a/app/src/main/resources/assets/localization/localization_it.properties
+++ b/app/src/main/resources/assets/localization/localization_it.properties
@@ -83,6 +83,8 @@ reversi2=Cliccando su un punto, tutti i pezzi tra dove metti il punto e il pross
reversi3=Il tuo turno puň essere saltato se non ci sono mosse legali. Questo permetterŕ al tuo avversario di giocare fino a quando non avrai un'opportunitŕ legale.
reversi4=Il giocatore che alla fine del gioco ha piů pezzi sulla scacchiera vince.
tutorialstring=Tutorial
+startgame=Avvia il gioco!
+goback=Indietro
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Arabo)
chinese=\u4e2d\u6587 (Cinese)
diff --git a/app/src/main/resources/assets/localization/localization_ja.properties b/app/src/main/resources/assets/localization/localization_ja.properties
index acb03c9..d2360ea 100644
--- a/app/src/main/resources/assets/localization/localization_ja.properties
+++ b/app/src/main/resources/assets/localization/localization_ja.properties
@@ -83,6 +83,8 @@ reversi2=\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u3001\u3064\u306a\u304c\u308
reversi3=\u6b21\u306e\u52d5\u304b\u3057\u304c\u306a\u3044\u5834\u5408\u3001\u8a8d\u5b9a\u3055\u308c\u305f\u52d5\u304b\u3057\u306e\u6642\u9593\u306f\u62d2\u7d76\u3055\u308c\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002
reversi4=\u672c\u6b21\u306b\u30dc\u30fc\u30c9\u4e0a\u3067\u6700\u591a\u306e\u8ca0\u3051\u3092\u6301\u3064\u30d7\u30ec\u30a4\u30e4\u30fc\u304c\u52dd\u3061\u307e\u3059\u3002
tutorialstring=\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb
+startgame=\u30b2\u30fc\u30e0\u3092\u958b\u59cb\uff01
+goback=\u623b\u308b
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (\u30a2\u30e9\u30d3\u30a2\u8a9e)
chinese=\u4e2d\u6587 (\u4e2d\u6587)
diff --git a/app/src/main/resources/assets/localization/localization_ko.properties b/app/src/main/resources/assets/localization/localization_ko.properties
index d84d236..571e24a 100644
--- a/app/src/main/resources/assets/localization/localization_ko.properties
+++ b/app/src/main/resources/assets/localization/localization_ko.properties
@@ -83,6 +83,8 @@ reversi2=\ud074\ub9ad \ud558\uba70, \ub2e4\ub978 \ud648 \uc704\ub85c \ucd5c\uc2e
reversi3=\uc0ac\uc6a9\uc790\uc758 \ud648\uc744 \ud074 \uc218 \uc5c6\uc2b5\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790 \ub2f5\uc5d0 \ub300\ud574 \uc811\ub2c8\ub2e4.
reversi4=\uacbd\uc6b0 \uc5d0\uc11c \ucd5c\ub300 \ud648\uc744 \uac00\uc838\ub294 \uc0ac\uc6a9\uc790\uc774 \uc52c\uc544\uc624\uba70 \uc0ac\uc6a9\uc790\uc758 \ud648\uc744 \uc54c\ub824\ud569\ub2c8\ub2e4.
tutorialstring=\ud14c\ud2b8\ub9ad
+startgame=\uac8c\uc784 \uc2dc\uc791!
+goback=\ub4a4\ub85c \uac00\uae30
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (\u0639\u0631\u0628\u064a\u0629)
chinese=\u4e2d\u6587 (\u4e2d\u6587)
diff --git a/app/src/main/resources/assets/localization/localization_nl.properties b/app/src/main/resources/assets/localization/localization_nl.properties
index d95fbb5..a025cf4 100644
--- a/app/src/main/resources/assets/localization/localization_nl.properties
+++ b/app/src/main/resources/assets/localization/localization_nl.properties
@@ -83,6 +83,8 @@ reversi2=Door op een stip te klikken draai je alle stukken om tussen de plaats w
reversi3=Je beurt kan worden overgeslagen als er geen legale zet is. Hierdoor kan je tegenstander doorgaan tot jij een legale zet kunt doen.
reversi4=De speler die aan het einde van het spel de meeste stukken op het bord heeft, wint.
tutorialstring=Tutorial
+startgame=Spel starten!
+goback=Ga terug
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Arabisch)
chinese=\u4e2d\u6587 (Chinees)
diff --git a/app/src/main/resources/assets/localization/localization_ru.properties b/app/src/main/resources/assets/localization/localization_ru.properties
index ac33ac0..48093fd 100644
--- a/app/src/main/resources/assets/localization/localization_ru.properties
+++ b/app/src/main/resources/assets/localization/localization_ru.properties
@@ -83,6 +83,8 @@ reversi2=\u041d043 \u043d043 \u0430043 \u043a043 \u0430043 \u043a043 \u043e043 \
reversi3=\u0412043 \u0430043 \u0436043 \u0434043 \u0430043 \u043d043 \u0438043 \u043d043 \u0435043 \u0435043 \u0432043 \u0430043.
reversi4=\u0418043 \u0433043 \u0440043 \u043e043 \u043a043 \u043e043 \u0442043 \u043e043 \u0442043 \u043e043 \u0435043 \u0435043 \u0430043 \u0435043 \u043d043 \u0438043 \u0435043 \u0435043 \u043c043 \u0430043.
tutorialstring=\u0423\u0447\u0435\u0431\u043d\u0438\u043a
+startgame=\u041d\u0430\u0447\u0430\u0442\u044c \u0438\u0433\u0440\u0443!
+goback=\u041d\u0430\u0437\u0430\u0434
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (\u0410\u0440\u0430\u0431\u0441\u043a\u0438\u0439)
chinese=\u4e2d\u6587 (\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439)
diff --git a/app/src/main/resources/assets/localization/localization_zh.properties b/app/src/main/resources/assets/localization/localization_zh.properties
index 8f20733..865380d 100644
--- a/app/src/main/resources/assets/localization/localization_zh.properties
+++ b/app/src/main/resources/assets/localization/localization_zh.properties
@@ -83,6 +83,8 @@ reversi2=\u70b9\u51fb\u4e00\u4e2a\u70b9\u65f6\u5c06\u5c06\u6240\u6709\u4e2d\u95f
reversi3=\u5982\u679c\u6ca1\u6709\u5408\u6cd5\u64cd\u4f5c\u4f60\u7684\u8fdb\u6b65\u53ef\u80fd\u88ab\u5ffd\u7565. \u8fd9\u4f1a\u8ba9\u5bf9\u624b\u518d\u6b21\u64cd\u4f5c\u5230\u4f60\u6709\u5408\u6cd5\u64cd\u4f5c\u65f6.
reversi4=\u672c\u6e38\u620f\u7ed3\u675f\u65f6\u8d62\u5f97\u6ee1\u8fc7\u76d8\u9762\u7684\u4ee3\u7406\u6570\u6700\u591a\u7684\u4eba\u5c31\u80dc.
tutorialstring=\u6559\u7a0b
+startgame=\u5f00\u59cb\u6e38\u620f\uff01
+goback=\u8fd4\u56de
arabic=\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (\u963f\u62c9\u4f2f\u8bed)
chinese=\u4e2d\u6587
diff --git a/framework/src/main/java/org/toop/framework/resource/resources/ImageAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/ImageAsset.java
index 2e6b417..70e7987 100644
--- a/framework/src/main/java/org/toop/framework/resource/resources/ImageAsset.java
+++ b/framework/src/main/java/org/toop/framework/resource/resources/ImageAsset.java
@@ -8,7 +8,7 @@ import org.toop.framework.resource.types.LoadableResource;
@FileExtension({"png", "jpg", "jpeg"})
public class ImageAsset extends BaseResource implements LoadableResource {
- private Image image;
+ private Image image = null;
public ImageAsset(final File file) {
super(file);
@@ -40,8 +40,7 @@ public class ImageAsset extends BaseResource implements LoadableResource {
public Image getImage() {
if (!this.isLoaded) {
this.load();
- return image;
}
- return null;
+ return image;
}
}