diff --git a/Projekte/.run/MdgaApp.run.xml b/Projekte/.run/MdgaApp.run.xml
deleted file mode 100644
index 82e2f2b6..00000000
--- a/Projekte/.run/MdgaApp.run.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java
index 99d22d10..895042a3 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java
@@ -43,6 +43,7 @@ public class InputSynchronizer {
private void setupInput() {
inputManager.addMapping("Settings", new KeyTrigger(KeyInput.KEY_ESCAPE));
+ inputManager.addMapping("Forward", new KeyTrigger(KeyInput.KEY_RETURN));
inputManager.addMapping("RotateRightMouse", new MouseButtonTrigger(MouseInput.BUTTON_RIGHT));
inputManager.addMapping("MouseLeft", new MouseAxisTrigger(MouseInput.AXIS_X, false)); // Left movement
@@ -54,7 +55,7 @@ private void setupInput() {
inputManager.addMapping("Click", new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
- inputManager.addListener(actionListener, "Settings", "RotateRightMouse", "Click", "Test");
+ inputManager.addListener(actionListener, "Settings", "Forward", "RotateRightMouse", "Click", "Test");
inputManager.addListener(analogListener, "MouseLeft", "MouseRight", "MouseScrollUp", "MouseScrollDown");
}
@@ -66,6 +67,9 @@ public void onAction(String name, boolean isPressed, float tpf) {
if (name.equals("Settings") && isPressed) {
app.getView().pressEscape();
}
+ if (name.equals("Forward") && isPressed) {
+ app.getView().pressForward();
+ }
if (name.equals("RotateRightMouse")) {
rightMousePressed = isPressed;
}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java
index 6b53b07e..8c3cd992 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/MdgaApp.java
@@ -6,107 +6,63 @@
import pp.mdga.client.animation.AnimationHandler;
import com.jme3.system.AppSettings;
import pp.mdga.client.view.*;
-import pp.mdga.game.Color;
-import pp.mdga.notification.*;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
public class MdgaApp extends SimpleApplication {
private AnimationHandler animationHandler;
private AcousticHandler acousticHandler;
private NotificationSynchronizer notificationSynchronizer;
private InputSynchronizer inputSynchronizer;
- private ModelSynchronizer modelSynchronizer;
+ private ModelSyncronizer modelSyncronizer;
MdgaView view = null;
- private MdgaState state = MdgaState.GAME;
+ private MdgaState state = null;
- private static float resolutionFactor = 1.2f;
+ private static float imageScale = 1.5f;
+
+ private MdgaView mainView;
+ private MdgaView lobbyView;
+ private MdgaView gameView;
+ private MdgaView ceremonyView;
public static void main(String[] args) {
AppSettings settings = new AppSettings(true);
settings.setSamples(128);
settings.setCenterWindow(true);
-
- int width = (int)(1280 * resolutionFactor);
- int height = (int)(720 * resolutionFactor);
-
- settings.setWidth(width);
- settings.setHeight(height);
-
+ settings.setWidth(1920);
+ settings.setHeight(1080);
settings.setVSync(false);
MdgaApp app = new MdgaApp();
app.setSettings(settings);
app.setShowSettings(false);
- app.setPauseOnLostFocus(false);
app.start();
}
@Override
public void simpleInitApp() {
+ GuiGlobals.initialize(this);
+
+ inputManager.deleteMapping("SIMPLEAPP_Exit");
+
+ flyCam.setEnabled(false);
+
animationHandler = new AnimationHandler(this);
acousticHandler = new AcousticHandler(this);
notificationSynchronizer = new NotificationSynchronizer(this);
inputSynchronizer = new InputSynchronizer(this);
- modelSynchronizer = new ModelSynchronizer(this);
+ modelSyncronizer = new ModelSyncronizer(this);
- inputManager.deleteMapping("SIMPLEAPP_Exit");
- flyCam.setEnabled(false);
- GuiGlobals.initialize(this);
+ mainView = new MainView(this);
+ lobbyView = new LobbyView(this);
+ gameView = new GameView(this);
+ ceremonyView = new CeremonyView(this);
- enter(state);
-
- List test = new ArrayList<>();
- UUID player0 = UUID.randomUUID();
- test.add(player0);
- UUID player1 = UUID.randomUUID();
- test.add(player1);
- test.add(UUID.randomUUID());
- test.add(UUID.randomUUID());
-
- List test_1 = new ArrayList<>();
- UUID player0_1 = UUID.randomUUID();
- test_1.add(player0_1);
- UUID player1_1 = UUID.randomUUID();
- test_1.add(player1_1);
- test_1.add(UUID.randomUUID());
- test_1.add(UUID.randomUUID());
-
- List test_2 = new ArrayList<>();
- test_2.add(UUID.randomUUID());
- test_2.add(UUID.randomUUID());
- test_2.add(UUID.randomUUID());
- test_2.add(UUID.randomUUID());
-
- List test_3 = new ArrayList<>();
- test_3.add(UUID.randomUUID());
- test_3.add(UUID.randomUUID());
- test_3.add(UUID.randomUUID());
- test_3.add(UUID.randomUUID());
-
-
- ((GameView) view).setOwnColor(Color.NAVY);
-// notificationSynchronizer.addTestNotification(new PlayerInGameNotification(Color.AIRFORCE, test, "Player 1"));
-// notificationSynchronizer.addTestNotification(new PlayerInGameNotification(Color.NAVY, test_1, "Player 2"));
-// notificationSynchronizer.addTestNotification(new PlayerInGameNotification(Color.ARMY, test_2, "Player 3"));
-// notificationSynchronizer.addTestNotification(new PlayerInGameNotification(Color.CYBER, test_3, "Player 4"));
-
-// notificationSynchronizer.addTestNotification(new MovePieceNotification(player0, 0, true));
-// notificationSynchronizer.addTestNotification(new MovePieceNotification(player0_1, 20, true));
-// notificationSynchronizer.addTestNotification(new MovePieceNotification(player0_1, 20, 21));
-// notificationSynchronizer.addTestNotification(new MovePieceNotification(player1, 0, true));
-// notificationSynchronizer.addTestNotification(new MovePieceNotification(player0, 0, 7));
-// notificationSynchronizer.addTestNotification(new SelectableMoveNotification(new ArrayList<>(List.of(player0, player1)), new ArrayList<>(List.of(7,3)), new ArrayList<>(List.of(false, true))));
-// notificationSynchronizer.addTestNotification(new SwapPieceNotification(player0, player0_1));
-// notificationSynchronizer.addTestNotification(new SelectableSwapNotification(new ArrayList<>(List.of(player0, player1)), new ArrayList<>(List.of(player0_1))));
+ enter(MdgaState.MAIN);
}
@Override
public void simpleUpdate(float tpf) {
- view.update();
+ view.update(tpf);
acousticHandler.update();
notificationSynchronizer.update();
}
@@ -120,16 +76,16 @@ public void enter(MdgaState state) {
switch (state) {
case MAIN:
- view = new MainView(this);
+ view = mainView;
break;
case LOBBY:
- view = new LobbyView(this);
+ view = lobbyView;
break;
case GAME:
- view = new GameView(this);
+ view = gameView;
break;
case CEREMONY:
- view = new CeremonyView(this);
+ view = ceremonyView;
break;
case NONE:
throw new RuntimeException("cant enter state NONE");
@@ -140,10 +96,6 @@ public void enter(MdgaState state) {
view.enter();
}
- public void afteGameCleanup() {
- //TODO
- }
-
public AnimationHandler getAnimationHandler() {
return animationHandler;
}
@@ -154,17 +106,19 @@ public AcousticHandler getAcousticHandler() {
public MdgaState getState() {return state; }
- public float getResolutionFactor() {
- return resolutionFactor;
+ public float getImageScale() {
+ return imageScale;
}
public MdgaView getView() {
return view;
}
- public ModelSynchronizer getModelSyncronizer() {
- return modelSynchronizer;
+ public ModelSyncronizer getModelSyncronizer() {
+ return modelSyncronizer;
}
public InputSynchronizer getInputSyncronizer() { return inputSynchronizer; }
+
+ public NotificationSynchronizer getNotificationSynchronizer() { return notificationSynchronizer; }
}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java
index 8488648d..8d2c08ab 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSynchronizer.java
@@ -1,72 +1,123 @@
package pp.mdga.client;
+import pp.mdga.client.view.CeremonyView;
+import pp.mdga.client.view.GameView;
import pp.mdga.client.view.LobbyView;
+import pp.mdga.game.BonusCard;
import pp.mdga.game.Color;
+import pp.mdga.notification.AcquireCardNotification;
+import pp.mdga.notification.DrawCardNotification;
+import pp.mdga.notification.TskSelectNotification;
+
+import java.util.UUID;
+import java.util.logging.Level;
+import java.util.logging.Logger;
public class ModelSynchronizer {
+ private static final Logger LOGGER = Logger.getLogger(ModelSynchronizer.class.getName());
private MdgaApp app;
ModelSynchronizer(MdgaApp app) {
this.app = app;
}
- public void selectPiece() {
- //TODO call from somewhere
- System.out.println("selectPiece");
+ public void animationEnd() {
+
}
- public void selectCard() {
- //TODO call from somewhere
- System.out.println("selectCard");
+ public void selectSwap(UUID a, UUID b) {
+ // TODO call from somewhere
+ LOGGER.log(Level.INFO, "selectPiece");
+ }
+
+ public void selectPiece(UUID piece) {
+ // TODO call from somewhere
+ LOGGER.log(Level.INFO, "selectPiece");
+ }
+
+ public void selectCard(BonusCard card) {
+ // TODO call from somewhere
+ LOGGER.log(Level.INFO, "selectCard");
+ }
+
+ public void confirm() {
+ LOGGER.log(Level.INFO, "confirm");
}
public void selectTsk(Color color) {
- //TODO call from somewhere
- System.out.println("selectTsk: " + color);
+ // TODO call from somewhere
+ LOGGER.log(Level.INFO, "selectTsk: {0}", color);
LobbyView view = (LobbyView) app.getView();
view.setTaken(color, true, true, "OwnPlayerName");
}
public void unselectTsk() {
- //TODO call from somewhere
- System.out.println("unselectTsk");
+ // TODO call from somewhere
+ LOGGER.log(Level.INFO, "unselectTsk");
}
public void rolledDice() {
- //TODO call from somewhere
- System.out.println("rolledDice");
+ // TODO call from somewhere
+ LOGGER.log(Level.INFO, "rolledDice");
}
public void setName(String name) {
- //TODO call from somewhere
- System.out.println("setName:" + name);
+ // TODO call from somewhere
+ LOGGER.log(Level.INFO, "setName: {0}", name);
}
public void setReady() {
- //TODO call from somewhere
- System.out.println("setReady");
- app.enter(MdgaState.GAME);
+ LOGGER.log(Level.INFO, "setReady");
+ enter(MdgaState.GAME);
}
public void setHost(int port) {
- //TODO call from somewhere
- System.out.println("setHost: " + port);
- app.enter(MdgaState.LOBBY);
+ // TODO call from somewhere
+ LOGGER.log(Level.INFO, "setHost: {0}", port);
+ enter(MdgaState.LOBBY);
}
public void setJoin(String ip, int port) {
- //TODO call from somewhere
- System.out.println("setJoin");
- app.enter(MdgaState.LOBBY);
+ // TODO call from somewhere
+ LOGGER.log(Level.INFO, "setJoin with IP: {0}, Port: {1}", new Object[]{ip, port});
+ enter(MdgaState.LOBBY);
}
public void leave() {
- System.out.println("leave");
- app.enter(MdgaState.MAIN);
+ LOGGER.log(Level.INFO, "leave");
+ enter(MdgaState.MAIN);
}
public void enter(MdgaState state) {
- System.out.println("enter:" + state);
+ LOGGER.log(Level.INFO, "enter: {0}", state);
app.enter(state);
+
+ if (state == MdgaState.CEREMONY) {
+ CeremonyView ceremonyView = (CeremonyView) app.getView();
+ ceremonyView.addCeremonyParticipant(Color.AIRFORCE, 1, "ugidffdg");
+ ceremonyView.addCeremonyParticipant(Color.ARMY, 2, "ugidffdg");
+ ceremonyView.addCeremonyParticipant(Color.NAVY, 3, "ugidffdg");
+ ceremonyView.addCeremonyParticipant(Color.CYBER, 4, "ugidffdg");
+
+ ceremonyView.addStatisticsRow("player sdgsd", 1, 2, 3, 4, 5, 6);
+ ceremonyView.addStatisticsRow("player sdgsd", 1, 2, 3, 4, 5, 6);
+ ceremonyView.addStatisticsRow("player sdgsd", 1, 2, 3, 4, 5, 6);
+ ceremonyView.addStatisticsRow("player sdgsd", 1, 2, 3, 4, 5, 6);
+ ceremonyView.addStatisticsRow("Gesamt", 1, 2, 3, 4, 5, 6);
+ }
+
+ if (state == MdgaState.GAME) {
+ GameView gameView = (GameView) app.getView();
+
+ app.getNotificationSynchronizer().addTestNotification(new DrawCardNotification(Color.AIRFORCE, BonusCard.SHIELD));
+ }
+
+ if (state == MdgaState.LOBBY) {
+ LobbyView lobbyView = (LobbyView) app.getView();
+
+ app.getNotificationSynchronizer().addTestNotification(new TskSelectNotification(Color.CYBER, "blablabupp", false));
+ app.getNotificationSynchronizer().addTestNotification(new TskSelectNotification(Color.ARMY, "Spieler 2", false));
+ lobbyView.setReady(Color.ARMY, true);
+ }
}
}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java
index fbd9a178..963dcdbb 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java
@@ -2,8 +2,10 @@
import pp.mdga.client.board.BoardHandler;
import pp.mdga.client.gui.GuiHandler;
+import pp.mdga.client.view.CeremonyView;
import pp.mdga.client.view.GameView;
import pp.mdga.client.view.LobbyView;
+import pp.mdga.game.Color;
import pp.mdga.notification.*;
import java.util.ArrayList;
@@ -59,6 +61,8 @@ private void handleLobby(Notification notification) {
lobbyView.setTaken(n.getColor(), true, n.isSelf(), n.getName());
} else if (notification instanceof TskUnselectNotification n) {
lobbyView.setTaken(n.getColor(), false, false, null);
+ //} else if(notification instanceof LobbyReadyNotification lobbyReadyNotification) {
+ // lobbyView.setReady(lobbyReadyNotification.getColor(), lobbyReadyNotification.isReady()):
} else if (notification instanceof GameNotification) {
app.enter(MdgaState.GAME);
} else {
@@ -75,8 +79,33 @@ private void handleGame(Notification notification) {
guiHandler.addCard(n.getBonusCard());
} else if (notification instanceof ActivePlayerNotification n) {
guiHandler.setActivePlayer(n.getColor());
- } else if (notification instanceof CeremonyNotification) {
+ } else if (notification instanceof CeremonyNotification n) {
app.enter(MdgaState.CEREMONY);
+ CeremonyView ceremonyView = (CeremonyView) app.getView();
+ int size = n.getNames().size();
+
+ if (n.getPiecesThrown().size() != size ||
+ n.getPiecesLost().size() != size ||
+ n.getBonusCardsPlayed().size() != size ||
+ n.getSixes().size() != size ||
+ n.getNodesMoved().size() != size ||
+ n.getBonusNodes().size() != size) {
+ throw new IllegalArgumentException("All data lists in CeremonyNotification must have the same size.");
+ }
+
+ for (int i = 0; i < size; i++) {
+ Color color = n.getColors().get(i);
+ String name = n.getNames().get(i);
+ int v1 = n.getPiecesThrown().get(i);
+ int v2 = n.getPiecesLost().get(i);
+ int v3 = n.getBonusCardsPlayed().get(i);
+ int v4 = n.getSixes().get(i);
+ int v5 = n.getNodesMoved().get(i);
+ int v6 = n.getBonusNodes().get(i);
+
+ ceremonyView.addCeremonyParticipant(color, i, name);
+ ceremonyView.addStatisticsRow(name, v1, v2, v3, v4, v5, v6);
+ }
} else if (notification instanceof DiceNowNotification) {
guiHandler.showDice();
} else if (notification instanceof DicingNotification n) {
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java
index 08979182..fbf78b2f 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java
@@ -5,6 +5,7 @@
import pp.mdga.client.MdgaState;
import java.util.*;
+import java.util.prefs.Preferences;
public class AcousticHandler {
private MdgaApp app;
@@ -23,14 +24,20 @@ public class AcousticHandler {
private GameMusic scheduled = null; // Scheduled track to play next
private GameMusic old = null; // Old track being faded out
- private float mainVolume = 1.0f;
+ private float mainVolume = 0.0f;
private float musicVolume = 1.0f;
private float soundVolume = 1.0f;
private ArrayList sounds = new ArrayList<>();
+ private Preferences prefs = Preferences.userNodeForPackage(AcousticHandler.class);
+
public AcousticHandler(MdgaApp app) {
this.app = app;
+
+ mainVolume = prefs.getFloat("mainVolume", 1.0f);
+ musicVolume = prefs.getFloat("musicVolume", 1.0f);
+ soundVolume = prefs.getFloat("soundVolume", 1.0f);
}
/**
@@ -67,7 +74,19 @@ public void playSound(MdgaSound sound) {
assets.add(new SoundAssetDelayVolume(SoundAsset.LOST, 1.0f, 0.0f));
break;
case VICTORY:
- assets.add(new SoundAssetDelayVolume(SoundAsset.VICTORY, 1.0f, 2.0f));
+ assets.add(new SoundAssetDelayVolume(SoundAsset.VICTORY, 1.0f, 0.0f));
+ break;
+ case BUTTON_PRESSED:
+ assets.add(new SoundAssetDelayVolume(SoundAsset.BUTTON_PRESS, 0.7f, 0.0f));
+ break;
+ case WRONG_INPUT:
+ assets.add(new SoundAssetDelayVolume(SoundAsset.ERROR, 1.0f, 0.0f));
+ break;
+ case UI_CLICK:
+ assets.add(new SoundAssetDelayVolume(SoundAsset.UI_CLICK, 0.8f, 0.0f));
+ break;
+ case START:
+ assets.add(new SoundAssetDelayVolume(SoundAsset.START, 0.8f, 0.2f));
break;
default:
@@ -362,6 +381,7 @@ public float getSoundVolume() {
*/
public void setMainVolume(float mainVolume) {
this.mainVolume = mainVolume;
+ prefs.putFloat("mainVolume", mainVolume);
}
/**
@@ -371,6 +391,7 @@ public void setMainVolume(float mainVolume) {
*/
public void setMusicVolume(float musicVolume) {
this.musicVolume = musicVolume;
+ prefs.putFloat("musicVolume", musicVolume);
}
/**
@@ -380,6 +401,7 @@ public void setMusicVolume(float musicVolume) {
*/
public void setSoundVolume(float soundVolume) {
this.soundVolume = soundVolume;
+ prefs.putFloat("soundVolume", soundVolume);
}
/**
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java
index 6f39f04c..0a4949f3 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java
@@ -19,5 +19,9 @@ public enum MdgaSound {
DESELECT,
HURRY,
VICTORY,
- LOST
+ LOST,
+ BUTTON_PRESSED,
+ WRONG_INPUT,
+ UI_CLICK,
+ START,
}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java
index ce4e6c23..c931215a 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java
@@ -17,7 +17,11 @@ enum SoundAsset {
DESELECT(""),
HURRY(""),
VICTORY("LevelUp2.wav"),
- LOST("GameOver.wav");
+ LOST("GameOver.wav"),
+ BUTTON_PRESS("menu_button.ogg"),
+ ERROR("error_sound.ogg"),
+ UI_CLICK("uiclick.ogg"),
+ START("gamestart.ogg");
private final String path;
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/CameraHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/CameraHandler.java
index da97710e..a1c6b8d6 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/CameraHandler.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/CameraHandler.java
@@ -4,8 +4,10 @@
import com.jme3.light.DirectionalLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
+import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor;
+import com.jme3.scene.Spatial;
import com.jme3.shadow.DirectionalLightShadowFilter;
import com.jme3.shadow.EdgeFilteringMode;
import com.jme3.util.SkyFactory;
@@ -20,8 +22,21 @@ public class CameraHandler {
private static final int SHADOWMAP_SIZE = 1024 * 8;
- public CameraHandler(MdgaApp app, FilterPostProcessor fpp){
+ private Vector3f defaultCameraPosition;
+ private Quaternion defaultCameraRotation;
+
+ FilterPostProcessor fpp;
+ DirectionalLightShadowFilter dlsf;
+
+ Spatial sky;
+
+ public CameraHandler(MdgaApp app, FilterPostProcessor fpp) {
this.app = app;
+ this.fpp = fpp;
+
+ // Save the default camera state
+ this.defaultCameraPosition = app.getCamera().getLocation().clone();
+ this.defaultCameraRotation = app.getCamera().getRotation().clone();
sun = new DirectionalLight();
sun.setColor(ColorRGBA.White);
@@ -30,24 +45,35 @@ public CameraHandler(MdgaApp app, FilterPostProcessor fpp){
ambient = new AmbientLight();
ambient.setColor(new ColorRGBA(0.3f, 0.3f, 0.3f, 1));
- DirectionalLightShadowFilter dlsf = new DirectionalLightShadowFilter(app.getAssetManager(), SHADOWMAP_SIZE, 4);
+ dlsf = new DirectionalLightShadowFilter(app.getAssetManager(), SHADOWMAP_SIZE, 4);
dlsf.setLight(sun);
dlsf.setEnabled(true);
dlsf.setEdgeFilteringMode(EdgeFilteringMode.PCFPOISSON);
dlsf.setShadowIntensity(0.7f);
fpp.addFilter(dlsf);
- app.getRootNode().attachChild(SkyFactory.createSky(app.getAssetManager(), "Images/sky/sky.dds", EnvMapType.EquirectMap).rotate(FastMath.HALF_PI*1,0,FastMath.HALF_PI*0.2f));
+ sky = SkyFactory.createSky(app.getAssetManager(), "Images/sky/sky.dds", EnvMapType.EquirectMap).rotate(FastMath.HALF_PI*1,0,FastMath.HALF_PI*0.2f);
+
+
}
public void init() {
app.getRootNode().addLight(sun);
app.getRootNode().addLight(ambient);
+ app.getRootNode().attachChild(sky);
+ fpp.addFilter(dlsf);
}
public void shutdown() {
app.getRootNode().removeLight(sun);
app.getRootNode().removeLight(ambient);
+ app.getRootNode().detachChild(sky);
+
+ // Reset the camera to its default state
+ app.getCamera().setLocation(defaultCameraPosition);
+ app.getCamera().setRotation(defaultCameraRotation);
+
+ fpp.removeFilter(dlsf);
}
public void update(float scroll, float rotation) {
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/Outline/SelectObjectOutliner.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/Outline/SelectObjectOutliner.java
index 60684f0f..1a20e865 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/Outline/SelectObjectOutliner.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/Outline/SelectObjectOutliner.java
@@ -1,18 +1,12 @@
package pp.mdga.client.board.Outline;
import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.material.RenderState;
-import com.jme3.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA;
-import com.jme3.post.Filter;
import com.jme3.post.FilterPostProcessor;
import com.jme3.renderer.Camera;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
-import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
-import pp.mdga.game.Color;
public class SelectObjectOutliner {
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/button/AbstractButton.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/AbstractButton.java
new file mode 100644
index 00000000..de37adc1
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/AbstractButton.java
@@ -0,0 +1,56 @@
+package pp.mdga.client.button;
+
+import com.jme3.font.BitmapFont;
+import com.jme3.math.ColorRGBA;
+import com.jme3.math.Vector2f;
+import com.jme3.scene.Node;
+import pp.mdga.client.MdgaApp;
+
+public abstract class AbstractButton {
+ public static final ColorRGBA BUTTON_NORMAL = ColorRGBA.fromRGBA255(169, 165, 104, 255);
+ public static final ColorRGBA BUTTON_PRESSED = ColorRGBA.fromRGBA255(105, 117, 89, 255);
+ public static final ColorRGBA TEXT_NORMAL = ColorRGBA.Black;
+ public static final ColorRGBA TEXT_PRESSED = ColorRGBA.fromRGBA255( 180, 195, 191, 255);
+
+ public static final float HORIZONTAL = 16;
+ public static final float VERTICAL = 9;
+
+ protected BitmapFont font;
+
+ protected final MdgaApp app;
+ protected final Node node;
+
+ protected Vector2f pos;
+ protected float fontSizeFactor = 1.0f;
+
+ protected float fontSize;
+ protected float horizontalStep;
+ protected float verticalStep;
+ protected float heightStep;
+ protected float widthStep;
+
+ protected boolean adjust = false;
+
+ public AbstractButton(MdgaApp app, Node node) {
+ this.app = app;
+ this.node = node;
+
+ font = app.getAssetManager().loadFont("Fonts/Gunplay.fnt");
+ }
+
+ public abstract void show();
+ public abstract void hide();
+
+ public void setPos(Vector2f pos) {
+ this.pos = pos;
+ }
+
+ protected void calculateRelative() {
+ fontSize = fontSizeFactor * 15 * (float)app.getCamera().getWidth() / 720;
+
+ horizontalStep = (float)app.getCamera().getWidth() / HORIZONTAL;
+ verticalStep = (float)app.getCamera().getHeight() / VERTICAL;
+ heightStep = verticalStep / 2;
+ widthStep = horizontalStep / 2;
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/button/ButtonLeft.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/ButtonLeft.java
new file mode 100644
index 00000000..16933f5f
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/ButtonLeft.java
@@ -0,0 +1,21 @@
+package pp.mdga.client.button;
+
+import com.jme3.math.Vector2f;
+import com.jme3.scene.Node;
+import pp.mdga.client.MdgaApp;
+
+public class ButtonLeft extends ClickButton {
+ public ButtonLeft(MdgaApp app, Node node, Runnable action, String label, int narrowFactor) {
+ super(app, node, action, label, new Vector2f( 5, 2), new Vector2f(0.5f * narrowFactor, 1.8f));
+ }
+
+ @Override
+ public void onHover() {
+
+ }
+
+ @Override
+ public void onUnHover() {
+
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/button/ButtonRight.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/ButtonRight.java
new file mode 100644
index 00000000..aacacd4c
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/ButtonRight.java
@@ -0,0 +1,23 @@
+package pp.mdga.client.button;
+
+import com.jme3.math.Vector2f;
+import com.jme3.scene.Node;
+import pp.mdga.client.MdgaApp;
+
+public class ButtonRight extends ClickButton {
+ public ButtonRight(MdgaApp app, Node node, Runnable action, String label, int narrowFactor) {
+ super(app, node, action, label, new Vector2f( 5, 2), new Vector2f(HORIZONTAL - 0.5f * narrowFactor, 1.8f));
+
+ adjust = true;
+ }
+
+ @Override
+ public void onHover() {
+
+ }
+
+ @Override
+ public void onUnHover() {
+
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/button/CeremonyButton.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/CeremonyButton.java
new file mode 100644
index 00000000..4b207f0b
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/CeremonyButton.java
@@ -0,0 +1,178 @@
+package pp.mdga.client.button;
+
+import com.jme3.material.Material;
+import com.jme3.math.ColorRGBA;
+import com.jme3.math.Quaternion;
+import com.jme3.math.Vector2f;
+import com.jme3.math.Vector3f;
+import com.jme3.renderer.queue.RenderQueue;
+import com.jme3.scene.Node;
+import com.jme3.scene.Spatial;
+import com.simsilica.lemur.component.QuadBackgroundComponent;
+import pp.mdga.client.Asset;
+import pp.mdga.client.MdgaApp;
+import pp.mdga.game.Color;
+
+public class CeremonyButton extends ClickButton {
+ public enum Pos {
+ FIRST,
+ SECOND,
+ THIRD,
+ LOST,
+ }
+
+ static final float WIDTH = 4.0f;
+
+ private final Node node3d;
+
+ private boolean rotate = false;
+ private Spatial model;
+ private float rot = 180;
+
+ private LobbyButton.Taken taken = LobbyButton.Taken.NOT;
+
+ private LabelButton label;
+
+ public CeremonyButton(MdgaApp app, Node node, Node node3d, Color tsk, Pos pos, String name) {
+ super(app, node, () -> {} , "", new Vector2f(WIDTH, 7), new Vector2f(0, 0));
+
+ this.node3d = node3d;
+
+ label = new LabelButton(app, node, name, new Vector2f( WIDTH, 1), new Vector2f(0, 0));
+
+ final float mid = HORIZONTAL / 2;
+ final float uiSpacing = 1.4f;
+ final float figSpacingX = 0.9f;
+ final float figSpacingY = 0.25f;
+
+ float uiX = mid;
+ float uiY = 6;
+ float figX = 0;
+ float figY = -0.32f;
+
+ Asset asset = switch (tsk) {
+ case CYBER -> {
+ instance.setText("CIR");
+ yield Asset.cir;
+ }
+ case AIRFORCE -> {
+ instance.setText("Luftwaffe");
+ yield Asset.lw;
+ }
+ case ARMY -> {
+ instance.setText("Heer");
+ yield Asset.heer;
+ }
+ case NAVY -> {
+ instance.setText("Marine");
+ yield Asset.marine;
+ }
+ };
+
+ switch (pos) {
+ case FIRST:
+ rotate = true;
+ uiX = 0;
+ uiY -= 0;
+ figX = 0;
+ figY -= 1 * figSpacingY;
+ break;
+ case SECOND:
+ adjust = true;
+ label.adjust = true;
+ uiX -= uiSpacing;
+ uiY -= 1;
+ figX -= figSpacingX;
+ figY -= 2 * figSpacingY;
+ figY -= 0.1f;
+ break;
+ case THIRD:
+ uiX += uiSpacing;
+ uiY -= 1.5f;
+ figX += figSpacingX;
+ figY -= 3 * figSpacingY;
+ figY -= 0.07f;
+ break;
+ case LOST:
+ adjust = true;
+ label.adjust = true;
+ uiX -= 1 * uiSpacing + 0.4f;
+ uiX -= WIDTH / 2;
+ uiY -= 2;
+ figX -= 2 * figSpacingX;
+ figY -= 4 * figSpacingY;
+ break;
+ }
+
+ setPos(new Vector2f(uiX, uiY));
+ label.setPos(new Vector2f(uiX, uiY + 1));
+
+ createModel(asset, new Vector3f(figX, figY, 6));
+ }
+
+ @Override
+ public void onHover() {
+ ColorRGBA buttonNormal = ColorRGBA.Gray.clone();// BUTTON_NORMAL.clone();
+ buttonNormal.a = 0.01f;
+
+ QuadBackgroundComponent background = new QuadBackgroundComponent(buttonNormal);
+ instance.setBackground(background);
+ }
+
+ @Override
+ public void onUnHover() {
+ ColorRGBA buttonNormal = ColorRGBA.Gray.clone();// BUTTON_NORMAL.clone();
+ buttonNormal.a = 0.01f;
+
+ QuadBackgroundComponent background = new QuadBackgroundComponent(buttonNormal);
+ instance.setBackground(background);
+ }
+
+ @Override
+ public void show() {
+ release();
+
+ calculateRelative();
+ setRelative();
+
+ node.attachChild(instance);
+ node3d.attachChild(model);
+
+ label.show();
+ }
+
+ @Override
+ public void hide() {
+ node.detachChild(instance);
+ node3d.detachChild(model);
+
+ label.hide();
+ }
+
+ public void update(float tpf) {
+ if(rotate) {
+ rot += 140.0f * tpf;
+ rot %= 360;
+ } else {
+ rot = 180;
+ }
+
+ model.setLocalRotation(new Quaternion().fromAngles((float) Math.toRadians(90), (float) Math.toRadians(rot), (float) Math.toRadians(180)));
+ }
+
+ private void createModel(Asset asset, Vector3f pos) {
+ String modelName = asset.getModelPath();
+ String texName = asset.getDiffPath();
+
+ model = app.getAssetManager().loadModel(modelName);
+ model.scale(asset.getSize() / 2);
+ model.rotate((float) Math.toRadians(90), (float) Math.toRadians(rot), (float) Math.toRadians(180));
+ model.setShadowMode(RenderQueue.ShadowMode.CastAndReceive);
+
+ model.setLocalTranslation(pos);
+
+ Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");
+ mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(texName));
+ model.setMaterial(mat);
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/button/ClickButton.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/ClickButton.java
new file mode 100644
index 00000000..08fb544d
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/ClickButton.java
@@ -0,0 +1,108 @@
+package pp.mdga.client.button;
+
+import com.jme3.math.Vector2f;
+import com.jme3.math.Vector3f;
+import com.jme3.scene.Node;
+import com.simsilica.lemur.Button;
+import com.simsilica.lemur.HAlignment;
+import com.simsilica.lemur.VAlignment;
+import com.simsilica.lemur.component.QuadBackgroundComponent;
+import pp.mdga.client.MdgaApp;
+import pp.mdga.client.acoustic.MdgaSound;
+
+public abstract class ClickButton extends AbstractButton {
+ protected final Runnable action;
+
+ protected String label;
+ protected Vector2f size;
+
+ protected Button instance;
+
+ ClickButton(MdgaApp app, Node node, Runnable action, String label, Vector2f size, Vector2f pos) {
+ super(app, node);
+
+ this.action = action;
+ this.label = label;
+ this.pos = pos;
+ this.size = size;
+
+ instance = new Button(label);
+
+ instance.addClickCommands((button) -> { app.getAcousticHandler().playSound(MdgaSound.BUTTON_PRESSED); action.run(); });
+ instance.setTextHAlignment(HAlignment.Center);
+ instance.setTextVAlignment(VAlignment.Center);
+
+ instance.addCommands(Button.ButtonAction.HighlightOn, (button) -> click());
+ instance.addCommands(Button.ButtonAction.HighlightOff, (button) -> release());
+
+ instance.setFont(font);
+ instance.setFocusColor(TEXT_NORMAL);
+
+ calculateRelative();
+ setRelative();
+ }
+
+ @Override
+ public void show() {
+ release();
+
+ calculateRelative();
+ setRelative();
+
+ node.attachChild(instance);
+ }
+
+ @Override
+ public void hide() {
+ node.detachChild(instance);
+ }
+
+ protected abstract void onHover();
+ protected abstract void onUnHover();
+
+ protected void click() {
+ instance.setColor(TEXT_PRESSED);
+ instance.setHighlightColor(TEXT_PRESSED);
+
+ QuadBackgroundComponent background = new QuadBackgroundComponent(BUTTON_PRESSED);
+ instance.setBackground(background);
+
+ app.getAcousticHandler().playSound(MdgaSound.UI_CLICK);
+
+ onHover();
+ };
+
+ protected void release() {
+ instance.setColor(TEXT_NORMAL);
+ instance.setHighlightColor(TEXT_NORMAL);
+
+ QuadBackgroundComponent background = new QuadBackgroundComponent(BUTTON_NORMAL);
+ instance.setBackground(background);
+
+ onUnHover();
+ };
+
+ protected void setRelative() {
+ instance.setFontSize(fontSize);
+
+ instance.setPreferredSize(new Vector3f(size.x * widthStep, size.y * heightStep, 0));
+
+ float xAdjust = 0.0f;
+ if(adjust) {
+ xAdjust = instance.getPreferredSize().x;
+ }
+
+ instance.setLocalTranslation(pos.x * horizontalStep - xAdjust, pos.y * verticalStep, -1);
+
+ final float horizontalMid = ((float)app.getCamera().getWidth() / 2) - (instance.getPreferredSize().x / 2);
+ final float verticalMid = ((float)app.getCamera().getHeight() / 2) - instance.getPreferredSize().y / 2;
+
+ if(0 == pos.x) {
+ instance.setLocalTranslation(horizontalMid, instance.getLocalTranslation().y, instance.getLocalTranslation().z);
+ }
+
+ if(0 == pos.y) {
+ instance.setLocalTranslation(instance.getLocalTranslation().x, verticalMid, instance.getLocalTranslation().z);
+ }
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/button/InputButton.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/InputButton.java
new file mode 100644
index 00000000..99034ebd
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/InputButton.java
@@ -0,0 +1,102 @@
+package pp.mdga.client.button;
+
+import com.jme3.math.Vector2f;
+import com.jme3.math.Vector3f;
+import com.jme3.scene.Node;
+import com.simsilica.lemur.*;
+import com.simsilica.lemur.component.QuadBackgroundComponent;
+import pp.mdga.client.MdgaApp;
+
+public class InputButton extends AbstractButton {
+ private Label label;
+ private TextField field;
+
+ private Container container = new Container();
+
+ private final int maxLenght;
+
+ protected Vector2f size;
+
+ public InputButton(MdgaApp app, Node node, String label, int maxLenght) {
+ super(app, node);
+
+ this.label = new Label(label);
+ this.maxLenght = maxLenght;
+
+ this.label.setColor(TEXT_NORMAL);
+
+ field = new TextField("");
+ field.setColor(TEXT_NORMAL);
+ field.setTextHAlignment(HAlignment.Left);
+ field.setTextVAlignment(VAlignment.Center);
+
+ QuadBackgroundComponent grayBackground = new QuadBackgroundComponent(BUTTON_NORMAL);
+ field.setBackground(grayBackground);
+
+ this.label.setFont(font);
+ field.setFont(font);
+
+ pos = new Vector2f( 0, 0);
+ size = new Vector2f(5.5f, 1);
+
+ container.addChild(this.label);
+ container.addChild(field);
+ }
+
+ @Override
+ public void show() {
+ calculateRelative();
+ setRelative();
+
+ node.attachChild(container);
+ }
+
+ @Override
+ public void hide() {
+ node.detachChild(container);
+ }
+
+ public void update() {
+ String text = field.getText();
+ int length = text.length();
+
+ if (length > maxLenght) {
+ field.setText(text.substring(0, maxLenght));
+ }
+ }
+
+ protected void setRelative() {
+ this.label.setFontSize(fontSize);
+ field.setFontSize(fontSize);
+
+ field.setPreferredSize(new Vector3f(size.x * widthStep, size.y * heightStep, 0));
+
+ float xAdjust = 0.0f;
+ if(adjust) {
+ xAdjust = container.getPreferredSize().x;
+ }
+
+ container.setLocalTranslation(pos.x * horizontalStep - xAdjust, pos.y * verticalStep, -1);
+
+ final float horizontalMid = ((float)app.getCamera().getWidth() / 2) - (container.getPreferredSize().x / 2);
+ final float verticalMid = ((float)app.getCamera().getHeight() / 2) - container.getPreferredSize().y / 2;
+
+ if(0 == pos.x) {
+ container.setLocalTranslation(horizontalMid, container.getLocalTranslation().y, -1);
+ }
+
+ if(0 == pos.y) {
+ container.setLocalTranslation(container.getLocalTranslation().x, verticalMid, -1);
+ }
+ }
+
+ public String getString() {
+ return field.getText();
+ }
+
+ public void setString(String string) { field.setText(string); }
+
+ public void reset() {
+ field.setText("");
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/button/LabelButton.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/LabelButton.java
new file mode 100644
index 00000000..1740a954
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/LabelButton.java
@@ -0,0 +1,63 @@
+package pp.mdga.client.button;
+
+import com.jme3.math.ColorRGBA;
+import com.jme3.math.Vector2f;
+import com.jme3.scene.Node;
+import com.simsilica.lemur.component.QuadBackgroundComponent;
+import pp.mdga.client.MdgaApp;
+
+public class LabelButton extends ClickButton{
+ private ColorRGBA text = TEXT_NORMAL;
+ private ColorRGBA button = BUTTON_NORMAL;
+
+ public LabelButton(MdgaApp app, Node node, String label, Vector2f size, Vector2f pos) {
+ super(app, node, () -> {}, label, size, pos);
+ }
+
+ @Override
+ public void show() {
+ release();
+
+ calculateRelative();
+ setRelative();
+
+ instance.setFontSize(fontSize / 2);
+
+ node.attachChild(instance);
+ }
+
+ @Override
+ public void hide() {
+ node.detachChild(instance);
+ }
+
+ @Override
+ public void onHover() {
+ instance.setColor(text);
+ instance.setHighlightColor(text);
+
+ QuadBackgroundComponent background = new QuadBackgroundComponent(button);
+ instance.setBackground(background);
+ }
+
+ @Override
+ public void onUnHover() {
+ instance.setColor(text);
+ instance.setHighlightColor(text);
+
+ QuadBackgroundComponent background = new QuadBackgroundComponent(button);
+ instance.setBackground(background);
+ }
+
+ public void setText(String text) {
+ instance.setText(text);
+ }
+
+ public void setColor(ColorRGBA text, ColorRGBA button) {
+ this.text = text;
+ this.button = button;
+
+ hide();
+ show();
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/button/LobbyButton.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/LobbyButton.java
new file mode 100644
index 00000000..5264327c
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/LobbyButton.java
@@ -0,0 +1,218 @@
+package pp.mdga.client.button;
+
+import com.jme3.light.AmbientLight;
+import com.jme3.material.Material;
+import com.jme3.math.ColorRGBA;
+import com.jme3.math.Quaternion;
+import com.jme3.math.Vector2f;
+import com.jme3.math.Vector3f;
+import com.jme3.renderer.queue.RenderQueue;
+import com.jme3.scene.Node;
+import com.jme3.scene.Spatial;
+import com.simsilica.lemur.component.QuadBackgroundComponent;
+import pp.mdga.client.Asset;
+import pp.mdga.client.MdgaApp;
+import pp.mdga.game.Color;
+
+public class LobbyButton extends ClickButton {
+ public enum Taken {
+ NOT,
+ SELF,
+ OTHER,
+ }
+
+ static final ColorRGBA LOBBY_TAKEN = ColorRGBA.fromRGBA255(193,58,59, 25);
+ static final ColorRGBA LOBBY_READY = ColorRGBA.fromRGBA255(55,172,190, 25);
+ static final ColorRGBA LOBBY_READY_HOVER = ColorRGBA.fromRGBA255(17,211,218, 25);
+ static final ColorRGBA LOBBY_SELF_NORMAL = ColorRGBA.fromRGBA255(34,103,24, 25);
+ static final ColorRGBA LOBBY_SELF_HOVER = ColorRGBA.fromRGBA255(42,151,19, 25);
+
+ static final float WIDTH = 4.0f;
+
+ private final Node node3d;
+
+ private boolean rotate = false;
+ private Spatial model;
+ private float rot = 180;
+
+ private Taken taken = Taken.NOT;
+
+ private LabelButton label;
+
+ private boolean isReady = false;
+
+ public LobbyButton(MdgaApp app, Node node, Node node3d, Runnable action, Color tsk) {
+ super(app, node, action, "", new Vector2f(WIDTH, 7), new Vector2f(0, 0));
+
+ this.node3d = node3d;
+
+ label = new LabelButton(app, node, "- leer -", new Vector2f( WIDTH, 1), new Vector2f(0, 0));
+
+ final float mid = HORIZONTAL / 2;
+ final float uiSpacing = 0.4f;
+ final float figSpacing = 0.51f;
+
+ float uiX = mid;
+ float figX = 0;
+ Asset asset = null;
+
+ switch (tsk) {
+ case CYBER:
+ adjust = true;
+ label.adjust = true;
+ uiX -= 3 * uiSpacing;
+ uiX -= WIDTH / 2;
+ asset = Asset.cir;
+ figX -= 3 * figSpacing;
+ instance.setText("CIR");
+ break;
+ case AIRFORCE:
+ adjust = true;
+ label.adjust = true;
+ uiX -= uiSpacing;
+ asset = Asset.lw;
+ figX -= figSpacing;
+ instance.setText("Luftwaffe");
+ break;
+ case ARMY:
+ uiX += uiSpacing;
+ asset = Asset.heer;
+ figX += figSpacing;
+ instance.setText("Heer");
+ break;
+ case NAVY:
+ uiX += 3 * uiSpacing;
+ uiX += WIDTH / 2;
+ asset = Asset.marine;
+ figX += 3 * figSpacing;
+ instance.setText("Marine");
+ break;
+ }
+
+ setPos(new Vector2f(uiX, 6));
+ label.setPos(new Vector2f(uiX, 7));
+
+ createModel(asset, new Vector3f(figX, -0.55f, 6));
+ }
+
+ @Override
+ public void onHover() {
+ ColorRGBA buttonPressed = BUTTON_PRESSED.clone();
+
+ switch (taken) {
+ case NOT:
+ buttonPressed.a = 0.3f;
+ break;
+ case SELF:
+ buttonPressed = LOBBY_SELF_HOVER;
+ break;
+ case OTHER:
+ buttonPressed = LOBBY_TAKEN;
+ break;
+ }
+
+ if(isReady) {
+ buttonPressed = LOBBY_READY_HOVER;
+ }
+
+ QuadBackgroundComponent background = new QuadBackgroundComponent(buttonPressed);
+ instance.setBackground(background);
+
+ rotate = true;
+ }
+
+ @Override
+ public void onUnHover() {
+ ColorRGBA buttonNormal = ColorRGBA.Gray.clone();// BUTTON_NORMAL.clone();
+
+ switch (taken) {
+ case NOT:
+ buttonNormal.a = 0.1f;
+ break;
+ case SELF:
+ buttonNormal = LOBBY_SELF_NORMAL;
+ break;
+ case OTHER:
+ buttonNormal = LOBBY_TAKEN;
+ break;
+ }
+
+ if(isReady) {
+ buttonNormal = LOBBY_READY;
+ }
+
+ QuadBackgroundComponent background = new QuadBackgroundComponent(buttonNormal);
+ instance.setBackground(background);
+
+ rotate = false;
+ }
+
+ @Override
+ public void show() {
+ release();
+
+ calculateRelative();
+ setRelative();
+
+ node.attachChild(instance);
+ node3d.attachChild(model);
+
+ label.show();
+ }
+
+ @Override
+ public void hide() {
+ node.detachChild(instance);
+ node3d.detachChild(model);
+
+ label.hide();
+ }
+
+ public void update(float tpf) {
+ if(rotate) {
+ rot += 140.0f * tpf;
+ rot %= 360;
+ } else {
+ rot = 180;
+ }
+
+ model.setLocalRotation(new Quaternion().fromAngles((float) Math.toRadians(90), (float) Math.toRadians(rot), (float) Math.toRadians(180)));
+ }
+
+ private void createModel(Asset asset, Vector3f pos) {
+ String modelName = asset.getModelPath();
+ String texName = asset.getDiffPath();
+
+ model = app.getAssetManager().loadModel(modelName);
+ model.scale(asset.getSize() / 2);
+ model.rotate((float) Math.toRadians(90), (float) Math.toRadians(rot), (float) Math.toRadians(180));
+ model.setShadowMode(RenderQueue.ShadowMode.CastAndReceive);
+
+ model.setLocalTranslation(pos);
+
+ Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");
+ mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(texName));
+ model.setMaterial(mat);
+ }
+
+ public Taken getTaken() {
+ return taken;
+ }
+
+ public void setTaken(Taken taken, String name) {
+ this.taken = taken;
+
+ if(taken == Taken.NOT) {
+ label.setText("- leer -");
+ isReady = false;
+ } else {
+ label.setText(name);
+ }
+
+ onUnHover();
+ }
+
+ public void setReady(boolean isReady) {
+ this.isReady = isReady;
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/button/MenuButton.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/MenuButton.java
new file mode 100644
index 00000000..7217ee36
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/MenuButton.java
@@ -0,0 +1,21 @@
+package pp.mdga.client.button;
+
+import com.jme3.math.Vector2f;
+import com.jme3.scene.Node;
+import pp.mdga.client.MdgaApp;
+
+public class MenuButton extends ClickButton {
+ public MenuButton(MdgaApp app, Node node, Runnable action, String label) {
+ super(app, node, action, label, new Vector2f( 5.5f, 2), new Vector2f(0, 0));
+ }
+
+ @Override
+ public void onHover() {
+
+ }
+
+ @Override
+ public void onUnHover() {
+
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/button/SettingsButton.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/SettingsButton.java
new file mode 100644
index 00000000..eef5c263
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/SettingsButton.java
@@ -0,0 +1,34 @@
+package pp.mdga.client.button;
+
+import com.jme3.math.Vector2f;
+import com.jme3.scene.Node;
+import com.simsilica.lemur.HAlignment;
+import com.simsilica.lemur.VAlignment;
+import com.simsilica.lemur.component.IconComponent;
+import pp.mdga.client.MdgaApp;
+
+public class SettingsButton extends ClickButton {
+ private IconComponent icon;
+
+ public SettingsButton(MdgaApp app, Node node, Runnable action) {
+ super(app, node, action, "", new Vector2f(2, 2), new Vector2f(HORIZONTAL - 0.5f, VERTICAL - 0.5f));
+
+ adjust = true;
+
+ icon = new IconComponent("Images/zahnrad.png");
+ icon.setIconScale(0.1f * app.getImageScale());
+ icon.setHAlignment(HAlignment.Center);
+ icon.setVAlignment(VAlignment.Center);
+ instance.setIcon(icon);
+ }
+
+ @Override
+ public void onHover() {
+
+ }
+
+ @Override
+ public void onUnHover() {
+
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/button/SliderButton.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/SliderButton.java
new file mode 100644
index 00000000..4dbccf91
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/SliderButton.java
@@ -0,0 +1,109 @@
+package pp.mdga.client.button;
+
+import com.jme3.math.Vector2f;
+import com.jme3.math.Vector3f;
+import com.jme3.scene.Node;
+import com.simsilica.lemur.*;
+import com.simsilica.lemur.component.QuadBackgroundComponent;
+import pp.mdga.client.MdgaApp;
+
+public class SliderButton extends AbstractButton {
+ private Label label;
+
+ private Slider slider;
+
+ private Container container = new Container();
+
+ protected Vector2f size;
+
+ public SliderButton(MdgaApp app, Node node, String label) {
+ super(app, node);
+
+ this.label = new Label(label);
+
+ this.label.setColor(TEXT_NORMAL);
+
+ slider = new Slider("slider");
+
+ slider.getDecrementButton().setText(" - ");
+ slider.getDecrementButton().setFont(font);
+ slider.getDecrementButton().setFocusColor(TEXT_NORMAL);
+ slider.getDecrementButton().setTextVAlignment(VAlignment.Bottom);
+ slider.getDecrementButton().setColor(TEXT_NORMAL);
+ slider.getDecrementButton().setHighlightColor(TEXT_NORMAL);
+
+ slider.getIncrementButton().setText(" + ");
+ slider.getIncrementButton().setFont(font);
+ slider.getIncrementButton().setFocusColor(TEXT_NORMAL);
+ slider.getIncrementButton().setTextVAlignment(VAlignment.Bottom);
+ slider.getIncrementButton().setColor(TEXT_NORMAL);
+ slider.getIncrementButton().setHighlightColor(TEXT_NORMAL);
+
+ slider.getThumbButton().setText("X");
+ slider.getThumbButton().setFont(font);
+ slider.getThumbButton().setFocusColor(TEXT_NORMAL);
+ slider.getThumbButton().setColor(TEXT_NORMAL);
+ slider.getThumbButton().setHighlightColor(TEXT_NORMAL);
+
+ QuadBackgroundComponent background = new QuadBackgroundComponent(BUTTON_NORMAL);
+ slider.setBackground(background);
+
+ this.label.setFont(font);
+
+ pos = new Vector2f( 0, 0);
+ size = new Vector2f(5.5f, 1);
+
+ container.addChild(this.label);
+
+ container.addChild(slider);
+ }
+
+ @Override
+ public void show() {
+ calculateRelative();
+ setRelative();
+
+ node.attachChild(container);
+ }
+
+ @Override
+ public void hide() {
+ node.detachChild(container);
+ }
+
+ protected void setRelative() {
+ this.label.setFontSize(fontSize);
+
+ slider.getDecrementButton().setFontSize(fontSize);
+ slider.getIncrementButton().setFontSize(fontSize);
+ slider.getThumbButton().setFontSize(fontSize);
+
+ slider.setPreferredSize(new Vector3f(size.x * widthStep, size.y * heightStep, 0));
+
+ float xAdjust = 0.0f;
+ if(adjust) {
+ xAdjust = container.getPreferredSize().x;
+ }
+
+ container.setLocalTranslation(pos.x * horizontalStep - xAdjust, pos.y * verticalStep, -1);
+
+ final float horizontalMid = ((float)app.getCamera().getWidth() / 2) - (container.getPreferredSize().x / 2);
+ final float verticalMid = ((float)app.getCamera().getHeight() / 2) - container.getPreferredSize().y / 2;
+
+ if(0 == pos.x) {
+ container.setLocalTranslation(horizontalMid, container.getLocalTranslation().y, -1);
+ }
+
+ if(0 == pos.y) {
+ container.setLocalTranslation(container.getLocalTranslation().x, verticalMid, -1);
+ }
+ }
+
+ public float getPercent() {
+ return (float) slider.getModel().getPercent();
+ }
+
+ public void setPercent(float percent) {
+ slider.getModel().setPercent(percent);
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/AudioSettingsDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/AudioSettingsDialog.java
new file mode 100644
index 00000000..5a1dd930
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/AudioSettingsDialog.java
@@ -0,0 +1,82 @@
+package pp.mdga.client.dialog;
+
+import com.jme3.math.Vector2f;
+import com.jme3.scene.Node;
+import pp.mdga.client.MdgaApp;
+import pp.mdga.client.button.MenuButton;
+import pp.mdga.client.button.SliderButton;
+import pp.mdga.client.view.MdgaView;
+
+public class AudioSettingsDialog extends Dialog {
+ private final MdgaView view;
+
+ private SliderButton mainVolume;
+ private SliderButton musicVolume;
+ private SliderButton soundVolume;
+
+ private MenuButton backButton;
+
+ private boolean active = false;
+
+ public AudioSettingsDialog(MdgaApp app, Node node, MdgaView view) {
+ super(app, node);
+
+ this.view = view;
+
+ mainVolume = new SliderButton(app, node, "Gesamt Lautstärke");
+ musicVolume = new SliderButton(app, node, "Musik Lautstärke");
+ soundVolume = new SliderButton(app, node, "Effekt Lautstärke");
+
+ backButton = new MenuButton(app, node, view::leaveAudioSettings, "Zurück");
+
+ float offset = 1.0f;
+
+ mainVolume.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
+ offset += 1.75f;
+
+ musicVolume.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
+ offset += 1.75f;
+
+ soundVolume.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
+ offset += 1.75f * 1.3f;
+
+ backButton.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
+ offset += 1.75f;
+ }
+
+ @Override
+ protected void onShow() {
+ active = true;
+
+ mainVolume.setPercent(app.getAcousticHandler().getMainVolume());
+ musicVolume.setPercent(app.getAcousticHandler().getMusicVolume());
+ soundVolume.setPercent(app.getAcousticHandler().getSoundVolume());
+
+ backButton.show();
+
+ mainVolume.show();
+ musicVolume.show();
+ soundVolume.show();
+ }
+
+ @Override
+ protected void onHide() {
+ active = false;
+
+ backButton.hide();
+
+ mainVolume.hide();
+ musicVolume.hide();
+ soundVolume.hide();
+ }
+
+ public void update() {
+ if(!active) {
+ return;
+ }
+
+ app.getAcousticHandler().setMainVolume(mainVolume.getPercent());
+ app.getAcousticHandler().setMusicVolume(musicVolume.getPercent());
+ app.getAcousticHandler().setSoundVolume(soundVolume.getPercent());
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/CeremonyDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/CeremonyDialog.java
new file mode 100644
index 00000000..d21296d0
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/CeremonyDialog.java
@@ -0,0 +1,105 @@
+package pp.mdga.client.dialog;
+
+import com.jme3.math.ColorRGBA;
+import com.jme3.math.Vector2f;
+import com.jme3.scene.Node;
+import pp.mdga.client.MdgaApp;
+import pp.mdga.client.button.AbstractButton;
+import pp.mdga.client.button.LabelButton;
+import pp.mdga.client.button.MenuButton;
+
+import java.util.ArrayList;
+
+public class CeremonyDialog extends Dialog {
+ private ArrayList> labels;
+
+ float offsetX;
+
+ public CeremonyDialog(MdgaApp app, Node node) {
+ super(app, node);
+
+ prepare();
+ }
+
+ @Override
+ protected void onShow() {
+ for (ArrayList row : labels) {
+ for (LabelButton b : row) {
+ b.show();
+ }
+ }
+ }
+
+ @Override
+ protected void onHide() {
+ for (ArrayList row : labels) {
+ for (LabelButton b : row) {
+ b.hide();
+ }
+ }
+ }
+
+ public void addStatisticsRow(String name, int v1, int v2, int v3, int v4, int v5, int v6) {
+ float offsetYSmall = 0.5f;
+
+ ArrayList row = new ArrayList<>();
+
+ Vector2f sizeSmall = new Vector2f(4, 1.2f);
+ row.add(new LabelButton(app, node, name, sizeSmall, new Vector2f()));
+ row.add(new LabelButton(app, node, "" + v1, sizeSmall, new Vector2f()));
+ row.add(new LabelButton(app, node, "" + v2, sizeSmall, new Vector2f()));
+ row.add(new LabelButton(app, node, "" + v3, sizeSmall, new Vector2f()));
+ row.add(new LabelButton(app, node, "" + v4, sizeSmall, new Vector2f()));
+ row.add(new LabelButton(app, node, "" + v5, sizeSmall, new Vector2f()));
+ row.add(new LabelButton(app, node, "" + v6, sizeSmall, new Vector2f()));
+
+ ColorRGBA colorText = AbstractButton.TEXT_NORMAL.clone();
+ colorText.a = 0.1f;
+
+ ColorRGBA colorButton = AbstractButton.BUTTON_NORMAL.clone();
+ colorButton.a = 0.1f;
+
+ int j = 0;
+ for (LabelButton b : row) {
+ if(j > 0) {
+ b.setColor(colorText, colorButton);
+ }
+
+ b.setPos(new Vector2f(offsetX, MenuButton.VERTICAL - offsetYSmall));
+ offsetYSmall += 0.8f;
+
+ j++;
+ }
+
+ offsetX += 2.3f;
+
+ labels.add(row);
+ }
+
+ public void prepare() {
+ offsetX = 0.5f;
+
+ labels = new ArrayList<>();
+
+ ArrayList first = new ArrayList<>();
+ Vector2f size = new Vector2f(4, 1.2f);
+ first.add(new LabelButton(app, node, "", size, new Vector2f()));
+ first.add(new LabelButton(app, node, "Figuren geworfen", size, new Vector2f()));
+ first.add(new LabelButton(app, node, "Figuren verloren", size, new Vector2f()));
+ first.add(new LabelButton(app, node, "Verwendete Bonuskarten", size, new Vector2f()));
+ first.add(new LabelButton(app, node, "Gewürfelte 6en", size, new Vector2f()));
+ first.add(new LabelButton(app, node, "Gelaufene Felder", size, new Vector2f()));
+ first.add(new LabelButton(app, node, "Bonusfeldern erreicht", size, new Vector2f()));
+
+ float offsetY = 0.5f;
+
+ for (LabelButton b : first) {
+ b.setPos(new Vector2f(offsetX, MenuButton.VERTICAL - offsetY));
+ offsetY += 0.8f;
+ }
+
+ offsetX += 2.3f;
+
+ labels.add(first);
+ }
+}
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 421f4cff..89c39555 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
@@ -1,82 +1,32 @@
package pp.mdga.client.dialog;
-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 pp.mdga.client.MdgaApp;
-import static com.jme3.math.FastMath.floor;
-
public abstract class Dialog {
- protected final ColorRGBA COLOR_DEFAULT = ColorRGBA.Gray;
- protected final ColorRGBA COLOR_HOVER = ColorRGBA.DarkGray;
-
- protected Container container;
-
protected final MdgaApp app;
- private final Node node;
+ protected final Node node = new Node();
- protected final float vertical_step;
- protected final float horitontal_step;
+ private final Node root;
- protected float fontSize = 35;
-
- public Dialog(MdgaApp app, Node node) {
+ 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;
-
- int val = (int) (32 * Math.min(app.getResolutionFactor() * 0.9f, 1));
- fontSize = val;
+ this.root = node;
}
public void show() {
- node.attachChild(container);
+ root.attachChild(node);
+
+ onShow();
}
- public void hide () {
- node.detachChild(container);
+ public void hide() {
+ root.detachChild(node);
+
+ onHide();
}
- protected void createButton(String label, Runnable action, Vector3f size) {
- Button button = new Button(label);
- button.addClickCommands(source -> action.run());
- button.setFontSize(fontSize);
- 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 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
- button.setBackground(background);
-
- button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOn, (source) -> {
- QuadBackgroundComponent hoverBackground = new QuadBackgroundComponent(COLOR_HOVER);
- hoverBackground.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
- 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 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
- source.setBackground(normalBackground);
- button.setHighlightColor(ColorRGBA.White);
- button.setColor(ColorRGBA.Black);
- });
-
- container.addChild(button);
- }
+ protected abstract void onShow();
+ protected abstract void onHide ();
}
-
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/GetPercentRunnable.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/GetPercentRunnable.java
deleted file mode 100644
index d50a5450..00000000
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/GetPercentRunnable.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package pp.mdga.client.dialog;
-
-import java.util.function.Supplier;
-
-public class GetPercentRunnable {
- private final Supplier action;
-
- public GetPercentRunnable(Supplier action) {
- this.action = action;
- }
-
- public float get() {
- return action.get();
- }
-}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/HostDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/HostDialog.java
index 02522c5b..240a27a1 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/HostDialog.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/HostDialog.java
@@ -1,143 +1,68 @@
package pp.mdga.client.dialog;
-import com.jme3.math.ColorRGBA;
-import com.jme3.math.Vector3f;
+import com.jme3.math.Vector2f;
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;
+import pp.mdga.client.button.ButtonLeft;
+import pp.mdga.client.button.ButtonRight;
+import pp.mdga.client.button.InputButton;
+import pp.mdga.client.button.MenuButton;
+import pp.mdga.client.view.MainView;
-public class HostDialog extends Dialog {
- private TextField portInput;
+import java.util.prefs.Preferences;
- public HostDialog(MdgaApp app, Node node, Runnable backAction) {
+public class HostDialog extends Dialog {
+ private InputButton portInput;
+
+ private ButtonRight hostButton;
+ private ButtonLeft backButton;
+
+ private final MainView view;
+
+ private Preferences prefs = Preferences.userNodeForPackage(JoinDialog.class);
+
+ public HostDialog(MdgaApp app, Node node, MainView view) {
super(app, node);
- QuadBackgroundComponent quad1 = new QuadBackgroundComponent(ColorRGBA.Gray);
- quad1.setMargin(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor());
- container.setBackground(quad1);
+ this.view = view;
- Texture texture = app.getAssetManager().loadTexture("Images/mdga_logo.png");
+ portInput = new InputButton(app, node, "Port: ", 5);
+ portInput.setString(prefs.get("hostPort", "11111"));
- QuadBackgroundComponent b = new QuadBackgroundComponent(texture);
+ hostButton = new ButtonRight(app, node, view::forward, "Spiel hosten", 10);
+ backButton = new ButtonLeft(app, node, view::back, "Zurück", 10);
- Panel imagePanel = new Panel();
- imagePanel.setBackground(b);
+ float offset = 3.0f;
- container.addChild(imagePanel).setPreferredSize(new Vector3f(texture.getImage().getWidth() / 4 * app.getResolutionFactor(), texture.getImage().getHeight() / 4 * app.getResolutionFactor(), 0));
-
- //abstandshalter
- container.addChild(new Panel(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor(), ColorRGBA.Gray));
-
- createTextField();
-
- //abstandshalter
- container.addChild(new Panel(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor(), ColorRGBA.Gray));
-
- Container sub = new Container(new SpringGridLayout(Axis.X, Axis.Y));
-
- createButton(sub, "Abbrechen", backAction, new Vector3f(170 * app.getResolutionFactor(), 60 * app.getResolutionFactor(), 0));
-
- sub.addChild(new Panel(40 * app.getResolutionFactor(), 0 * app.getResolutionFactor(), ColorRGBA.Gray));
-
- createButton(sub, "Starten", () -> tryStart(), new Vector3f(170 * app.getResolutionFactor(), 60 * app.getResolutionFactor(), 0));
-
- container.addChild(sub);
- }
-
- void tryStart() {
- if (null == portInput.getText()) {
- portInput.setText("");
- return;
- }
-
- int port = 0;
-
- try {
- port = Integer.parseInt(portInput.getText());
- } catch (NumberFormatException e) {
- portInput.setText("");
- return;
- }
-
- if(port >= 1 && port <= 65535) {
- app.getModelSyncronizer().setHost(port);
- }
-
- portInput.setText("");
+ portInput.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
+ offset += 1.5f;
}
@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
- );
+ protected void onShow() {
+ portInput.show();
+ hostButton.show();
+ backButton.show();
}
@Override
- public void hide() {
- super.hide();
+ protected void onHide() {
+ portInput.hide();
+ hostButton.hide();
+ backButton.hide();
}
- private void createTextField() {
- Container subContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y));
-
- Label nameLabel = new Label("Port:\t");
- nameLabel.setFontSize(fontSize);
- nameLabel.setColor(ColorRGBA.Black);
-
- portInput = new TextField("");
-
- portInput.setColor(ColorRGBA.Black);
- portInput.setTextHAlignment(HAlignment.Left);
- portInput.setFontSize(fontSize);
- portInput.setSingleLine(true);
-
- QuadBackgroundComponent grayBackground = new QuadBackgroundComponent(ColorRGBA.DarkGray);
- portInput.setBackground(grayBackground);
-
- subContainer.addChild(nameLabel);
- subContainer.addChild(portInput);
-
- container.addChild(subContainer);
+ public void update() {
+ portInput.update();
}
- protected void createButton(Container c, String label, Runnable action, Vector3f size) {
- Button button = new Button(label);
- button.addClickCommands(source -> action.run());
- button.setFontSize(fontSize);
- button.setHighlightColor(ColorRGBA.White);
- button.setColor(ColorRGBA.Black);
- button.setPreferredSize(size);
- button.setTextHAlignment(HAlignment.Center);
- button.setTextVAlignment(VAlignment.Center);
+ public String getPort() {
+ prefs.put("hostPort", portInput.getString());
+ return portInput.getString();
+ }
- QuadBackgroundComponent background = new QuadBackgroundComponent(COLOR_DEFAULT);
- background.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
- button.setBackground(background);
-
- button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOn, (source) -> {
- QuadBackgroundComponent hoverBackground = new QuadBackgroundComponent(COLOR_HOVER);
- hoverBackground.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
- 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 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
- source.setBackground(normalBackground);
- button.setHighlightColor(ColorRGBA.White);
- button.setColor(ColorRGBA.Black);
- });
-
- c.addChild(button);
+ public void resetPort() {
+ portInput.reset();
+ prefs.put("hostPort", "11111");
}
}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/InterruptDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/InterruptDialog.java
new file mode 100644
index 00000000..4fd87803
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/InterruptDialog.java
@@ -0,0 +1,4 @@
+package pp.mdga.client.dialog;
+
+public class InterruptDialog {
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/JoinDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/JoinDialog.java
index f89f3d74..0cc6b74f 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/JoinDialog.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/JoinDialog.java
@@ -1,192 +1,88 @@
package pp.mdga.client.dialog;
-import com.jme3.math.ColorRGBA;
-import com.jme3.math.Vector3f;
+import com.jme3.math.Vector2f;
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;
+import pp.mdga.client.acoustic.AcousticHandler;
+import pp.mdga.client.button.ButtonLeft;
+import pp.mdga.client.button.ButtonRight;
+import pp.mdga.client.button.InputButton;
+import pp.mdga.client.button.MenuButton;
+import pp.mdga.client.view.MainView;
-import java.util.regex.Pattern;
+import java.util.prefs.Preferences;
public class JoinDialog extends Dialog {
- private TextField portInput;
- private TextField ipInput;
+ private InputButton ipInput;
+ private InputButton portInput;
- public JoinDialog(MdgaApp app, Node node, Runnable backAction) {
+ private ButtonRight joinButton;
+ private ButtonLeft backButton;
+
+ private final MainView view;
+
+ private Preferences prefs = Preferences.userNodeForPackage(JoinDialog.class);
+
+ public JoinDialog(MdgaApp app, Node node, MainView view) {
super(app, node);
- QuadBackgroundComponent quad1 = new QuadBackgroundComponent(ColorRGBA.Gray);
- quad1.setMargin(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor());
- container.setBackground(quad1);
+ this.view = view;
- Texture texture = app.getAssetManager().loadTexture("Images/mdga_logo.png");
+ ipInput = new InputButton(app, node, "Ip: ", 15);
+ portInput = new InputButton(app, node, "Port: ", 5);
+ portInput.setString(prefs.get("joinPort", "11111"));
+ ipInput.setString(prefs.get("joinIp", ""));
- QuadBackgroundComponent b = new QuadBackgroundComponent(texture);
+ joinButton = new ButtonRight(app, node, view::forward, "Spiel beitreten", 10);
+ backButton = new ButtonLeft(app, node, view::back, "Zurück", 10);
- Panel imagePanel = new Panel();
- imagePanel.setBackground(b);
+ float offset = 3.0f;
- container.addChild(imagePanel).setPreferredSize(new Vector3f(texture.getImage().getWidth() / 4 * app.getResolutionFactor(), texture.getImage().getHeight() / 4 * app.getResolutionFactor(), 0));
+ ipInput.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
+ offset += 1.5f;
- //abstandshalter
- container.addChild(new Panel(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor(), ColorRGBA.Gray));
-
- createIpField();
-
- //abstandshalter
- container.addChild(new Panel(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor(), ColorRGBA.Gray));
-
- createPortField();
-
- //abstandshalter
- container.addChild(new Panel(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor(), ColorRGBA.Gray));
-
- Container sub = new Container(new SpringGridLayout(Axis.X, Axis.Y));
-
- createButton(sub, "Abbrechen", backAction, new Vector3f(170 * app.getResolutionFactor(), 60 * app.getResolutionFactor(), 0));
-
- sub.addChild(new Panel(40 * app.getResolutionFactor(), 0 * app.getResolutionFactor(), ColorRGBA.Gray));
-
- createButton(sub, "Beitreten", () -> tryJoin(), new Vector3f(170 * app.getResolutionFactor(), 60 * app.getResolutionFactor(), 0));
-
- container.addChild(sub);
- }
-
- void tryJoin() {
- if (null == portInput.getText()) {
- portInput.setText("");
- ipInput.setText("");
- return;
- }
-
- int port = 0;
-
- try {
- port = Integer.parseInt(portInput.getText());
- } catch (NumberFormatException e) {
- portInput.setText("");
- ipInput.setText("");
- return;
- }
-
- if(!(port >= 1 && port <= 65535)) {
- portInput.setText("");
- ipInput.setText("");
- return;
- }
-
- if (null == ipInput.getText()) {
- portInput.setText("");
- ipInput.setText("");
- return;
- }
-
- String ipv4Pattern = "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
-
- if(!Pattern.matches(ipv4Pattern, ipInput.getText())) {
- portInput.setText("");
- ipInput.setText("");
- return;
- }
-
- app.getModelSyncronizer().setJoin(ipInput.getText(), port);
+ portInput.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
+ offset += 1.5f;
}
@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
- );
+ protected void onShow() {
+ ipInput.show();
+ portInput.show();
+ joinButton.show();
+ backButton.show();
}
@Override
- public void hide() {
- super.hide();
+ protected void onHide() {
+ ipInput.hide();
+ portInput.hide();
+ joinButton.hide();
+ backButton.hide();
}
- private void createPortField() {
- Container subContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y));
-
- Label nameLabel = new Label("Port:\t");
- nameLabel.setFontSize(fontSize);
- nameLabel.setColor(ColorRGBA.Black);
-
- portInput = new TextField("");
-
- portInput.setColor(ColorRGBA.Black);
- portInput.setTextHAlignment(HAlignment.Left);
- portInput.setFontSize(fontSize);
- portInput.setSingleLine(true);
-
- QuadBackgroundComponent grayBackground = new QuadBackgroundComponent(ColorRGBA.DarkGray);
- portInput.setBackground(grayBackground);
-
- subContainer.addChild(nameLabel);
- subContainer.addChild(portInput);
-
- container.addChild(subContainer);
+ public void update() {
+ ipInput.update();
+ portInput.update();
}
- private void createIpField() {
- Container subContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y));
-
- Label nameLabel = new Label("Ip:\t");
- nameLabel.setFontSize(fontSize);
- nameLabel.setColor(ColorRGBA.Black);
-
- ipInput = new TextField("");
-
- ipInput.setColor(ColorRGBA.Black);
- ipInput.setTextHAlignment(HAlignment.Left);
- ipInput.setFontSize(fontSize);
- ipInput.setSingleLine(true);
-
- QuadBackgroundComponent grayBackground = new QuadBackgroundComponent(ColorRGBA.DarkGray);
- ipInput.setBackground(grayBackground);
-
- subContainer.addChild(nameLabel);
- subContainer.addChild(ipInput);
-
- container.addChild(subContainer);
+ public String getIpt() {
+ prefs.put("joinIp", ipInput.getString());
+ return ipInput.getString();
}
- protected void createButton(Container c, String label, Runnable action, Vector3f size) {
- Button button = new Button(label);
- button.addClickCommands(source -> action.run());
- button.setFontSize(fontSize);
- button.setHighlightColor(ColorRGBA.White);
- button.setColor(ColorRGBA.Black);
- button.setPreferredSize(size);
- button.setTextHAlignment(HAlignment.Center);
- button.setTextVAlignment(VAlignment.Center);
+ public void resetIp() {
+ ipInput.reset();
+ prefs.put("joinIp", "");
+ }
- QuadBackgroundComponent background = new QuadBackgroundComponent(COLOR_DEFAULT);
- background.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
- button.setBackground(background);
+ public String getPort() {
+ prefs.put("joinPort", portInput.getString());
+ return portInput.getString();
+ }
- button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOn, (source) -> {
- QuadBackgroundComponent hoverBackground = new QuadBackgroundComponent(COLOR_HOVER);
- hoverBackground.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
- 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 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
- source.setBackground(normalBackground);
- button.setHighlightColor(ColorRGBA.White);
- button.setColor(ColorRGBA.Black);
- });
-
- c.addChild(button);
+ public void resetPort() {
+ portInput.reset();
+ prefs.put("joinPort", "11111");
}
}
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
deleted file mode 100644
index 5c1195d9..00000000
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/LobbyButtonDialog.java
+++ /dev/null
@@ -1,165 +0,0 @@
-package pp.mdga.client.dialog;
-
-import com.jme3.math.ColorRGBA;
-import com.jme3.math.Vector3f;
-import com.jme3.scene.Node;
-import com.simsilica.lemur.Button;
-import com.simsilica.lemur.Command;
-import com.simsilica.lemur.HAlignment;
-import com.simsilica.lemur.VAlignment;
-import com.simsilica.lemur.component.QuadBackgroundComponent;
-import pp.mdga.client.MdgaApp;
-import pp.mdga.game.Color;
-
-public class LobbyButtonDialog extends Dialog {
- private final int pos;
-
- private Button button;
-
- private Command