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 65943b74..a9f06120 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 @@ -54,7 +54,8 @@ public void simpleInitApp() { inputSynchronizer = new InputSynchronizer(this); modelSyncronizer = new ModelSyncronizer(this); - enter(state); + modelSyncronizer.enter(MdgaState.CEREMONY); + //enter(state); } @Override diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSyncronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSyncronizer.java index fae79021..ad65643e 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSyncronizer.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/ModelSyncronizer.java @@ -1,5 +1,6 @@ package pp.mdga.client; +import pp.mdga.client.view.CeremonyView; import pp.mdga.client.view.LobbyView; import pp.mdga.game.Color; @@ -68,5 +69,13 @@ public void leave() { public void enter(MdgaState state) { System.out.println("enter:" + 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"); + } } } 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 055330ff..f9cddb7b 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 @@ -1,7 +1,9 @@ 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.Color; import pp.mdga.notification.*; import java.util.ArrayList; @@ -75,6 +77,11 @@ private void handleGame(Notification notification) { gameView.getGuiHandler().setActivePlayer(n.getColor()); } else if (notification instanceof CeremonyNotification) { app.enter(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"); } else if (notification instanceof DiceNowNotification) { // Handle DiceNowNotification } else if (notification instanceof DicingNotification) { 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..d7648db3 --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/button/CeremonyButton.java @@ -0,0 +1,176 @@ +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() { + 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 index 91d2ef35..3330f564 100644 --- 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 @@ -35,6 +35,7 @@ public abstract class ClickButton extends AbstractButton { instance.addCommands(Button.ButtonAction.HighlightOff, (button) -> release()); instance.setFont(font); + instance.setFocusColor(TEXT_NORMAL); calculateRelative(); setRelative(); 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 index 77e8b449..2257d21a 100644 --- 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 @@ -7,7 +7,7 @@ import pp.mdga.client.MdgaApp; public class LabelButton extends ClickButton{ - LabelButton(MdgaApp app, Node node, String label, Vector2f size, Vector2f pos) { + public LabelButton(MdgaApp app, Node node, String label, Vector2f size, Vector2f pos) { super(app, node, () -> {}, label, size, pos); } 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 index 6d337b31..e852d6c5 100644 --- 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 @@ -164,7 +164,6 @@ private void createModel(Asset asset, Vector3f pos) { 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.setLocalTranslation(pos); model.setShadowMode(RenderQueue.ShadowMode.CastAndReceive); model.setLocalTranslation(pos); 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 index 795de3d4..c7d4e56d 100644 --- 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 @@ -1,4 +1,82 @@ package pp.mdga.client.dialog; -public class AudioSettingsDialog { +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, "Gesamt Lautstärke"); + soundVolume = new SliderButton(app, node, "Gesamt 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..c902de0a --- /dev/null +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/CeremonyDialog.java @@ -0,0 +1,68 @@ +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.InputButton; +import pp.mdga.client.button.LabelButton; +import pp.mdga.client.button.MenuButton; +import pp.mdga.client.view.MainView; + +import java.util.ArrayList; + +public class CeremonyDialog extends Dialog { + private ArrayList> labels; + + public CeremonyDialog(MdgaApp app, Node node) { + super(app, node); + + labels = new ArrayList<>(); + labels.add(new ArrayList<>()); + labels.add(new ArrayList<>()); + labels.add(new ArrayList<>()); + labels.add(new ArrayList<>()); + labels.add(new ArrayList<>()); + labels.add(new ArrayList<>()); + + float offsetX = 0.5f; + + for (ArrayList row : labels) { + + float offsetY = 0.5f; + + Vector2f size = new Vector2f(5, 1.2f); + row.add(new LabelButton(app, node, "", size, new Vector2f())); + row.add(new LabelButton(app, node, "Würfe", size, new Vector2f())); + row.add(new LabelButton(app, node, "Figuren rausgeworfen", size, new Vector2f())); + row.add(new LabelButton(app, node, "verwendete Bonuskarten", size, new Vector2f())); + row.add(new LabelButton(app, node, "gewürfelte 6en", size, new Vector2f())); + row.add(new LabelButton(app, node, "gelaufene Felder", size, new Vector2f())); + row.add(new LabelButton(app, node, "auf Bonusfeldern gelandet", size, new Vector2f())); + + for (LabelButton b : row) { + b.setPos(new Vector2f(offsetX, MenuButton.VERTICAL - offsetY)); + offsetY += 0.8f; + } + + offsetX += 3; + } + } + + @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(); + } + } + } +} diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/SettingsDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/SettingsDialog.java index 8637cc77..99d34840 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/SettingsDialog.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/SettingsDialog.java @@ -1,5 +1,52 @@ package pp.mdga.client.dialog; -public class SettingsDialog { +import com.jme3.math.Vector2f; +import com.jme3.scene.Node; +import pp.mdga.client.MdgaApp; +import pp.mdga.client.button.InputButton; +import pp.mdga.client.button.MenuButton; +import pp.mdga.client.view.MainView; +import pp.mdga.client.view.MdgaView; +public class SettingsDialog extends Dialog { + private MenuButton videoButton; + private MenuButton audioButton; + private MenuButton backButton; + + private final MdgaView view; + + public SettingsDialog(MdgaApp app, Node node, MdgaView view) { + super(app, node); + + this.view = view; + + videoButton = new MenuButton(app, node, view::enterVideoSettings, "Video"); + audioButton = new MenuButton(app, node, view::enterAudioSettings, "Audio"); + backButton = new MenuButton(app, node, view::leaveSettings, "Zurück"); + + float offset = 2.0f; + + videoButton.setPos(new Vector2f(0, MenuButton.VERTICAL - offset)); + offset += 1.25f; + + audioButton.setPos(new Vector2f(0, MenuButton.VERTICAL - offset)); + offset += 1.25f; + + backButton.setPos(new Vector2f(0, MenuButton.VERTICAL - offset)); + offset += 1.25f; + } + + @Override + protected void onShow() { + videoButton.show(); + audioButton.show(); + backButton.show(); + } + + @Override + protected void onHide() { + videoButton.hide(); + audioButton.hide(); + backButton.hide(); + } } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/VideoSettingsDialog.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/VideoSettingsDialog.java index 0e19c238..d602b3e4 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/VideoSettingsDialog.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/dialog/VideoSettingsDialog.java @@ -1,4 +1,48 @@ package pp.mdga.client.dialog; -public class VideoSettingsDialog { +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.view.MdgaView; + +public class VideoSettingsDialog extends Dialog { + private MenuButton backButton; + + private final MdgaView view; + + private boolean active = false; + + public VideoSettingsDialog(MdgaApp app, Node node, MdgaView view) { + super(app, node); + + this.view = view; + + backButton = new MenuButton(app, node, view::leaveVideoSettings, "Zurück"); + + float offset = 2.0f; + + backButton.setPos(new Vector2f(0, MenuButton.VERTICAL - offset)); + offset += 1.25f; + } + + @Override + protected void onShow() { + active = true; + + backButton.show(); + } + + @Override + protected void onHide() { + active = false; + + backButton.hide(); + } + + public void update() { + if(!active) { + return; + } + } } 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 9063584f..103614d9 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 @@ -1,8 +1,18 @@ package pp.mdga.client.view; +import com.jme3.light.AmbientLight; +import com.jme3.math.ColorRGBA; import com.jme3.scene.Geometry; import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaState; +import pp.mdga.client.button.ButtonLeft; +import pp.mdga.client.button.ButtonRight; +import pp.mdga.client.button.CeremonyButton; +import pp.mdga.client.button.LobbyButton; +import pp.mdga.client.dialog.CeremonyDialog; +import pp.mdga.game.Color; + +import java.util.ArrayList; public class CeremonyView extends MdgaView { private enum SubState { @@ -14,17 +24,45 @@ private enum SubState { private Geometry background; + private ButtonLeft backButton; + private ButtonRight continueButton; + + private ArrayList ceremonyButtons; + + private CeremonyDialog ceremonyDialog; + + private AmbientLight ambient = new AmbientLight(); + public CeremonyView(MdgaApp app) { super(app); + + backButton = new ButtonLeft(app, guiNode, this::back, "Zurück", 1); + continueButton = new ButtonRight(app, guiNode, this::forward, "Weiter", 1); + + ceremonyButtons = new ArrayList<>(4); + + ceremonyDialog = new CeremonyDialog(app, guiNode); + + ambient.setColor(new ColorRGBA(0.3f, 0.3f, 0.3f, 1)); } @Override public void onEnter() { enterSub(SubState.AWARD_CEREMONY); + + rootNode.addLight(ambient); } @Override public void onLeave() { + backButton.hide(); + continueButton.hide(); + + guiNode.detachChild(background); + + ceremonyButtons.clear(); + + rootNode.removeLight(ambient); } @Override @@ -35,19 +73,40 @@ protected void onEnterOverlay(Overlay overlay) { protected void onLeaveOverlay(Overlay overlay) { } + @Override + protected void onUpdate(float tpf) { + for (CeremonyButton c : ceremonyButtons) { + c.update(tpf); + } + } + private void awardCeremony() { - background = createBackground("Images/b1.png"); - guiNode.attachChild(background); + continueButton.show(); + + for (CeremonyButton c : ceremonyButtons) { + c.show(); + } } private void statistics() { background = createBackground("Images/b2.png"); guiNode.attachChild(background); + + backButton.show(); + continueButton.show(); + ceremonyDialog.show(); } private void enterSub(SubState state) { this.state = state; + backButton.hide(); + continueButton.hide(); + for (CeremonyButton c : ceremonyButtons) { + c.hide(); + } + ceremonyDialog.hide(); + if(null != background) { guiNode.detachChild(background); } @@ -83,4 +142,14 @@ private void back() { break; } } + + public void addCeremonyParticipant(Color color, int pos, String name) { + CeremonyButton button = new CeremonyButton(app, guiNode, rootNode, color, CeremonyButton.Pos.values()[pos - 1], name); + + ceremonyButtons.add(button); + + if(state.equals(SubState.AWARD_CEREMONY)) { + button.show(); + } + } } 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 6f063cea..ebbfc99b 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 @@ -17,14 +17,11 @@ public class GameView extends MdgaView { private CameraHandler camera; private GuiHandler guiHandler; - private SettingsButton settingsButton; - private ButtonRight cheatButton; //TODO public GameView(MdgaApp app) { super(app); - settingsButton = new SettingsButton(app, guiNode, this::clickSettings); cheatButton = new ButtonRight(app, guiNode, () -> app.getModelSyncronizer().enter(MdgaState.CEREMONY), "Weiter (CHEAT)", 1); FilterPostProcessor fpp = new FilterPostProcessor(app.getAssetManager()); @@ -46,7 +43,6 @@ public GameView(MdgaApp app) { @Override public void onEnter() { - settingsButton.show(); cheatButton.show(); camera.init(); @@ -60,7 +56,6 @@ public void onLeave() { boardHandler.shutdown(); guiHandler.shutdown(); - settingsButton.hide(); cheatButton.hide(); } @@ -93,8 +88,4 @@ public BoardHandler getBoardHandler() { public GuiHandler getGuiHandler() { return guiHandler; } - - private void clickSettings() { - //TODO play sound - } } 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 30b25b0b..65a87d60 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 @@ -3,6 +3,7 @@ import com.jme3.asset.TextureKey; import com.jme3.light.AmbientLight; import com.jme3.math.ColorRGBA; +import com.jme3.renderer.Camera; import com.jme3.scene.Geometry; import com.jme3.scene.Spatial; import com.jme3.texture.Texture; @@ -17,8 +18,6 @@ public class LobbyView extends MdgaView { private Geometry background; - private SettingsButton settingsButton; - private ButtonLeft leaveButton; private ButtonRight readyButton; @@ -27,17 +26,15 @@ public class LobbyView extends MdgaView { private LobbyButton armyButton; private LobbyButton navyButton; - private AmbientLight ambient = new AmbientLight();; + private AmbientLight ambient = new AmbientLight(); public LobbyView(MdgaApp app) { super(app); - TextureKey key = new TextureKey("Images/map3.png", false); - Texture skyTexture = app.getAssetManager().loadTexture(key); - Spatial sky = SkyFactory.createSky(app.getAssetManager(), skyTexture, SkyFactory.EnvMapType.SphereMap); - rootNode.attachChild(sky); - - settingsButton = new SettingsButton(app, guiNode, this::clickSettings); + //TextureKey key = new TextureKey("lobby.png", false); + //Texture skyTexture = app.getAssetManager().loadTexture(key); + //Spatial sky = SkyFactory.createSky(app.getAssetManager(), skyTexture, SkyFactory.EnvMapType.SphereMap); + //rootNode.attachChild(sky); leaveButton = new ButtonLeft(app, guiNode, this::leaveLobby, "Verlassen", 1); readyButton = new ButtonRight(app, guiNode, this::ready, "Bereit", 1); @@ -52,12 +49,11 @@ public LobbyView(MdgaApp app) { @Override public void onEnter() { - app.getCamera().setParallelProjection(true); - float aspect = (float) app.getCamera().getWidth() / app.getCamera().getHeight(); - float size = 1.65f; - app.getCamera().setFrustum(-1000, 1000, -aspect * size, aspect * size, size, -size); - - settingsButton.show(); + //cam = new Camera(app.getCamera().getWidth(), app.getCamera().getHeight()); + //cam.setParallelProjection(true); + //float aspect = (float) app.getCamera().getWidth() / app.getCamera().getHeight(); + //float size = 1.65f; + //cam.setFrustum(-1000, 1000, -aspect * size, aspect * size, size, -size); leaveButton.show(); readyButton.show(); @@ -72,8 +68,6 @@ public void onEnter() { @Override public void onLeave() { - settingsButton.hide(); - leaveButton.hide(); readyButton.hide(); @@ -173,8 +167,4 @@ private void leaveLobby() { app.getModelSyncronizer().leave(); //TODO: playSound } - - private void clickSettings() { - //TODO: playSound - } } 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 7d40031e..4fb81fdd 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 @@ -21,8 +21,6 @@ private enum SubState { private Geometry background; - private SettingsButton settingsButton; - private StartDialog startDialog; private JoinDialog joinDialog; private HostDialog hostDialog; @@ -30,8 +28,6 @@ private enum SubState { public MainView(MdgaApp app) { super(app); - settingsButton = new SettingsButton(app, guiNode, this::clickSettings); - startDialog = new StartDialog(app, guiNode, this); joinDialog = new JoinDialog(app, guiNode, this); hostDialog = new HostDialog(app, guiNode, this); @@ -42,8 +38,6 @@ public void onEnter() { background = createBackground("Images/main.png"); guiNode.attachChild(background); - settingsButton.show(); - enterSub(SubState.MAIN); } @@ -53,8 +47,6 @@ public void onLeave() { joinDialog.hide(); hostDialog.hide(); - settingsButton.hide(); - guiNode.detachChild(background); } @@ -105,6 +97,7 @@ private void tryHost() { port = Integer.parseInt(text); if(port >= 1 && port <= 65535) { + app.getModelSyncronizer().setName(startDialog.getName()); app.getModelSyncronizer().setHost(port); //TODO: playSound return; @@ -118,6 +111,8 @@ private void tryHost() { } private void tryJoin() { + //TODO + app.getModelSyncronizer().setName(startDialog.getName()); app.getModelSyncronizer().setJoin("127.0.0.1", 1); } @@ -144,11 +139,9 @@ private void enterSub(SubState state) { public void forward() { switch (state) { case HOST: - app.getModelSyncronizer().setName(startDialog.getName()); tryHost(); break; case JOIN: - app.getModelSyncronizer().setName(startDialog.getName()); tryJoin(); break; case MAIN: @@ -159,11 +152,9 @@ public void forward() { public void forward(boolean host) { switch (state) { case HOST: - app.getModelSyncronizer().setName(startDialog.getName()); tryHost(); break; case JOIN: - app.getModelSyncronizer().setName(startDialog.getName()); tryJoin(); break; case MAIN: @@ -193,9 +184,5 @@ public void back() { break; } } - - public void clickSettings() { - //TODO: playSound - } } 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 e9819aa2..4f9b9850 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 @@ -9,6 +9,9 @@ import com.jme3.texture.Texture; import pp.mdga.client.MdgaApp; import pp.mdga.client.button.*; +import pp.mdga.client.dialog.AudioSettingsDialog; +import pp.mdga.client.dialog.SettingsDialog; +import pp.mdga.client.dialog.VideoSettingsDialog; public abstract class MdgaView { public enum Overlay { @@ -19,15 +22,29 @@ public enum Overlay { protected MdgaApp app; protected Node rootNode = new Node(); protected Node guiNode = new Node(); + private Node settingsNode = new Node(); + + private SettingsButton settingsButton; + + private SettingsDialog settingsDialog; + private VideoSettingsDialog videoSettingsDialog; + private AudioSettingsDialog audioSettingsDialog; public MdgaView(MdgaApp app) { this.app = app; + settingsButton = new SettingsButton(app, guiNode, this::enterSettings); + + settingsDialog = new SettingsDialog(app, settingsNode, this); + videoSettingsDialog = new VideoSettingsDialog(app, settingsNode, this); + audioSettingsDialog = new AudioSettingsDialog(app, settingsNode, this); } public void enter() { app.getRootNode().attachChild(rootNode); app.getGuiNode().attachChild(guiNode); + settingsButton.show(); + onEnter(); } @@ -35,6 +52,8 @@ public void leave() { app.getRootNode().detachChild(rootNode); app.getGuiNode().detachChild(guiNode); + settingsButton.hide(); + onLeave(); } @@ -52,12 +71,15 @@ public void leaveOverlay(Overlay overlay) { public void update(float tpf) { //TODO is not necessary but will show misuse of nodes - app.getRootNode().detachAllChildren(); - app.getGuiNode().detachAllChildren(); - app.getRootNode().attachChild(rootNode); - app.getGuiNode().attachChild(guiNode); + //app.getRootNode().detachAllChildren(); + //app.getGuiNode().detachAllChildren(); + //app.getRootNode().attachChild(rootNode); + //app.getGuiNode().attachChild(guiNode); //TODO ---------------------------------------------- + videoSettingsDialog.update(); + audioSettingsDialog.update(); + onUpdate(tpf); } @@ -79,8 +101,42 @@ protected Geometry createBackground(String texturePath) { Geometry background = new Geometry("Background", quad); background.setMaterial(mat); - background.setLocalTranslation(0, 0, -1); + background.setLocalTranslation(0, 0, -2); return background; } + + public void enterSettings() { + enterOverlay(Overlay.SETTINGS); + + app.getGuiNode().attachChild(settingsNode); + settingsDialog.show(); + } + + public void leaveSettings() { + leaveOverlay(Overlay.SETTINGS); + + app.getGuiNode().detachChild(settingsNode); + settingsDialog.hide(); + } + + public void enterVideoSettings() { + settingsDialog.hide(); + videoSettingsDialog.show(); + } + + public void leaveVideoSettings() { + settingsDialog.show(); + videoSettingsDialog.hide(); + } + + public void enterAudioSettings() { + settingsDialog.hide(); + audioSettingsDialog.show(); + } + + public void leaveAudioSettings() { + settingsDialog.show(); + audioSettingsDialog.hide(); + } } diff --git a/Projekte/mdga/client/src/main/resources/Images/lobby.png b/Projekte/mdga/client/src/main/resources/Images/lobby.png index 86bb1a69..2aa24f98 100644 Binary files a/Projekte/mdga/client/src/main/resources/Images/lobby.png and b/Projekte/mdga/client/src/main/resources/Images/lobby.png differ diff --git a/Projekte/mdga/client/src/main/resources/Images/map3.png b/Projekte/mdga/client/src/main/resources/Images/map3.png deleted file mode 100644 index e42f7353..00000000 Binary files a/Projekte/mdga/client/src/main/resources/Images/map3.png and /dev/null differ