merge development into test #26

Merged
j23f0712 merged 95 commits from development into dev/test 2024-12-01 21:02:48 +01:00
35 changed files with 1389 additions and 1205 deletions
Showing only changes of commit 3235a46788 - Show all commits

View File

@@ -62,7 +62,7 @@ private void setupInput() {
@Override @Override
public void onAction(String name, boolean isPressed, float tpf) { public void onAction(String name, boolean isPressed, float tpf) {
if (name.equals("Settings") && isPressed) { if (name.equals("Settings") && isPressed) {
app.getView().pressEscape(); //app.getView().pressEscape();
} }
if (name.equals("RotateRightMouse")) { if (name.equals("RotateRightMouse")) {
rightMousePressed = isPressed; rightMousePressed = isPressed;

View File

@@ -22,21 +22,16 @@ public class MdgaApp extends SimpleApplication {
private ModelSyncronizer modelSyncronizer; private ModelSyncronizer modelSyncronizer;
MdgaView view = null; MdgaView view = null;
private MdgaState state = MdgaState.GAME; private MdgaState state = MdgaState.MAIN;
private static float resolutionFactor = 1.8f; private static float imageScale = 1.5f;
public static void main(String[] args) { public static void main(String[] args) {
AppSettings settings = new AppSettings(true); AppSettings settings = new AppSettings(true);
settings.setSamples(128); settings.setSamples(128);
settings.setCenterWindow(true); settings.setCenterWindow(true);
settings.setWidth(1920);
int width = (int)(1280 * resolutionFactor); settings.setHeight(1080);
int height = (int)(720 * resolutionFactor);
settings.setWidth(width);
settings.setHeight(height);
settings.setVSync(false); settings.setVSync(false);
MdgaApp app = new MdgaApp(); MdgaApp app = new MdgaApp();
@@ -47,52 +42,24 @@ public static void main(String[] args) {
@Override @Override
public void simpleInitApp() { public void simpleInitApp() {
GuiGlobals.initialize(this);
inputManager.deleteMapping("SIMPLEAPP_Exit");
flyCam.setEnabled(false);
animationHandler = new AnimationHandler(this); animationHandler = new AnimationHandler(this);
acousticHandler = new AcousticHandler(this); acousticHandler = new AcousticHandler(this);
notificationSynchronizer = new NotificationSynchronizer(this); notificationSynchronizer = new NotificationSynchronizer(this);
inputSynchronizer = new InputSynchronizer(this); inputSynchronizer = new InputSynchronizer(this);
modelSyncronizer = new ModelSyncronizer(this); modelSyncronizer = new ModelSyncronizer(this);
inputManager.deleteMapping("SIMPLEAPP_Exit");
inputManager.deleteMapping("FLYCAM_ZoomIn");
inputManager.deleteMapping("FLYCAM_ZoomOut");
inputManager.deleteMapping("FLYCAM_RotateDrag");
flyCam.setEnabled(false);
GuiGlobals.initialize(this);
enter(state); enter(state);
List<UUID> 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<UUID> 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());
notificationSynchronizer.addTestNotification(new PlayerInGameNotification(Color.AIRFORCE, test, "Player 1"));
notificationSynchronizer.addTestNotification(new PlayerInGameNotification(Color.NAVY, test_1, "Player 2"));
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, false))));
notificationSynchronizer.addTestNotification(new SwapPieceNotification(player0, player0_1));
// notificationSynchronizer.addTestNotification(new SelectableSwapNotification(new ArrayList<>(List.of(player0, player1)), new ArrayList<>(List.of(player0_1))));
} }
@Override @Override
public void simpleUpdate(float tpf) { public void simpleUpdate(float tpf) {
view.update(); view.update(tpf);
acousticHandler.update(); acousticHandler.update();
notificationSynchronizer.update(); notificationSynchronizer.update();
} }
@@ -140,8 +107,8 @@ public AcousticHandler getAcousticHandler() {
public MdgaState getState() {return state; } public MdgaState getState() {return state; }
public float getResolutionFactor() { public float getImageScale() {
return resolutionFactor; return imageScale;
} }
public MdgaView getView() { public MdgaView getView() {

View File

@@ -23,7 +23,7 @@ public class AcousticHandler {
private GameMusic scheduled = null; // Scheduled track to play next private GameMusic scheduled = null; // Scheduled track to play next
private GameMusic old = null; // Old track being faded out 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 musicVolume = 1.0f;
private float soundVolume = 1.0f; private float soundVolume = 1.0f;

View File

@@ -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 {
protected static final ColorRGBA BUTTON_NORMAL = ColorRGBA.fromRGBA255(169, 165, 104, 255);
protected static final ColorRGBA BUTTON_PRESSED = ColorRGBA.fromRGBA255(105, 117, 89, 255);
protected static final ColorRGBA TEXT_NORMAL = ColorRGBA.Black;
protected 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;
}
}

View File

@@ -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() {
}
}

View File

@@ -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() {
}
}

View File

@@ -0,0 +1,104 @@
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;
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((_) -> action.run());
instance.setTextHAlignment(HAlignment.Center);
instance.setTextVAlignment(VAlignment.Center);
instance.addCommands(Button.ButtonAction.HighlightOn, (_) -> click());
instance.addCommands(Button.ButtonAction.HighlightOff, (_) -> release());
instance.setFont(font);
calculateRelative();
setRelative();
release();
}
@Override
public void show() {
calculateRelative();
setRelative();
node.attachChild(instance);
}
@Override
public void hide() {
node.detachChild(instance);
}
protected abstract void onHover();
protected abstract void onUnHover();
private void click() {
instance.setColor(TEXT_PRESSED);
instance.setHighlightColor(TEXT_PRESSED);
QuadBackgroundComponent background = new QuadBackgroundComponent(BUTTON_PRESSED);
instance.setBackground(background);
onHover();
};
private 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);
}
}
}

View File

@@ -0,0 +1,100 @@
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 reset() {
field.setText("");
}
}

View File

@@ -0,0 +1,50 @@
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{
LabelButton(MdgaApp app, Node node, String label, Vector2f size, Vector2f pos) {
super(app, node, () -> {}, label, size, pos);
}
@Override
public void show() {
calculateRelative();
setRelative();
instance.setFontSize(fontSize / 2);
node.attachChild(instance);
}
@Override
public void hide() {
node.detachChild(instance);
}
@Override
public void onHover() {
instance.setColor(TEXT_NORMAL);
instance.setHighlightColor(TEXT_NORMAL);
QuadBackgroundComponent background = new QuadBackgroundComponent(BUTTON_NORMAL);
instance.setBackground(background);
}
@Override
public void onUnHover() {
instance.setColor(TEXT_NORMAL);
instance.setHighlightColor(TEXT_NORMAL);
QuadBackgroundComponent background = new QuadBackgroundComponent(BUTTON_NORMAL);
instance.setBackground(background);
}
public void setText(String text) {
instance.setText(text);
}
}

View File

@@ -0,0 +1,190 @@
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 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;
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() {
/*switch (taken) {
case NOT:
break;
case SELF:
break;
case OTHER:
break;
}*/
ColorRGBA buttonPressed = BUTTON_PRESSED.clone();
buttonPressed.a = 0.3f;
QuadBackgroundComponent background = new QuadBackgroundComponent(buttonPressed);
instance.setBackground(background);
rotate = true;
}
@Override
public void onUnHover() {
/*switch (taken) {
case NOT:
break;
case SELF:
break;
case OTHER:
break;
}*/
ColorRGBA buttonNormal = ColorRGBA.Gray.clone();// BUTTON_NORMAL.clone();
buttonNormal.a = 0.1f;
QuadBackgroundComponent background = new QuadBackgroundComponent(buttonNormal);
instance.setBackground(background);
rotate = false;
}
@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.setLocalTranslation(pos);
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 -");
} else {
label.setText(name);
}
}
}

View File

@@ -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() {
}
}

View File

@@ -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() {
}
}

View File

@@ -0,0 +1,4 @@
package pp.mdga.client.dialog;
public class AudioSettingsDialog {
}

View File

@@ -1,82 +1,32 @@
package pp.mdga.client.dialog; package pp.mdga.client.dialog;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node; import com.jme3.scene.Node;
import com.simsilica.lemur.Button;
import com.simsilica.lemur.Container; 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 pp.mdga.client.MdgaApp;
import static com.jme3.math.FastMath.floor;
public abstract class Dialog { 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; protected final MdgaApp app;
private final Node node; protected final Node node = new Node();
protected final float vertical_step; private final Node root;
protected final float horitontal_step;
protected float fontSize = 35; Dialog(MdgaApp app, Node node) {
public Dialog(MdgaApp app, Node node) {
this.app = app; this.app = app;
this.node = node; this.root = 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;
} }
public void show() { public void show() {
node.attachChild(container); root.attachChild(node);
onShow();
} }
public void hide() { public void hide() {
node.detachChild(container); root.detachChild(node);
onHide();
} }
protected void createButton(String label, Runnable action, Vector3f size) { protected abstract void onShow();
Button button = new Button(label); protected abstract void onHide ();
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);
} }
}

View File

@@ -1,15 +0,0 @@
package pp.mdga.client.dialog;
import java.util.function.Supplier;
public class GetPercentRunnable {
private final Supplier<Float> action;
public GetPercentRunnable(Supplier<Float> action) {
this.action = action;
}
public float get() {
return action.get();
}
}

View File

@@ -1,143 +1,61 @@
package pp.mdga.client.dialog; package pp.mdga.client.dialog;
import com.jme3.math.ColorRGBA; import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node; 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.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 { public class HostDialog extends Dialog {
private TextField portInput; private InputButton portInput;
public HostDialog(MdgaApp app, Node node, Runnable backAction) { private ButtonRight hostButton;
private ButtonLeft backButton;
private final MainView view;
public HostDialog(MdgaApp app, Node node, MainView view) {
super(app, node); super(app, node);
QuadBackgroundComponent quad1 = new QuadBackgroundComponent(ColorRGBA.Gray); this.view = view;
quad1.setMargin(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor());
container.setBackground(quad1);
Texture texture = app.getAssetManager().loadTexture("Images/mdga_logo.png"); portInput = new InputButton(app, node, "Port: ", 5);
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(); float offset = 3.0f;
imagePanel.setBackground(b);
container.addChild(imagePanel).setPreferredSize(new Vector3f(texture.getImage().getWidth() / 4 * app.getResolutionFactor(), texture.getImage().getHeight() / 4 * app.getResolutionFactor(), 0)); portInput.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
offset += 1.5f;
//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("");
} }
@Override @Override
public void show() { protected void onShow() {
super.show(); portInput.show();
hostButton.show();
container.setLocalTranslation( backButton.show();
app.getCamera().getWidth() / 2 - container.getPreferredSize().x / 2,
app.getCamera().getHeight() / 2 + container.getPreferredSize().y / 2,
0
);
} }
@Override @Override
public void hide() { protected void onHide() {
super.hide(); portInput.hide();
hostButton.hide();
backButton.hide();
} }
private void createTextField() { public void update() {
Container subContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y)); portInput.update();
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);
} }
protected void createButton(Container c, String label, Runnable action, Vector3f size) { public String getPort() {
Button button = new Button(label); return portInput.getString();
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); public void resetPort() {
background.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor()); portInput.reset();
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);
} }
} }

View File

@@ -0,0 +1,4 @@
package pp.mdga.client.dialog;
public class InterruptDialog {
}

View File

@@ -1,192 +1,77 @@
package pp.mdga.client.dialog; package pp.mdga.client.dialog;
import com.jme3.math.ColorRGBA; import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node; 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.MdgaApp;
import pp.mdga.client.button.ButtonLeft;
import java.util.regex.Pattern; 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 JoinDialog extends Dialog { public class JoinDialog extends Dialog {
private TextField portInput; private InputButton ipInput;
private TextField ipInput; private InputButton portInput;
public JoinDialog(MdgaApp app, Node node, Runnable backAction) { private ButtonRight joinButton;
private ButtonLeft backButton;
private final MainView view;
public JoinDialog(MdgaApp app, Node node, MainView view) {
super(app, node); super(app, node);
QuadBackgroundComponent quad1 = new QuadBackgroundComponent(ColorRGBA.Gray); this.view = view;
quad1.setMargin(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor());
container.setBackground(quad1);
Texture texture = app.getAssetManager().loadTexture("Images/mdga_logo.png"); ipInput = new InputButton(app, node, "Ip: ", 15);
portInput = new InputButton(app, node, "Port: ", 5);
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(); float offset = 3.0f;
imagePanel.setBackground(b);
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 portInput.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
container.addChild(new Panel(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor(), ColorRGBA.Gray)); offset += 1.5f;
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);
} }
@Override @Override
public void show() { protected void onShow() {
super.show(); ipInput.show();
portInput.show();
container.setLocalTranslation( joinButton.show();
app.getCamera().getWidth() / 2 - container.getPreferredSize().x / 2, backButton.show();
app.getCamera().getHeight() / 2 + container.getPreferredSize().y / 2,
0
);
} }
@Override @Override
public void hide() { protected void onHide() {
super.hide(); ipInput.hide();
portInput.hide();
joinButton.hide();
backButton.hide();
} }
private void createPortField() { public void update() {
Container subContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y)); ipInput.update();
portInput.update();
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);
} }
private void createIpField() { public String getIpt() {
Container subContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y)); return ipInput.getString();
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);
} }
protected void createButton(Container c, String label, Runnable action, Vector3f size) { public void resetIp() {
Button button = new Button(label); ipInput.reset();
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); public String getPort() {
background.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor()); return portInput.getString();
button.setBackground(background); }
button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOn, (source) -> { public void resetPort() {
QuadBackgroundComponent hoverBackground = new QuadBackgroundComponent(COLOR_HOVER); portInput.reset();
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);
} }
} }

View File

@@ -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<Button> clickCommand;
private boolean taken = false;
private final String label;
private int val;
public LobbyButtonDialog(MdgaApp app, Node node, String label, int pos) {
super(app, node);
clickCommand = (Button source) -> {
toggleButton();
};
this.pos = pos;
this.label = label;
this.button = new Button(label);
this.button.setFontSize(fontSize);
val = pos;
createNotTakenButton(new Vector3f(170 * app.getResolutionFactor(), 250 * app.getResolutionFactor(), 0));
}
@Override
public void show() {
super.show();
float x = ((2 + (4 * pos)) * horitontal_step) - ((0.33333333f * pos) * container.getPreferredSize().x);
float y = 6 * vertical_step;
container.setLocalTranslation(x, y, 0);
}
@Override
public void hide() {
super.hide();
}
public void setTaken(boolean isTaken, boolean self, String name) {
taken = isTaken;
if(isTaken) {
createTakenButton(new Vector3f(170 * app.getResolutionFactor(), 250 * app.getResolutionFactor(), 0), self);
button.setText(label + "\n\n" + name);
} else {
createNotTakenButton(new Vector3f(170 * app.getResolutionFactor(), 250 * app.getResolutionFactor(), 0));
button.setText(label);
}
}
protected void createNotTakenButton(Vector3f size) {
button.setHighlightColor(ColorRGBA.White);
button.setColor(ColorRGBA.Black);
button.setPreferredSize(size);
button.setTextHAlignment(HAlignment.Center);
button.setTextVAlignment(VAlignment.Center);
if(button.getClickCommands() != null) {
button.removeClickCommands(clickCommand);
}
button.addClickCommands(clickCommand);
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);
}
private void toggleButton() {
if(taken) {
app.getModelSyncronizer().unselectTsk();
}
else {
app.getModelSyncronizer().selectTsk(Color.values()[val]);
}
}
protected void createTakenButton(Vector3f size, boolean self) {
ColorRGBA color_a;
ColorRGBA color_b;
if(button.getClickCommands() != null) {
button.removeClickCommands(clickCommand);
}
if(!self) {
color_a = ColorRGBA.Red;
color_b = ColorRGBA.Red;
} else {
color_a = ColorRGBA.Green;
color_b = ColorRGBA.Yellow;
button.addClickCommands(clickCommand);
}
button.setHighlightColor(ColorRGBA.White);
button.setColor(ColorRGBA.Black);
button.setPreferredSize(size);
button.setTextHAlignment(HAlignment.Center);
button.setTextVAlignment(VAlignment.Center);
QuadBackgroundComponent background = new QuadBackgroundComponent(color_a);
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_b);
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_a);
normalBackground.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
source.setBackground(normalBackground);
button.setHighlightColor(ColorRGBA.White);
button.setColor(ColorRGBA.Black);
});
container.addChild(button);
}
}

View File

@@ -1,15 +0,0 @@
package pp.mdga.client.dialog;
import java.util.function.Consumer;
public class PercentRunnable {
private final Consumer<Float> action;
public PercentRunnable(Consumer<Float> action) {
this.action = action;
}
public void run(float percent) {
action.accept(percent);
}
}

View File

@@ -1,112 +1,5 @@
package pp.mdga.client.dialog; package pp.mdga.client.dialog;
import com.jme3.math.ColorRGBA; public class SettingsDialog {
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.texture.Texture;
import com.simsilica.lemur.*;
import com.simsilica.lemur.component.QuadBackgroundComponent;
import com.simsilica.lemur.component.SpringGridLayout;
import com.simsilica.lemur.event.CursorListener;
import com.simsilica.lemur.event.CursorMotionEvent;
import com.simsilica.lemur.event.MouseEventControl;
import pp.mdga.client.MdgaApp;
import com.simsilica.lemur.*;
import com.simsilica.lemur.style.*;
import java.util.HashMap;
public class SettingsDialog extends Dialog {
private TextField nameInput;
private HashMap<Slider, PercentRunnable> map = new HashMap<Slider, PercentRunnable>();
private HashMap<Slider, GetPercentRunnable> map2 = new HashMap<Slider, GetPercentRunnable>();
public SettingsDialog(MdgaApp app, Node node, String path) {
super(app, node);
QuadBackgroundComponent quad1 = new QuadBackgroundComponent(ColorRGBA.Gray);
quad1.setMargin(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor());
container.setBackground(quad1);
Texture texture = app.getAssetManager().loadTexture(path);
QuadBackgroundComponent b = new QuadBackgroundComponent(texture);
Panel imagePanel = new Panel();
imagePanel.setBackground(b);
container.addChild(imagePanel).setPreferredSize(new Vector3f((texture.getImage().getWidth() / 2) * app.getResolutionFactor(), (texture.getImage().getHeight() / 2) * app.getResolutionFactor(), 0));
//abstandshalter
container.addChild(new Panel(80 * app.getResolutionFactor(), 50 * app.getResolutionFactor(), ColorRGBA.Gray));
}
@Override
public void show() {
super.show();
container.setLocalTranslation(
app.getCamera().getWidth() / 2 - container.getPreferredSize().x / 2,
app.getCamera().getHeight() / 2 + container.getPreferredSize().y / 2,
0
);
}
@Override
public void hide() {
super.hide();
}
public void addButton(String label, Runnable action, Vector3f size) {
createButton(label, action, size);
}
public void addSlider(String label, PercentRunnable action, GetPercentRunnable action2, Vector3f size, int start) {
Container subContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y));
Slider slider = new Slider("slider");
QuadBackgroundComponent background = new QuadBackgroundComponent(ColorRGBA.DarkGray);
slider.setBackground(background);
slider.setPreferredSize(size);
slider.setModel(new DefaultRangedValueModel(0, 100, start));
slider.setPreferredSize(new Vector3f(150 * app.getResolutionFactor(), 30 * app.getResolutionFactor(), 0));
slider.getDecrementButton().setText(" - ");
slider.getIncrementButton().setText(" + ");
slider.getDecrementButton().setFontSize(25 * app.getResolutionFactor());
slider.getIncrementButton().setFontSize(25 * app.getResolutionFactor());
Label nameLabel = new Label(label);
nameLabel.setFontSize(fontSize);
nameLabel.setColor(ColorRGBA.Black);
nameLabel.setPreferredSize(new Vector3f(150 * app.getResolutionFactor(), 10 * app.getResolutionFactor(), 0));
subContainer.addChild(nameLabel);
subContainer.addChild(slider);
container.addChild(subContainer);
map.put(slider, action);
map2.put(slider, action2);
//abstandshalter
container.addChild(new Panel(20 * app.getResolutionFactor(), 10 * app.getResolutionFactor(), ColorRGBA.Gray));
}
public void initVolume() {
map2.forEach((slider, runnable) -> {
double val = (double) runnable.get();
slider.getModel().setPercent(val);
});
}
public void update() {
map.forEach((slider, runnable) -> {
float val = (float) slider.getModel().getPercent();
runnable.run(val);
});
}
} }

View File

@@ -1,28 +0,0 @@
package pp.mdga.client.dialog;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import pp.mdga.client.MdgaApp;
public class SingleButtonLeftDialog extends Dialog {
public SingleButtonLeftDialog(MdgaApp app, Node node, String label, Runnable action) {
super(app, node);
createButton(label, action, new Vector3f(170 * app.getResolutionFactor(), 60 * app.getResolutionFactor(), 0));
}
@Override
public void show() {
super.show();
float x = 2 * horitontal_step;
float y = 1.8f * vertical_step;
container.setLocalTranslation(x, y, 0);
}
@Override
public void hide() {
super.hide();
}
}

View File

@@ -1,28 +0,0 @@
package pp.mdga.client.dialog;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import pp.mdga.client.MdgaApp;
public class SingleButtonRightDialog extends Dialog {
public SingleButtonRightDialog(MdgaApp app, Node node, String label, Runnable action) {
super(app, node);
createButton(label, action, new Vector3f(170 * app.getResolutionFactor(), 60 * app.getResolutionFactor(), 0));
}
@Override
public void show() {
super.show();
float x = (14 * horitontal_step) - container.getPreferredSize().x;
float y = 1.8f * vertical_step;
container.setLocalTranslation(x, y, 0);
}
@Override
public void hide() {
super.hide();
}
}

View File

@@ -1,66 +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.HAlignment;
import com.simsilica.lemur.VAlignment;
import com.simsilica.lemur.component.QuadBackgroundComponent;
import pp.mdga.client.MdgaApp;
public class SingleButtonTopRight extends Dialog {
public SingleButtonTopRight(MdgaApp app, Node node, String label, Runnable action) {
super(app, node);
createButton(label, action, new Vector3f(170 * app.getResolutionFactor(), 60 * app.getResolutionFactor(), 0));
}
@Override
public void show() {
super.show();
float x = (14 * horitontal_step) - container.getPreferredSize().x;
float y = 8.5f * vertical_step;
container.setLocalTranslation(x, y, 0);
}
@Override
public void hide() {
super.hide();
}
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(ColorRGBA.Red);
background.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
button.setBackground(background);
button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOn, (source) -> {
QuadBackgroundComponent hoverBackground = new QuadBackgroundComponent(ColorRGBA.Yellow);
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(ColorRGBA.Red);
normalBackground.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
source.setBackground(normalBackground);
button.setHighlightColor(ColorRGBA.White);
button.setColor(ColorRGBA.Black);
});
container.addChild(button);
}
}

View File

@@ -1,86 +1,189 @@
package pp.mdga.client.dialog; package pp.mdga.client.dialog;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.scene.Node; import com.jme3.scene.Node;
import com.jme3.texture.Texture; import com.simsilica.lemur.Container;
import com.simsilica.lemur.*;
import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.component.QuadBackgroundComponent;
import com.simsilica.lemur.component.SpringGridLayout;
import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaApp;
import pp.mdga.client.button.InputButton;
import pp.mdga.client.button.MenuButton;
import pp.mdga.client.view.MainView;
import java.util.Random;
import java.util.random.RandomGenerator;
public class StartDialog extends Dialog { public class StartDialog extends Dialog {
private TextField nameInput; private InputButton nameInput;
public StartDialog(MdgaApp app, Node node) { private MenuButton hostButton;
private MenuButton joinButton;
private MenuButton endButton;
private final MainView view;
public StartDialog(MdgaApp app, Node node, MainView view) {
super(app, node); super(app, node);
QuadBackgroundComponent quad1 = new QuadBackgroundComponent(ColorRGBA.Gray); this.view = view;
quad1.setMargin(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor());
container.setBackground(quad1);
Texture texture = app.getAssetManager().loadTexture("Images/mdga_logo.png"); nameInput = new InputButton(app, node, "Name: ", 16);
QuadBackgroundComponent b = new QuadBackgroundComponent(texture); hostButton = new MenuButton(app, node, () -> view.forward(true), "Spiel hosten");
joinButton = new MenuButton(app, node, () -> view.forward(false), "Spiel beitreten");
endButton = new MenuButton(app, node, app::stop, "Spiel beenden");
Panel imagePanel = new Panel(); float offset = 2.0f;
imagePanel.setBackground(b);
container.addChild(imagePanel).setPreferredSize(new Vector3f(texture.getImage().getWidth() / 4, texture.getImage().getHeight() / 4, 0)); nameInput.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
offset += 1.5f;
//abstandshalter hostButton.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
container.addChild(new Panel(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor(), ColorRGBA.Gray)); offset += 1.25f;
createTextField(); joinButton.setPos(new Vector2f(0, MenuButton.VERTICAL - offset));
offset += 1.25f;
//abstandshalter endButton.setPos(new Vector2f(0, MenuButton.VERTICAL -offset));
container.addChild(new Panel(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor(), ColorRGBA.Gray)); offset += 1.25f;
} }
@Override @Override
public void show() { protected void onShow() {
super.show(); nameInput.show();
container.setLocalTranslation( hostButton.show();
app.getCamera().getWidth() / 2 - container.getPreferredSize().x / 2, joinButton.show();
app.getCamera().getHeight() / 2 + container.getPreferredSize().y / 2, endButton.show();
0
);
} }
@Override @Override
public void hide() { protected void onHide ()
super.hide(); {
nameInput.hide();
hostButton.hide();
joinButton.hide();
endButton.hide();
} }
public void addButton(String label, Runnable action, Vector3f size) { public void update() {
createButton(label, action, size); nameInput.update();
}
private void createTextField() {
Container subContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y));
Label nameLabel = new Label("Name:\t");
nameLabel.setFontSize(fontSize);
nameLabel.setColor(ColorRGBA.Black);
nameInput = new TextField("");
nameInput.setColor(ColorRGBA.Black);
nameInput.setTextHAlignment(HAlignment.Left);
nameInput.setFontSize(fontSize);
nameInput.setSingleLine(true);
QuadBackgroundComponent grayBackground = new QuadBackgroundComponent(ColorRGBA.DarkGray);
nameInput.setBackground(grayBackground);
subContainer.addChild(nameLabel);
subContainer.addChild(nameInput);
container.addChild(subContainer);
} }
public String getName() { public String getName() {
return nameInput.getText(); String name = nameInput.getString();
if (name == null || name.trim().isEmpty()) {
String[] names = {
"PixelPirat",
"NoobJäger",
"LagMeister",
"KnopfDrücker",
"SpawnCamper",
"AFKHeld",
"RageQuitter",
"GameOverPro",
"Checkpoint",
"RespawnHeld",
"Teebeutel",
"GlitchHexer",
"QuickScope",
"LootSammler",
"EpicLauch",
"KartoffelPro",
"StilleKlinge",
"TastenHeld",
"PixelKrieger",
"HacknSlash",
"JoystickJoe",
"SpawnFalle",
"OneHitWanda",
"CamperKing",
"GameGenie",
"HighPing",
"CheesePro",
"Speedy",
"GigaGamer",
"LevelNoob",
"SkillTobi",
"HeadshotMax",
"PentaPaul",
"CritKarl",
"ManaLeerer",
"Nachlader",
"ClutchKönig",
"FriendlyFe",
"ZonenHeld",
"SchleichKatze",
"ShotgunPro",
"SniperUdo",
"BossHunter",
"HeldenNoob",
"KillFranz",
"FragKarl",
"TeamNiete",
"LootPaul",
"UltraNoob",
"ProfiScout",
"PunkteKlaus",
"KrüppelKill",
"PixelNinja",
"NoobCrusher",
"LagBoss",
"SpawnKing",
"AFKSlayer",
"RespawnPro",
"Killjoy",
"GameBreaker",
"FastFingers",
"LootKing",
"QuickFlick",
"SilentShot",
"HackGod",
"GlitchHero",
"SpeedyBot",
"AimWizard",
"FragMaster",
"OneTapPro",
"KnifeLord",
"MetaHunter",
"PingWarrior",
"KeyBash",
"ClutchPro",
"ScopeBot",
"TrollMage",
"PowerLooter",
"TankHero",
"CampLord",
"SmurfSlayer",
"SkillThief",
"SniperGod",
"LevelHack",
"GhostAim",
"BossTamer",
"ShotgunJoe",
"AimRider",
"KillCount",
"PixelManiac",
"TrollOver",
"SneakPro",
"ReloadKing",
"SpawnTrap",
"LagLover",
"MetaHater",
"BoomMaker",
"WipeLord",
"CarryPro",
"ProBaiter",
"GameWarden",
};
Random random = new Random();
name = names[random.nextInt(names.length)];
}
return name;
} }
} }

View File

@@ -0,0 +1,4 @@
package pp.mdga.client.dialog;
public class VideoSettingsDialog {
}

View File

@@ -1,45 +1,49 @@
package pp.mdga.client.dialog; package pp.mdga.client.dialog2;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.scene.Node; import com.jme3.scene.Node;
import com.jme3.texture.Texture;
import com.simsilica.lemur.Button; import com.simsilica.lemur.Button;
import com.simsilica.lemur.Container;
import com.simsilica.lemur.HAlignment; import com.simsilica.lemur.HAlignment;
import com.simsilica.lemur.Panel;
import com.simsilica.lemur.VAlignment; import com.simsilica.lemur.VAlignment;
import com.simsilica.lemur.component.IconComponent;
import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.component.QuadBackgroundComponent;
import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaApp;
public class SettingsButtonDialog extends Dialog { public abstract class Dialog {
private IconComponent icon; protected final ColorRGBA COLOR_DEFAULT = ColorRGBA.Gray;
protected final ColorRGBA COLOR_HOVER = ColorRGBA.DarkGray;
public SettingsButtonDialog(MdgaApp app, Node node, String label, Runnable action) { protected Container container;
super(app, node);
icon = new IconComponent("Images/zahnrad.png"); protected final MdgaApp app;
icon.setIconScale(0.1f * app.getResolutionFactor()); private final Node node;
createButton(label, action, new Vector3f(60 * app.getResolutionFactor(), 60 * app.getResolutionFactor(), 0)); protected final float vertical_step;
protected final float horitontal_step;
protected float fontSize = 35;
public Dialog(MdgaApp app, Node node) {
this.app = app;
this.node = node;
this.container = new Container();
this.horitontal_step = app.getCamera().getWidth() / 16;
this.vertical_step = app.getCamera().getHeight() / 9;
//int val = (int) (32 * Math.min(app.getResolutionFactor() * 0.9f, 1));
//fontSize = val;
} }
@Override
public void show() { public void show() {
super.show(); node.attachChild(container);
float x = (15.5f * horitontal_step) - container.getPreferredSize().x;
float y = 8.5f * vertical_step;
container.setLocalTranslation(x, y, 0);
} }
@Override
public void hide () { public void hide () {
super.hide(); node.detachChild(container);
} }
@Override
protected void createButton(String label, Runnable action, Vector3f size) { protected void createButton(String label, Runnable action, Vector3f size) {
Button button = new Button(label); Button button = new Button(label);
button.addClickCommands(source -> action.run()); button.addClickCommands(source -> action.run());
@@ -51,28 +55,26 @@ protected void createButton(String label, Runnable action, Vector3f size) {
button.setTextVAlignment(VAlignment.Center); button.setTextVAlignment(VAlignment.Center);
QuadBackgroundComponent background = new QuadBackgroundComponent(COLOR_DEFAULT); QuadBackgroundComponent background = new QuadBackgroundComponent(COLOR_DEFAULT);
background.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor()); //background.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
button.setBackground(background); button.setBackground(background);
button.setIcon(icon);
button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOn, (source) -> { button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOn, (source) -> {
QuadBackgroundComponent hoverBackground = new QuadBackgroundComponent(COLOR_HOVER); QuadBackgroundComponent hoverBackground = new QuadBackgroundComponent(COLOR_HOVER);
hoverBackground.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor()); // hoverBackground.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
source.setBackground(hoverBackground); source.setBackground(hoverBackground);
button.setHighlightColor(ColorRGBA.White); button.setHighlightColor(ColorRGBA.White);
button.setColor(ColorRGBA.Black); button.setColor(ColorRGBA.Black);
button.setIcon(icon);
}); });
button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOff, (source) -> { button.addCommands(com.simsilica.lemur.Button.ButtonAction.HighlightOff, (source) -> {
QuadBackgroundComponent normalBackground = new QuadBackgroundComponent(COLOR_DEFAULT); QuadBackgroundComponent normalBackground = new QuadBackgroundComponent(COLOR_DEFAULT);
normalBackground.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor()); // normalBackground.setMargin(5 * app.getResolutionFactor(), 5 * app.getResolutionFactor());
source.setBackground(normalBackground); source.setBackground(normalBackground);
button.setHighlightColor(ColorRGBA.White); button.setHighlightColor(ColorRGBA.White);
button.setColor(ColorRGBA.Black); button.setColor(ColorRGBA.Black);
button.setIcon(icon);
}); });
container.addChild(button); container.addChild(button);
} }
} }

View File

@@ -0,0 +1,106 @@
package pp.mdga.client.dialog2;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import com.jme3.texture.Texture;
import com.simsilica.lemur.*;
import com.simsilica.lemur.component.QuadBackgroundComponent;
import com.simsilica.lemur.component.SpringGridLayout;
import pp.mdga.client.MdgaApp;
import java.util.HashMap;
public class SettingsDialog extends Dialog {
private TextField nameInput;
//private HashMap<Slider, PercentRunnable> map = new HashMap<Slider, PercentRunnable>();
//private HashMap<Slider, GetPercentRunnable> map2 = new HashMap<Slider, GetPercentRunnable>();
public SettingsDialog(MdgaApp app, Node node, String path) {
super(app, node);
QuadBackgroundComponent quad1 = new QuadBackgroundComponent(ColorRGBA.Gray);
//quad1.setMargin(100 * app.getResolutionFactor(), 50 * app.getResolutionFactor());
container.setBackground(quad1);
Texture texture = app.getAssetManager().loadTexture(path);
QuadBackgroundComponent b = new QuadBackgroundComponent(texture);
Panel imagePanel = new Panel();
imagePanel.setBackground(b);
// container.addChild(imagePanel).setPreferredSize(new Vector3f((texture.getImage().getWidth() / 2) * app.getResolutionFactor(), (texture.getImage().getHeight() / 2) * app.getResolutionFactor(), 0));
//abstandshalter
// container.addChild(new Panel(80 * app.getResolutionFactor(), 50 * app.getResolutionFactor(), ColorRGBA.Gray));
}
@Override
public void show() {
super.show();
container.setLocalTranslation(
app.getCamera().getWidth() / 2 - container.getPreferredSize().x / 2,
app.getCamera().getHeight() / 2 + container.getPreferredSize().y / 2,
0
);
}
@Override
public void hide() {
super.hide();
}
public void addButton(String label, Runnable action, Vector3f size) {
createButton(label, action, size);
}
/*public void addSlider(String label, PercentRunnable action, GetPercentRunnable action2, Vector3f size, int start) {
Container subContainer = new Container(new SpringGridLayout(Axis.X, Axis.Y));
Slider slider = new Slider("slider");
QuadBackgroundComponent background = new QuadBackgroundComponent(ColorRGBA.DarkGray);
slider.setBackground(background);
slider.setPreferredSize(size);
slider.setModel(new DefaultRangedValueModel(0, 100, start));
//slider.setPreferredSize(new Vector3f(150 * app.getResolutionFactor(), 30 * app.getResolutionFactor(), 0));
slider.getDecrementButton().setText(" - ");
slider.getIncrementButton().setText(" + ");
// slider.getDecrementButton().setFontSize(25 * app.getResolutionFactor());
// slider.getIncrementButton().setFontSize(25 * app.getResolutionFactor());
Label nameLabel = new Label(label);
nameLabel.setFontSize(fontSize);
nameLabel.setColor(ColorRGBA.Black);
// nameLabel.setPreferredSize(new Vector3f(150 * app.getResolutionFactor(), 10 * app.getResolutionFactor(), 0));
subContainer.addChild(nameLabel);
subContainer.addChild(slider);
container.addChild(subContainer);
map.put(slider, action);
map2.put(slider, action2);
//abstandshalter
// container.addChild(new Panel(20 * app.getResolutionFactor(), 10 * app.getResolutionFactor(), ColorRGBA.Gray));
}
public void initVolume() {
map2.forEach((slider, runnable) -> {
double val = (double) runnable.get();
slider.getModel().setPercent(val);
});
}
public void update() {
map.forEach((slider, runnable) -> {
float val = (float) slider.getModel().getPercent();
runnable.run(val);
});
}*/
}

View File

@@ -1,13 +1,10 @@
package pp.mdga.client.view; package pp.mdga.client.view;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import pp.mdga.client.dialog.SingleButtonLeftDialog;
import pp.mdga.client.dialog.SingleButtonRightDialog;
import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaApp;
import pp.mdga.client.MdgaState; import pp.mdga.client.MdgaState;
public class CeremonyView extends MdgaView { public class CeremonyView extends MdgaView {
private enum SubState { private enum SubState {
AWARD_CEREMONY, AWARD_CEREMONY,
STATISTICS, STATISTICS,
@@ -15,16 +12,10 @@ private enum SubState {
private SubState state; private SubState state;
private SingleButtonRightDialog continueButton;
private SingleButtonLeftDialog backButton;
private Geometry background; private Geometry background;
public CeremonyView(MdgaApp app) { public CeremonyView(MdgaApp app) {
super(app); super(app);
continueButton = new SingleButtonRightDialog(app, node, "Weiter", () -> forward());
backButton = new SingleButtonLeftDialog(app, node, "Zurück", () -> back());
} }
@Override @Override
@@ -34,36 +25,33 @@ public void onEnter() {
@Override @Override
public void onLeave() { public void onLeave() {
continueButton.hide(); }
backButton.hide();
@Override
protected void onEnterOverlay(Overlay overlay) {
}
@Override
protected void onLeaveOverlay(Overlay overlay) {
} }
private void awardCeremony() { private void awardCeremony() {
background = createBackground("Images/b1.png"); background = createBackground("Images/b1.png");
node.attachChild(background); guiNode.attachChild(background);
continueButton.show();
backButton.hide();
} }
private void statistics() { private void statistics() {
background = createBackground("Images/b2.png"); background = createBackground("Images/b2.png");
node.attachChild(background); guiNode.attachChild(background);
continueButton.show();
backButton.show();
} }
private void enterSub(SubState state) { private void enterSub(SubState state) {
this.state = state; this.state = state;
if(null != background) { if(null != background) {
node.detachChild(background); guiNode.detachChild(background);
} }
backButton.hide();
continueButton.hide();
switch (state) { switch (state) {
case AWARD_CEREMONY: case AWARD_CEREMONY:
awardCeremony(); awardCeremony();

View File

@@ -1,43 +1,27 @@
package pp.mdga.client.view; package pp.mdga.client.view;
import com.jme3.input.KeyInput;
import com.jme3.input.MouseInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.input.controls.MouseButtonTrigger;
import com.jme3.post.FilterPostProcessor; import com.jme3.post.FilterPostProcessor;
import com.jme3.post.filters.ComposeFilter;
import com.jme3.texture.FrameBuffer; import com.jme3.texture.FrameBuffer;
import com.jme3.texture.Image; import com.jme3.texture.Image;
import com.jme3.texture.Texture2D; import com.jme3.texture.Texture2D;
import pp.mdga.client.board.BoardHandler; import pp.mdga.client.board.BoardHandler;
import pp.mdga.client.board.CameraHandler; import pp.mdga.client.board.CameraHandler;
import pp.mdga.client.dialog.SingleButtonLeftDialog;
import pp.mdga.client.dialog.SingleButtonRightDialog;
import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaApp;
import pp.mdga.client.MdgaState;
import pp.mdga.client.gui.GuiHandler; import pp.mdga.client.gui.GuiHandler;
import pp.mdga.game.Color;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class GameView extends MdgaView { public class GameView extends MdgaView {
private BoardHandler boardHandler; private BoardHandler boardHandler;
private CameraHandler camera; private CameraHandler camera;
private GuiHandler guiHandler; private GuiHandler guiHandler;
private SingleButtonLeftDialog leaveButton;
private SingleButtonRightDialog continueButton;
public GameView(MdgaApp app) { public GameView(MdgaApp app) {
super(app); super(app);
//Filter für Outline: Reihenfolge CameraHandler(dlsf) -> BoardHandler -> viewPort.addProcessor einhalten!
FilterPostProcessor fpp = new FilterPostProcessor(app.getAssetManager()); FilterPostProcessor fpp = new FilterPostProcessor(app.getAssetManager());
this.camera = new CameraHandler(app, fpp); this.camera = new CameraHandler(app, fpp);
this.boardHandler = new BoardHandler(app, fpp); this.boardHandler = new BoardHandler(app, fpp);
//TODO sollte das onLeave nicht vlt rückgänging gemacht werden??
app.getViewPort().addProcessor(fpp); app.getViewPort().addProcessor(fpp);
FrameBuffer backFrameBuffer = new FrameBuffer(app.getCamera().getWidth(), app.getCamera().getHeight(), 1); FrameBuffer backFrameBuffer = new FrameBuffer(app.getCamera().getWidth(), app.getCamera().getHeight(), 1);
@@ -47,10 +31,7 @@ public GameView(MdgaApp app) {
app.getViewPort().setOutputFrameBuffer(backFrameBuffer); app.getViewPort().setOutputFrameBuffer(backFrameBuffer);
this.guiHandler = new GuiHandler(app, backTexture); this.guiHandler = new GuiHandler(app, backTexture);
//TODO ---------------------------------------------------------
leaveButton = new SingleButtonLeftDialog(app, settingsNode, "Verlassen", () -> leaveGame());
continueButton = new SingleButtonRightDialog(app, node, "Weiter", () -> app.getModelSyncronizer().enter(MdgaState.CEREMONY));
} }
@Override @Override
@@ -58,51 +39,32 @@ public void onEnter() {
camera.init(); camera.init();
boardHandler.init(); boardHandler.init();
guiHandler.init(); guiHandler.init();
continueButton.show();
// boardHandler.addPlayer(Color.AIRFORCE, test);
// boardHandler.movePieceStart(player0, 0);
// boardHandler.enableHover(player0);
// boardHandler.enableHover(player1);
// boardHandler.highlight(player0, true);
// boardHandler.outline(player0, true);
// boardHandler.outline(10);
guiHandler.test();
} }
@Override @Override
public void onLeave() { public void onLeave() {
continueButton.hide();
camera.shutdown(); camera.shutdown();
boardHandler.shutdown(); boardHandler.shutdown();
guiHandler.shutdown();
} }
@Override @Override
public void onUpdate() { public void onUpdate(float tpf) {
camera.update(app.getInputSyncronizer().getScroll(), app.getInputSyncronizer().getRotation()); camera.update(app.getInputSyncronizer().getScroll(), app.getInputSyncronizer().getRotation());
} }
@Override @Override
protected void enterExtendedSettings() { protected void onEnterOverlay(Overlay overlay) {
leaveButton.show();
} }
@Override @Override
protected void leaveExtendedSettings() { protected void onLeaveOverlay(Overlay overlay)
leaveButton.hide(); {
} }
private void leaveGame() { private void leaveGame() {
leaveSettings(false);
app.getModelSyncronizer().leave(); app.getModelSyncronizer().leave();
app.afteGameCleanup(); app.afteGameCleanup();

View File

@@ -1,59 +1,175 @@
package pp.mdga.client.view; package pp.mdga.client.view;
import com.jme3.asset.TextureKey;
import com.jme3.light.AmbientLight;
import com.jme3.math.ColorRGBA;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import pp.mdga.client.dialog.LobbyButtonDialog; import com.jme3.scene.Spatial;
import pp.mdga.client.dialog.SingleButtonLeftDialog; import com.jme3.texture.Texture;
import pp.mdga.client.dialog.SingleButtonRightDialog; import com.jme3.util.SkyFactory;
import pp.mdga.client.MdgaApp; 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.LobbyButton;
import pp.mdga.client.button.SettingsButton;
import pp.mdga.game.Color; import pp.mdga.game.Color;
import java.util.ArrayList;
public class LobbyView extends MdgaView { public class LobbyView extends MdgaView {
private Geometry background; private Geometry background;
private SingleButtonRightDialog readyButton; private SettingsButton settingsButton;
private SingleButtonLeftDialog leaveButton;
private ArrayList<LobbyButtonDialog> lobbyButtons = new ArrayList<>(); private ButtonLeft leaveButton;
private ButtonRight readyButton;
private LobbyButton cyberButton;
private LobbyButton airforceButton;
private LobbyButton armyButton;
private LobbyButton navyButton;
private AmbientLight ambient = new AmbientLight();;
public LobbyView(MdgaApp app) { public LobbyView(MdgaApp app) {
super(app); super(app);
background = createBackground("Images/lobby.png"); TextureKey key = new TextureKey("Images/map3.png", false);
node.attachChild(background); Texture skyTexture = app.getAssetManager().loadTexture(key);
Spatial sky = SkyFactory.createSky(app.getAssetManager(), skyTexture, SkyFactory.EnvMapType.SphereMap);
rootNode.attachChild(sky);
readyButton = new SingleButtonRightDialog(app, node, "Fertig", () -> app.getModelSyncronizer().setReady()); settingsButton = new SettingsButton(app, guiNode, this::clickSettings);
leaveButton = new SingleButtonLeftDialog(app, node, "Verlassen", () -> app.getModelSyncronizer().leave());
lobbyButtons.add(new LobbyButtonDialog(app, node, "HEER", 0)); leaveButton = new ButtonLeft(app, guiNode, this::leaveLobby, "Verlassen", 1);
lobbyButtons.add(new LobbyButtonDialog(app, node, "MARINE", 1)); readyButton = new ButtonRight(app, guiNode, this::ready, "Bereit", 1);
lobbyButtons.add(new LobbyButtonDialog(app, node, "CIR", 2));
lobbyButtons.add(new LobbyButtonDialog(app, node, "LUFTWAFFE", 3)); cyberButton = new LobbyButton(app, guiNode, rootNode, () -> toggleTsk(Color.CYBER), Color.CYBER);
airforceButton = new LobbyButton(app, guiNode, rootNode, () -> toggleTsk(Color.AIRFORCE), Color.AIRFORCE);
armyButton = new LobbyButton(app, guiNode, rootNode, () -> toggleTsk(Color.ARMY), Color.ARMY);
navyButton = new LobbyButton(app, guiNode, rootNode, () -> toggleTsk(Color.NAVY), Color.NAVY);
ambient.setColor(new ColorRGBA(0.3f, 0.3f, 0.3f, 1));
} }
@Override @Override
public void onEnter() { public void onEnter() {
readyButton.show(); settingsButton.show();
leaveButton.show();
for (LobbyButtonDialog b : lobbyButtons) { leaveButton.show();
b.show(); readyButton.show();
}
cyberButton.show();
airforceButton.show();
armyButton.show();
navyButton.show();
rootNode.addLight(ambient);
} }
@Override @Override
public void onLeave() { public void onLeave() {
for (LobbyButtonDialog b : lobbyButtons) { settingsButton.hide();
b.hide();
leaveButton.hide();
readyButton.hide();
airforceButton.hide();
armyButton.hide();
navyButton.hide();
cyberButton.hide();
rootNode.removeLight(ambient);
} }
readyButton.hide(); @Override
leaveButton.hide(); protected void onUpdate(float tpf) {
airforceButton.update(tpf);
armyButton.update(tpf);
navyButton.update(tpf);
cyberButton.update(tpf);
}
@Override
protected void onEnterOverlay(Overlay overlay) {
}
@Override
protected void onLeaveOverlay(Overlay overlay)
{
} }
public void setTaken(Color color, boolean isTaken, boolean isSelf, String name) { public void setTaken(Color color, boolean isTaken, boolean isSelf, String name) {
lobbyButtons.get(color.ordinal()).setTaken(isTaken, isSelf, name); LobbyButton.Taken taken;
if(isTaken) {
if(isSelf) {
taken = LobbyButton.Taken.SELF;
} else {
taken = LobbyButton.Taken.OTHER;
}
} else {
taken = LobbyButton.Taken.NOT;
}
switch (color) {
case CYBER:
cyberButton.setTaken(taken, name);
break;
case AIRFORCE:
airforceButton.setTaken(taken, name);
break;
case ARMY:
armyButton.setTaken(taken, name);
break;
case NAVY:
navyButton.setTaken(taken, name);
break;
}
}
private void toggleTsk(Color color) {
LobbyButton.Taken taken = LobbyButton.Taken.NOT;
switch (color) {
case CYBER:
taken = cyberButton.getTaken();
break;
case AIRFORCE:
taken = airforceButton.getTaken();
break;
case ARMY:
taken = armyButton.getTaken();
break;
case NAVY:
taken = navyButton.getTaken();
break;
}
switch (taken) {
case NOT:
app.getModelSyncronizer().selectTsk(color);
break;
case SELF:
app.getModelSyncronizer().unselectTsk();
break;
case OTHER:
//nothing
break;
}
}
private void ready() {
app.getModelSyncronizer().setReady();
//TODO: playSound
}
private void leaveLobby() {
app.getModelSyncronizer().leave();
//TODO: playSound
}
private void clickSettings() {
//TODO: playSound
} }
} }

View File

@@ -1,79 +1,201 @@
package pp.mdga.client.view; package pp.mdga.client.view;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import pp.mdga.client.dialog.Dialog; import pp.mdga.client.MdgaApp;
import pp.mdga.client.MdgaState;
import pp.mdga.client.button.ButtonRight;
import pp.mdga.client.button.MenuButton;
import pp.mdga.client.button.SettingsButton;
import pp.mdga.client.dialog.HostDialog; import pp.mdga.client.dialog.HostDialog;
import pp.mdga.client.dialog.JoinDialog; import pp.mdga.client.dialog.JoinDialog;
import pp.mdga.client.dialog.StartDialog; import pp.mdga.client.dialog.StartDialog;
import pp.mdga.client.MdgaApp;
import com.jme3.math.Vector3f;
public class MainView extends MdgaView { public class MainView extends MdgaView {
private enum SubState {
HOST,
JOIN,
MAIN,
}
private SubState state;
private Geometry background; private Geometry background;
private StartDialog dialog; private SettingsButton settingsButton;
private Dialog subDialog;
private StartDialog startDialog;
private JoinDialog joinDialog;
private HostDialog hostDialog;
public MainView(MdgaApp app) { public MainView(MdgaApp app) {
super(app); super(app);
background = createBackground("Images/powercards.png"); settingsButton = new SettingsButton(app, guiNode, this::clickSettings);
node.attachChild(background);
Vector3f size = new Vector3f(280, 60, 0); startDialog = new StartDialog(app, guiNode, this);
dialog = new StartDialog(app, node); joinDialog = new JoinDialog(app, guiNode, this);
dialog.addButton("Spiel beitreten", () -> enterJoin(), size); hostDialog = new HostDialog(app, guiNode, this);
dialog.addButton("Spiel hosten", () -> enterHost(), size);
dialog.addButton("Einstellungen", () -> enterSettings(false), size);
dialog.addButton("Spiel beenden", () -> app.stop(), size);
} }
@Override @Override
public void onEnter() { public void onEnter() {
dialog.show(); background = createBackground("Images/main.png");
guiNode.attachChild(background);
settingsButton.show();
enterSub(SubState.MAIN);
} }
@Override @Override
public void onLeave() { public void onLeave() {
dialog.hide(); startDialog.hide();
joinDialog.hide();
hostDialog.hide();
if(subDialog != null) { settingsButton.hide();
subDialog.hide();
subDialog = null; guiNode.detachChild(background);
}
@Override
public void onUpdate(float tpf) {
startDialog.update();
joinDialog.update();
hostDialog.update();
}
@Override
protected void onEnterOverlay(Overlay overlay) {
}
@Override
protected void onLeaveOverlay(Overlay overlay)
{
}
private void joinMenu() {
startDialog.hide();
hostDialog.hide();
joinDialog.show();
}
private void hostMenu() {
startDialog.hide();
joinDialog.hide();
hostDialog.show();
}
private void mainMenu() {
joinDialog.hide();
hostDialog.hide();
startDialog.show();
}
private void tryHost() {
int port = 0;
String text = hostDialog.getPort();
try {
port = Integer.parseInt(text);
if(port >= 1 && port <= 65535) {
app.getModelSyncronizer().setHost(port);
//TODO: playSound
return;
}
} catch (NumberFormatException e) {
//nothing
}
hostDialog.resetPort();
//TODO: playSound
}
private void tryJoin() {
app.getModelSyncronizer().setJoin("127.0.0.1", 1);
}
private void enterSub(SubState state) {
this.state = state;
if(null != background) {
rootNode.detachChild(background);
}
switch (state) {
case HOST:
hostMenu();
break;
case JOIN:
joinMenu();
break;
case MAIN:
mainMenu();
break;
} }
} }
private void enterJoin() { public void forward() {
app.getModelSyncronizer().setName(dialog.getName()); switch (state) {
case HOST:
subDialog = new JoinDialog(app, node, () -> leaveJoin()); app.getModelSyncronizer().setName(startDialog.getName());
tryHost();
dialog.hide(); break;
subDialog.show(); case JOIN:
} app.getModelSyncronizer().setName(startDialog.getName());
tryJoin();
private void leaveJoin() { break;
subDialog.hide(); case MAIN:
dialog.show(); throw new RuntimeException("call forward(boolean host) insted of forward()");
}
subDialog = null; }
}
public void forward(boolean host) {
private void enterHost() { switch (state) {
app.getModelSyncronizer().setName(dialog.getName()); case HOST:
app.getModelSyncronizer().setName(startDialog.getName());
subDialog = new HostDialog(app, node, () -> leaveHost()); tryHost();
break;
dialog.hide(); case JOIN:
subDialog.show(); app.getModelSyncronizer().setName(startDialog.getName());
} tryJoin();
break;
private void leaveHost() { case MAIN:
subDialog.hide(); if(host) {
dialog.show(); enterSub(SubState.HOST);
//TODO: playSound
subDialog = null; } else {
enterSub(SubState.JOIN);
//TODO: playSound
}
break;
}
}
public void back() {
switch (state) {
case HOST:
enterSub(SubState.MAIN);
//TODO: playSound
break;
case JOIN:
enterSub(SubState.MAIN);
//TODO: playSound
break;
case MAIN:
//nothing
break;
}
}
public void clickSettings() {
//TODO: playSound
} }
} }

View File

@@ -2,207 +2,85 @@
import com.jme3.asset.TextureKey; import com.jme3.asset.TextureKey;
import com.jme3.material.Material; import com.jme3.material.Material;
import com.jme3.math.Vector3f; import com.jme3.math.Vector2f;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import com.jme3.scene.Node; import com.jme3.scene.Node;
import com.jme3.scene.shape.Quad; import com.jme3.scene.shape.Quad;
import com.jme3.texture.Texture; import com.jme3.texture.Texture;
import pp.mdga.client.dialog.GetPercentRunnable;
import pp.mdga.client.dialog.PercentRunnable;
import pp.mdga.client.dialog.SettingsButtonDialog;
import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaApp;
import pp.mdga.client.dialog.SettingsDialog; import pp.mdga.client.button.*;
public abstract class MdgaView { public abstract class MdgaView {
public enum Overlay {
INTERRUPT,
SETTINGS,
}
protected MdgaApp app; protected MdgaApp app;
protected Node node; protected Node rootNode = new Node();
protected Node guiNode = new Node();
protected int depth = 0;
private boolean isVideo = false;
private boolean isAudio = false;
protected Node settingsNode;
protected Node audioSettingsNode;
protected Node videoSettingsNode;
private SettingsButtonDialog settingsButton;
private Geometry settingsBackground;
private Geometry audioBackground;
private Geometry videoBackground;
private SettingsDialog settings;
private SettingsDialog audio;
private SettingsDialog video;
private static final String IMAGE_ROOT = "Images/";
public MdgaView(MdgaApp app) { public MdgaView(MdgaApp app) {
this.app = app; this.app = app;
this.node = new Node();
this.settingsNode = new Node();
this.audioSettingsNode = new Node();
this.videoSettingsNode = new Node();
this.settingsButton = new SettingsButtonDialog(app, node, "", () -> enterSettings(false));
this.settingsBackground = createBackground(IMAGE_ROOT + "background/zahnräder.png");
settingsNode.attachChild(settingsBackground);
this.audioBackground = createBackground(IMAGE_ROOT + "background/lautsprecher.png");
audioSettingsNode.attachChild(audioBackground);
this.videoBackground = createBackground(IMAGE_ROOT + "background/monitors.png");
videoSettingsNode.attachChild(videoBackground);
Vector3f size = new Vector3f(280, 60, 0);
this.settings = new SettingsDialog(app, settingsNode, IMAGE_ROOT + "zahnrad.png");
this.settings.addButton("Video", () -> enterVideo(), size);
this.settings.addButton("Audio", () -> enterAudio(), size);
this.settings.addButton("Zurück", () -> leaveSettings(false), size);
this.audio = new SettingsDialog(app, audioSettingsNode, IMAGE_ROOT + "audio_icon.png");
this.audio.addSlider("Lautstärke", new PercentRunnable(app.getAcousticHandler()::setMainVolume), new GetPercentRunnable(app.getAcousticHandler()::getMainVolume), size, (int) app.getAcousticHandler().getMainVolume() * 100);
this.audio.addSlider("Musik", new PercentRunnable(app.getAcousticHandler()::setMusicVolume), new GetPercentRunnable(app.getAcousticHandler()::getMusicVolume), size, (int) app.getAcousticHandler().getMusicVolume() * 100);
this.audio.addSlider("Sound", new PercentRunnable(app.getAcousticHandler()::setSoundVolume), new GetPercentRunnable(app.getAcousticHandler()::getSoundVolume), size, (int) app.getAcousticHandler().getSoundVolume() * 100);
this.audio.addButton("Zurück", () -> leaveAudio(), size);
this.video = new SettingsDialog(app, videoSettingsNode, IMAGE_ROOT + "monitor.png");
this.video.addButton("A", () -> System.out.println("A"), size);
this.video.addButton("B", () -> System.out.println("B"), size);
this.video.addButton("Zurück", () -> leaveVideo(), size);
} }
public void enter() { public void enter() {
app.getGuiNode().attachChild(node); app.getRootNode().attachChild(rootNode);
app.getGuiNode().attachChild(guiNode);
audio.initVolume();
settingsButton.show();
onEnter(); onEnter();
} }
public void leave() { public void leave() {
app.getRootNode().detachChild(rootNode);
app.getGuiNode().detachChild(guiNode);
onLeave(); onLeave();
settingsButton.hide();
app.getGuiNode().detachChild(node);
} }
public void update() { public void enterOverlay(Overlay overlay) {
audio.update(); app.getGuiNode().detachChild(guiNode);
onUpdate();
onEnterOverlay(overlay);
}
public void leaveOverlay(Overlay overlay) {
app.getGuiNode().attachChild(guiNode);
onLeaveOverlay(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);
//TODO ----------------------------------------------
onUpdate(tpf);
} }
protected abstract void onEnter(); protected abstract void onEnter();
protected abstract void onLeave(); protected abstract void onLeave();
protected void onUpdate() {} protected void onUpdate(float tpf) {}
protected abstract void onEnterOverlay(Overlay overlay);
protected abstract void onLeaveOverlay(Overlay overlay);
protected Geometry createBackground(String texturePath) { protected Geometry createBackground(String texturePath) {
TextureKey key = new TextureKey(texturePath, true); TextureKey key = new TextureKey(texturePath, true);
Texture backgroundTexture = app.getAssetManager().loadTexture(key); Texture backgroundTexture = app.getAssetManager().loadTexture(key);
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
Geometry background = new Geometry("Background", quad);
Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
mat.setTexture("ColorMap", backgroundTexture); mat.setTexture("ColorMap", backgroundTexture);
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
Geometry background = new Geometry("Background", quad);
background.setMaterial(mat); background.setMaterial(mat);
background.setLocalTranslation(0, 0, -1); background.setLocalTranslation(0, 0, -1);
return background; return background;
} }
protected void enterExtendedSettings() {}
protected void leaveExtendedSettings() {}
protected void enterSettings(boolean soft) {
leave();
app.getGuiNode().attachChild(settingsNode);
if(!soft) {
depth++;
enterExtendedSettings();
}
settings.show();
}
protected void leaveSettings(boolean soft) {
settings.hide();
app.getGuiNode().detachChild(settingsNode);
if(!soft) {
leaveExtendedSettings();
enter();
depth--;
}
}
protected void enterAudio() {
leaveSettings(true);
depth++;
isAudio = true;
app.getGuiNode().attachChild(audioSettingsNode);
audio.show();
}
protected void leaveAudio() {
audio.hide();
app.getGuiNode().detachChild(audioSettingsNode);
isAudio = false;
depth--;
enterSettings(true);
}
protected void enterVideo() {
leaveSettings(true);
app.getGuiNode().attachChild(videoSettingsNode);
depth++;
isVideo = true;
video.show();
}
protected void leaveVideo() {
video.hide();
app.getGuiNode().detachChild(videoSettingsNode);
depth--;
isVideo = false;
enterSettings(true);
}
public void pressEscape() {
if(depth == 0) {
enterSettings(false);
} else if(depth == 1) {
leaveSettings(false);
}
else if (depth == 2){
if(isVideo) {
leaveVideo();
}
if(isAudio) {
leaveAudio();
}
} else {
throw new RuntimeException();
}
}
} }

View File

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB