From 03eef663327843f303dc08360a4dff0b681a3c8e Mon Sep 17 00:00:00 2001 From: Felix Date: Tue, 19 Nov 2024 18:28:37 +0100 Subject: [PATCH] Finish buttons --- .../java/pp/mdga/client/Dialog/Dialog.java | 29 ++++-- .../mdga/client/Dialog/InputButtonDialog.java | 88 ++++++++++++++++++ .../mdga/client/Dialog/LobbyButtonDialog.java | 30 +++++- .../client/Dialog/SettingsButtonDialog.java | 76 ++++++++++++++- .../client/Dialog/SingleButtonLeftDialog.java | 14 ++- .../Dialog/SingleButtonRightDialog.java | 18 ++-- .../client/Dialog/VerticalButtonDialog.java | 40 -------- .../pp/mdga/client/View/CeremonyView.java | 21 +++-- .../java/pp/mdga/client/View/GameView.java | 6 +- .../java/pp/mdga/client/View/LobbyView.java | 23 ++++- .../java/pp/mdga/client/View/MainView.java | 10 +- .../java/pp/mdga/client/View/MdgaView.java | 13 ++- .../client/src/main/resources/mdga_logo.png | Bin 0 -> 24042 bytes .../client/src/main/resources/zahnrad.png | Bin 0 -> 48672 bytes .../client/src/main/resources/zahnrad.png~ | Bin 0 -> 51290 bytes 15 files changed, 281 insertions(+), 87 deletions(-) create mode 100644 Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/InputButtonDialog.java delete mode 100644 Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/VerticalButtonDialog.java create mode 100644 Projekte/mdga/client/src/main/resources/mdga_logo.png create mode 100644 Projekte/mdga/client/src/main/resources/zahnrad.png create mode 100644 Projekte/mdga/client/src/main/resources/zahnrad.png~ diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/Dialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/Dialog.java index 0d3c4c9f..96df3bf3 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/Dialog.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/Dialog.java @@ -2,39 +2,52 @@ import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; +import com.jme3.scene.Node; import com.simsilica.lemur.Button; import com.simsilica.lemur.Container; +import com.simsilica.lemur.HAlignment; +import com.simsilica.lemur.VAlignment; import com.simsilica.lemur.component.QuadBackgroundComponent; -import com.simsilica.lemur.core.GuiComponent; import pp.mdga.client.MdgaApp; public abstract class Dialog { protected final ColorRGBA COLOR_DEFAULT = ColorRGBA.Gray; protected final ColorRGBA COLOR_HOVER = ColorRGBA.DarkGray; - protected MdgaApp app; protected Container container; - public Dialog(MdgaApp app) { + protected final MdgaApp app; + private final Node node; + + protected final float vertical_step; + protected final float horitontal_step; + + public Dialog(MdgaApp app, Node node) { this.app = app; + this.node = node; this.container = new Container(); + + this.horitontal_step = app.getCamera().getWidth() / 16; + this.vertical_step = app.getCamera().getHeight() / 9; } public void show() { - app.getGuiNode().attachChild(container); + node.attachChild(container); } public void hide () { - app.getGuiNode().detachChild(container); + node.detachChild(container); } protected void createButton(String label, Runnable action, Vector3f size) { Button button = new Button(label); button.addClickCommands(source -> action.run()); - button.setSize(size); button.setFontSize(35); button.setHighlightColor(ColorRGBA.White); button.setColor(ColorRGBA.Black); + button.setPreferredSize(size); + button.setTextHAlignment(HAlignment.Center); + button.setTextVAlignment(VAlignment.Center); QuadBackgroundComponent background = new QuadBackgroundComponent(COLOR_DEFAULT); background.setMargin(5, 5); @@ -44,12 +57,16 @@ protected void createButton(String label, Runnable action, Vector3f size) { QuadBackgroundComponent hoverBackground = new QuadBackgroundComponent(COLOR_HOVER); hoverBackground.setMargin(5, 5); source.setBackground(hoverBackground); + button.setHighlightColor(ColorRGBA.White); + button.setColor(ColorRGBA.Black); }); button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOff, (source) -> { QuadBackgroundComponent normalBackground = new QuadBackgroundComponent(COLOR_DEFAULT); normalBackground.setMargin(5, 5); source.setBackground(normalBackground); + button.setHighlightColor(ColorRGBA.White); + button.setColor(ColorRGBA.Black); }); container.addChild(button); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/InputButtonDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/InputButtonDialog.java new file mode 100644 index 00000000..6f38bbb0 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/InputButtonDialog.java @@ -0,0 +1,88 @@ +package pp.mdga.client.Dialog; + +import com.jme3.math.ColorRGBA; +import com.jme3.math.Vector3f; +import com.jme3.scene.Node; +import com.jme3.texture.Texture; +import com.simsilica.lemur.*; +import com.simsilica.lemur.component.QuadBackgroundComponent; +import com.simsilica.lemur.component.SpringGridLayout; +import pp.mdga.client.MdgaApp; + +public class InputButtonDialog extends Dialog { + private TextField nameInput; + + public InputButtonDialog(MdgaApp app, Node node) { + super(app, node); + + QuadBackgroundComponent quad1 = new QuadBackgroundComponent(ColorRGBA.Gray); + quad1.setMargin(100, 50); + container.setBackground(quad1); + + Texture texture = app.getAssetManager().loadTexture("mdga_logo.png"); + + QuadBackgroundComponent b = new QuadBackgroundComponent(texture); + + Panel imagePanel = new Panel(); + imagePanel.setBackground(b); + + container.addChild(imagePanel).setPreferredSize(new Vector3f(texture.getImage().getWidth() / 4, texture.getImage().getHeight() / 4, 0)); + + //abstandshalter + container.addChild(new Panel(100, 50, ColorRGBA.Gray)); + + createTextField(); + + //abstandshalter + container.addChild(new Panel(100, 50, ColorRGBA.Gray)); + } + + @Override + public void show() { + super.show(); + + container.setLocalTranslation( + app.getCamera().getWidth() / 2 - container.getPreferredSize().x / 2, + app.getCamera().getHeight() / 2 + container.getPreferredSize().y / 2, + 0 + ); + } + + @Override + public void hide() { + super.hide(); + } + + public void addButton(String label, Runnable action, Vector3f size) { + createButton(label, action, size); + } + + private void createTextField() { + Container subContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y)); + + Label nameLabel = new Label("Name:\t"); + nameLabel.setFontSize(35); + nameLabel.setColor(ColorRGBA.Black); + + nameInput = new TextField(""); + + nameInput.setColor(ColorRGBA.Black); + nameInput.setTextHAlignment(HAlignment.Left); + nameInput.setFontSize(35); + nameInput.setSingleLine(true); + + QuadBackgroundComponent grayBackground = new QuadBackgroundComponent(ColorRGBA.DarkGray); + nameInput.setBackground(grayBackground); + + subContainer.addChild(nameLabel); + subContainer.addChild(nameInput); + + container.addChild(subContainer); + } + + public String getName() { + return nameInput.getText(); + } +} + + diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/LobbyButtonDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/LobbyButtonDialog.java index ca72bc41..1294e0fd 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/LobbyButtonDialog.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/LobbyButtonDialog.java @@ -1,4 +1,32 @@ package pp.mdga.client.Dialog; -public class LobbyButtonDialog { +import com.jme3.math.Vector3f; +import com.jme3.scene.Node; +import pp.mdga.client.MdgaApp; + +public class LobbyButtonDialog extends Dialog { + private final int pos; + + public LobbyButtonDialog(MdgaApp app, Node node, String label, Runnable action, int pos) { + super(app, node); + + this.pos = pos; + + createButton(label, action, new Vector3f(170, 250, 0)); + } + + @Override + public void show() { + super.show(); + + float x = ((2 + (4 * pos)) * horitontal_step) - ((0.33333333f * pos) * container.getPreferredSize().x); + float y = 6 * vertical_step; + + container.setLocalTranslation(x, y, 0); + } + + @Override + public void hide() { + super.hide(); + } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SettingsButtonDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SettingsButtonDialog.java index dec1f9c6..00cafcb1 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SettingsButtonDialog.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SettingsButtonDialog.java @@ -1,4 +1,78 @@ package pp.mdga.client.Dialog; -public class SettingsButtonDialog { +import com.jme3.math.ColorRGBA; +import com.jme3.math.Vector3f; +import com.jme3.scene.Node; +import com.jme3.texture.Texture; +import com.simsilica.lemur.Button; +import com.simsilica.lemur.HAlignment; +import com.simsilica.lemur.Panel; +import com.simsilica.lemur.VAlignment; +import com.simsilica.lemur.component.IconComponent; +import com.simsilica.lemur.component.QuadBackgroundComponent; +import pp.mdga.client.MdgaApp; + +public class SettingsButtonDialog extends Dialog { + private IconComponent icon; + + public SettingsButtonDialog(MdgaApp app, Node node, String label, Runnable action) { + super(app, node); + + icon = new IconComponent("zahnrad.png"); + icon.setIconScale(0.1f); + + createButton(label, action, new Vector3f(60, 60, 0)); + } + + @Override + public void show() { + super.show(); + + float x = (15.5f * horitontal_step) - container.getPreferredSize().x; + float y = 8.5f * vertical_step; + + container.setLocalTranslation(x, y, 0); + } + + @Override + public void hide() { + super.hide(); + } + + @Override + protected void createButton(String label, Runnable action, Vector3f size) { + Button button = new Button(label); + button.addClickCommands(source -> action.run()); + button.setFontSize(35); + button.setHighlightColor(ColorRGBA.White); + button.setColor(ColorRGBA.Black); + button.setPreferredSize(size); + button.setTextHAlignment(HAlignment.Center); + button.setTextVAlignment(VAlignment.Center); + + QuadBackgroundComponent background = new QuadBackgroundComponent(COLOR_DEFAULT); + background.setMargin(5, 5); + button.setBackground(background); + button.setIcon(icon); + + button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOn, (source) -> { + QuadBackgroundComponent hoverBackground = new QuadBackgroundComponent(COLOR_HOVER); + hoverBackground.setMargin(5, 5); + source.setBackground(hoverBackground); + button.setHighlightColor(ColorRGBA.White); + button.setColor(ColorRGBA.Black); + button.setIcon(icon); + }); + + button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOff, (source) -> { + QuadBackgroundComponent normalBackground = new QuadBackgroundComponent(COLOR_DEFAULT); + normalBackground.setMargin(5, 5); + source.setBackground(normalBackground); + button.setHighlightColor(ColorRGBA.White); + button.setColor(ColorRGBA.Black); + button.setIcon(icon); + }); + + container.addChild(button); + } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SingleButtonLeftDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SingleButtonLeftDialog.java index b3f97705..16623497 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SingleButtonLeftDialog.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SingleButtonLeftDialog.java @@ -1,24 +1,22 @@ package pp.mdga.client.Dialog; import com.jme3.math.Vector3f; +import com.jme3.scene.Node; import pp.mdga.client.MdgaApp; public class SingleButtonLeftDialog extends Dialog { - public SingleButtonLeftDialog(MdgaApp app, String label, Runnable action) { - super(app); + public SingleButtonLeftDialog(MdgaApp app, Node node, String label, Runnable action) { + super(app, node); - createButton(label, action, new Vector3f(1, 1, 1)); + createButton(label, action, new Vector3f(170, 60, 0)); } @Override public void show() { super.show(); - float vertical = app.getCamera().getWidth() / 16 - container.getPreferredSize().x / 16; - float horitontal = app.getCamera().getHeight() / 12 + container.getPreferredSize().y / 12; - - float x = 2 * vertical; - float y = 2 * horitontal; + float x = 2 * horitontal_step; + float y = 1.8f * vertical_step; container.setLocalTranslation(x, y, 0); } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SingleButtonRightDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SingleButtonRightDialog.java index a518fcd8..78856f2d 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SingleButtonRightDialog.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/SingleButtonRightDialog.java @@ -1,28 +1,22 @@ package pp.mdga.client.Dialog; -import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; -import com.simsilica.lemur.Button; -import com.simsilica.lemur.component.QuadBackgroundComponent; -import com.simsilica.lemur.core.GuiLayout; +import com.jme3.scene.Node; import pp.mdga.client.MdgaApp; public class SingleButtonRightDialog extends Dialog { - public SingleButtonRightDialog(MdgaApp app, String label, Runnable action) { - super(app); + public SingleButtonRightDialog(MdgaApp app, Node node, String label, Runnable action) { + super(app, node); - createButton(label, action, new Vector3f(1, 1, 1)); + createButton(label, action, new Vector3f(170, 60, 0)); } @Override public void show() { super.show(); - float vertical = app.getCamera().getWidth() / 16 - container.getPreferredSize().x / 16; - float horitontal = app.getCamera().getHeight() / 12 + container.getPreferredSize().y / 12; - - float x = 14 * vertical; - float y = 2 * horitontal; + float x = (14 * horitontal_step) - container.getPreferredSize().x; + float y = 1.8f * vertical_step; container.setLocalTranslation(x, y, 0); } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/VerticalButtonDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/VerticalButtonDialog.java deleted file mode 100644 index 4a2b34d6..00000000 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Dialog/VerticalButtonDialog.java +++ /dev/null @@ -1,40 +0,0 @@ -package pp.mdga.client.Dialog; - -import com.jme3.math.ColorRGBA; -import com.jme3.math.Vector3f; -import com.simsilica.lemur.Button; -import com.simsilica.lemur.Container; -import com.simsilica.lemur.component.QuadBackgroundComponent; -import pp.mdga.client.MdgaApp; - -public class VerticalButtonDialog extends Dialog { - public VerticalButtonDialog(MdgaApp app) { - super(app); - - QuadBackgroundComponent quad1 = new QuadBackgroundComponent(ColorRGBA.Gray); - quad1.setMargin(10, 10); - container.setBackground(quad1); - } - - @Override - public void show() { - super.show(); - - container.setLocalTranslation( - app.getCamera().getWidth() / 2 - container.getPreferredSize().x / 2, - app.getCamera().getHeight() / 2 + container.getPreferredSize().y / 2, - 0 - ); - } - - @Override - public void hide() { - super.hide(); - } - - public void addButton(String label, Runnable action, Vector3f size) { - createButton(label, action, size); - } -} - - diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/View/CeremonyView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/View/CeremonyView.java index c48f3dd7..07125ebc 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/View/CeremonyView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/View/CeremonyView.java @@ -21,11 +21,13 @@ private enum SubState { private SingleButtonRightDialog continueButton; private SingleButtonLeftDialog backButton; + private Geometry background; + public CeremonyView(MdgaApp app) { super(app); - continueButton = new SingleButtonRightDialog(app, "Weiter", () -> forward()); - backButton = new SingleButtonLeftDialog(app, "Zurück", () -> back()); + continueButton = new SingleButtonRightDialog(app, node, "Weiter", () -> forward()); + backButton = new SingleButtonLeftDialog(app, node, "Zurück", () -> back()); } @Override @@ -40,9 +42,7 @@ public void onLeave() { } private void awardCeremony() { - node.detachAllChildren(); - - Geometry background = createBackground("b1.png"); + background = createBackground("b1.png"); node.attachChild(background); continueButton.show(); @@ -50,9 +50,7 @@ private void awardCeremony() { } private void statistics() { - node.detachAllChildren(); - - Geometry background = createBackground("b2.png"); + background = createBackground("b2.png"); node.attachChild(background); continueButton.show(); @@ -62,6 +60,13 @@ private void statistics() { private void enterSub(SubState state) { this.state = state; + if(null != background) { + node.detachChild(background); + } + + backButton.hide(); + continueButton.hide(); + switch (state) { case AWARD_CEREMONY: awardCeremony(); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/View/GameView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/View/GameView.java index a382327b..a949b3a8 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/View/GameView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/View/GameView.java @@ -16,18 +16,18 @@ public GameView(MdgaApp app) { this.boardHandler = new BoardHandler(app); - continueButton = new SingleButtonRightDialog(app, "Weiter", () -> app.enter(MdgaState.CEREMONY)); + continueButton = new SingleButtonRightDialog(app, node, "Weiter", () -> app.enter(MdgaState.CEREMONY)); } @Override - public void enter() { + public void onEnter() { boardHandler.init(); continueButton.show(); } @Override - public void leave() { + public void onLeave() { continueButton.hide(); boardHandler.shutdown(); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/View/LobbyView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/View/LobbyView.java index 451fbf35..7026adcb 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/View/LobbyView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/View/LobbyView.java @@ -1,36 +1,55 @@ package pp.mdga.client.View; import com.jme3.scene.Geometry; +import pp.mdga.client.Dialog.LobbyButtonDialog; +import pp.mdga.client.Dialog.SettingsButtonDialog; import pp.mdga.client.Dialog.SingleButtonLeftDialog; import pp.mdga.client.Dialog.SingleButtonRightDialog; import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaState; import pp.mdga.game.Color; +import java.util.ArrayList; + public class LobbyView extends MdgaView { private Geometry background; private SingleButtonRightDialog readyButton; private SingleButtonLeftDialog leaveButton; + private ArrayList lobbyButtons = new ArrayList<>(); + public LobbyView(MdgaApp app) { super(app); background = createBackground("lobby.png"); node.attachChild(background); - readyButton = new SingleButtonRightDialog(app, "Fertig", () -> app.enter(MdgaState.GAME)); - leaveButton = new SingleButtonLeftDialog(app, "Verlassen", () -> app.enter(MdgaState.MAIN)); + readyButton = new SingleButtonRightDialog(app, node, "Fertig", () -> app.enter(MdgaState.GAME)); + leaveButton = new SingleButtonLeftDialog(app, node, "Verlassen", () -> app.enter(MdgaState.MAIN)); + + lobbyButtons.add(new LobbyButtonDialog(app, node, "CIR", () -> System.out.println("cir"), 0)); + lobbyButtons.add(new LobbyButtonDialog(app, node, "LUFTWAFFE", () -> System.out.println("lw"), 1)); + lobbyButtons.add(new LobbyButtonDialog(app, node, "HEER", () -> System.out.println("heer"), 2)); + lobbyButtons.add(new LobbyButtonDialog(app, node, "MARINE", () -> System.out.println("marine"), 3)); } @Override public void onEnter() { readyButton.show(); leaveButton.show(); + + for (LobbyButtonDialog b : lobbyButtons) { + b.show(); + } } @Override public void onLeave() { + for (LobbyButtonDialog b : lobbyButtons) { + b.hide(); + } + readyButton.hide(); leaveButton.hide(); } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/View/MainView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/View/MainView.java index 9b68aeba..f12882a3 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/View/MainView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/View/MainView.java @@ -1,7 +1,8 @@ package pp.mdga.client.View; import com.jme3.scene.Geometry; -import pp.mdga.client.Dialog.VerticalButtonDialog; +import pp.mdga.client.Dialog.InputButtonDialog; +import pp.mdga.client.Dialog.SettingsButtonDialog; import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaState; @@ -9,7 +10,8 @@ public class MainView extends MdgaView { private Geometry background; - VerticalButtonDialog dialog; + + private InputButtonDialog dialog; public MainView(MdgaApp app) { super(app); @@ -17,8 +19,8 @@ public MainView(MdgaApp app) { background = createBackground("powercards.png"); node.attachChild(background); - Vector3f size = new Vector3f(1, 1, 1); - dialog = new VerticalButtonDialog(app); + Vector3f size = new Vector3f(280, 60, 0); + dialog = new InputButtonDialog(app, node); dialog.addButton("Spiel beitreten", () -> app.enter(MdgaState.LOBBY), size); dialog.addButton("Spiel hosten", () -> app.enter(MdgaState.LOBBY), size); dialog.addButton("Einstellungen", () -> System.out.println("Einstellungen"), size); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/View/MdgaView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/View/MdgaView.java index a85ba6bf..10039ad8 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/View/MdgaView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/View/MdgaView.java @@ -6,31 +6,40 @@ import com.jme3.scene.Node; import com.jme3.scene.shape.Quad; import com.jme3.texture.Texture; +import pp.mdga.client.Dialog.SettingsButtonDialog; import pp.mdga.client.MdgaApp; public abstract class MdgaView { protected MdgaApp app; protected Node node; + private SettingsButtonDialog settings; + public MdgaView(MdgaApp app) { this.app = app; this.node = new Node(); + + settings = new SettingsButtonDialog(app, node, "", () -> System.out.println("Einstellungen")); } public void enter() { app.getGuiNode().attachChild(node); + settings.show(); + onEnter(); } public void leave() { onLeave(); + settings.hide(); + app.getGuiNode().detachChild(node); } - protected void onEnter() {} - protected void onLeave() {} + protected abstract void onEnter(); + protected abstract void onLeave(); protected Geometry createBackground(String texturePath) { TextureKey key = new TextureKey(texturePath, true); diff --git a/Projekte/mdga/client/src/main/resources/mdga_logo.png b/Projekte/mdga/client/src/main/resources/mdga_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..59f75e701e4684b22b381712dda321bccd94e523 GIT binary patch literal 24042 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