7 Commits

Author SHA1 Message Date
Johannes Schmelz
4703afd656 Merge branch 'logic' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into logic 2024-11-25 06:53:56 +01:00
Johannes Schmelz
d26c29b561 Merge branch 'logic' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into logic 2024-11-18 17:11:40 +01:00
Johannes Schmelz
4279d130dd Merge branch 'logic' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into logic 2024-11-18 16:53:11 +01:00
Johannes Schmelz
fc5315d35a Merge branch 'logic' of https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02 into logic 2024-11-18 05:00:36 +01:00
Johannes Schmelz
c7c2d95aed refactor for java 20 2024-11-18 05:00:31 +01:00
Johannes Schmelz
84e68d9fa8 Merge branch 'gui' into 'logic'
Gui

See merge request progproj/gruppen-ht24/Gruppe-02!8
2024-11-18 03:50:55 +00:00
Johannes Schmelz
465aef567e Gui 2024-11-18 03:50:54 +00:00
28 changed files with 325 additions and 354 deletions

View File

@@ -1,5 +1,6 @@
// Styling of Lemur components // Styling of Lemur components
// For documentation, see: // For documentation, see:
// For documentation, see:
// https://github.com/jMonkeyEngine-Contributions/Lemur/wiki/Styling // https://github.com/jMonkeyEngine-Contributions/Lemur/wiki/Styling
import com.jme3.math.ColorRGBA import com.jme3.math.ColorRGBA
@@ -11,7 +12,6 @@ import com.simsilica.lemur.Command
import com.simsilica.lemur.HAlignment import com.simsilica.lemur.HAlignment
import com.simsilica.lemur.Insets3f import com.simsilica.lemur.Insets3f
import com.simsilica.lemur.component.QuadBackgroundComponent import com.simsilica.lemur.component.QuadBackgroundComponent
import com.simsilica.lemur.component.TbtQuadBackgroundComponent
def bgColor = color(1, 1, 1, 1) def bgColor = color(1, 1, 1, 1)
def buttonEnabledColor = color(0, 0, 0, 1) def buttonEnabledColor = color(0, 0, 0, 1)
@@ -19,7 +19,7 @@ def buttonDisabledColor = color(0.8, 0.9, 1, 0.2)
def buttonBgColor = color(1, 1, 1, 1) def buttonBgColor = color(1, 1, 1, 1)
def sliderColor = color(0.6, 0.8, 0.8, 1) def sliderColor = color(0.6, 0.8, 0.8, 1)
def sliderBgColor = color(0.5, 0.75, 0.75, 1) def sliderBgColor = color(0.5, 0.75, 0.75, 1)
def gradientColor = color(0.5, 0.75, 0.85, 0.5) def gradientColor = color(1, 1, 1, 1)
def tabbuttonEnabledColor = color(0.4, 0.45, 0.5, 1) def tabbuttonEnabledColor = color(0.4, 0.45, 0.5, 1)
def solidWhiteBackground = new QuadBackgroundComponent(new ColorRGBA(1, 1, 1, 1)) def solidWhiteBackground = new QuadBackgroundComponent(new ColorRGBA(1, 1, 1, 1))
def greyBackground = new QuadBackgroundComponent(new ColorRGBA(0.1f, 0.1f, 0.1f, 1.0f)); def greyBackground = new QuadBackgroundComponent(new ColorRGBA(0.1f, 0.1f, 0.1f, 1.0f));
@@ -30,10 +30,8 @@ def lightGrey = color(0.6, 0.6, 0.6, 1.0)
def gradient = TbtQuadBackgroundComponent.create( def gradient = TbtQuadBackgroundComponent.create(
texture(name: "/com/simsilica/lemur/icons/bordered-gradient.png", texture(name: "/com/simsilica/lemur/icons/bordered-gradient.png", generateMips: false),
generateMips: false), 1, 1, 1, 126, 126, 1f, false)
1, 1, 1, 126, 126,
1f, false)
def doubleGradient = new QuadBackgroundComponent(gradientColor) def doubleGradient = new QuadBackgroundComponent(gradientColor)
doubleGradient.texture = texture(name: "/com/simsilica/lemur/icons/double-gradient-128.png", doubleGradient.texture = texture(name: "/com/simsilica/lemur/icons/double-gradient-128.png",
@@ -79,6 +77,7 @@ selector("header", "pp") {
textVAlignment = VAlignment.Center textVAlignment = VAlignment.Center
} }
// Container Stil
selector("container", "pp") { selector("container", "pp") {
background = solidWhiteBackground.clone() background = solidWhiteBackground.clone()
background.setColor(bgColor) background.setColor(bgColor)
@@ -91,8 +90,8 @@ selector("toolbar") {
} }
selector("slider", "pp") { selector("slider", "pp") {
background = gradient.clone() insets = new Insets3f(5, 10, 5, 10) // Abstand
background.setColor(bgColor) background = new QuadBackgroundComponent(sliderBgColor)
} }
def pressedCommand = new Command<Button>() { def pressedCommand = new Command<Button>() {
@@ -113,30 +112,6 @@ def enabledCommand = new Command<Button>() {
} }
} }
def repeatCommand = new Command<Button>() {
private long startTime
private long lastClick
void execute(Button source) {
// Only do the repeating click while the mouse is
// over the button (and pressed of course)
if (source.isPressed() && source.isHighlightOn()) {
long elapsedTime = System.currentTimeMillis() - startTime
// After half a second pause, click 8 times a second
if (elapsedTime > 500 && elapsedTime > lastClick + 125) {
source.click()
// Try to quantize the last click time to prevent drift
lastClick = ((elapsedTime - 500) / 125) * 125 + 500
}
}
else {
startTime = System.currentTimeMillis()
lastClick = 0
}
}
}
def stdButtonCommands = [ def stdButtonCommands = [
(ButtonAction.Down) : [pressedCommand], (ButtonAction.Down) : [pressedCommand],
(ButtonAction.Up) : [pressedCommand], (ButtonAction.Up) : [pressedCommand],

View File

@@ -1,110 +0,0 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.monopoly.client;
import com.jme3.input.controls.ActionListener;
import com.jme3.scene.Node;
import com.jme3.system.AppSettings;
import pp.monopoly.client.MonopolyAppState;
import pp.monopoly.client.gui.TestWorld;
import pp.monopoly.model.IntPoint;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
/**
* Represents the state responsible for managing the battle interface within the Battleship game.
* This state handles the display and interaction of the battle map, including the opponent's map.
* It manages GUI components, input events, and the layout of the interface when this state is enabled.
*/
public class GameAppState extends MonopolyAppState {
private static final Logger LOGGER = System.getLogger(MonopolyAppState.class.getName());
private static final float DEPTH = 0f;
private static final float GAP = 20f;
/**
* A listener for handling click events in the battle interface.
* When a click is detected, it triggers the corresponding actions on the opponent's map.
*/
private final ActionListener clickListener = (name, isPressed, tpf) -> click(isPressed);
/**
* The root node for all GUI components in the battle state.
*/
private final Node battleNode = new Node("Game"); //NON-NLS
/**
* A view representing the opponent's map in the GUI.
*/
private TestWorld testWorld;
/**
* Enables the battle state by initializing, laying out, and adding GUI components.
* Attaches the components to the GUI node and registers input listeners.
*/
@Override
protected void enableState() {
battleNode.detachAllChildren();
initializeGuiComponents();
layoutGuiComponents();
addGuiComponents();
getApp().getGuiNode().attachChild(battleNode);
}
/**
* Disables the battle state by removing GUI components and unregistering input listeners.
* Also handles cleanup of resources, such as the opponent's map view.
*/
@Override
protected void disableState() {
getApp().getGuiNode().detachChild(battleNode);
getApp().getInputManager().removeListener(clickListener);
}
/**
* Initializes the GUI components used in the battle state.
* Creates the opponent's map view and adds a grid overlay to it.
*/
private void initializeGuiComponents() {
testWorld = new TestWorld(getApp());
testWorld.initializeScene();
}
/**
* Adds the initialized GUI components to the battle node.
* Currently, it attaches the opponent's map view to the node.
*/
private void addGuiComponents() {
}
/**
* Lays out the GUI components within the window, positioning them appropriately.
* The opponent's map view is positioned based on the window's dimensions and a specified gap.
*/
private void layoutGuiComponents() {
final AppSettings s = getApp().getContext().getSettings();
final float windowWidth = s.getWidth();
final float windowHeight = s.getHeight();
}
/**
* Handles click events in the battle interface. If the event indicates a click (not a release),
* it translates the cursor position to the model's coordinate system and triggers the game logic
* for interacting with the opponent's map.
*
* @param isPressed whether the mouse button is currently pressed (true) or released (false)
*/
private void click(boolean isPressed) {
}
@Override
public void update(float tpf) {
testWorld.update(tpf);
super.update(tpf);
}
}

View File

@@ -1,30 +1,26 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.monopoly.client; package pp.monopoly.client;
import java.lang.System.Logger; import java.lang.System.Logger;
import java.lang.System.Logger.Level; import java.lang.System.Logger.Level;
import java.util.prefs.Preferences; import java.util.prefs.Preferences;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import java.util.prefs.Preferences;
import com.jme3.app.Application; import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState; import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager; import com.jme3.app.state.AppStateManager;
import com.jme3.asset.AssetLoadException;
import com.jme3.asset.AssetNotFoundException;
import com.jme3.audio.AudioData; import com.jme3.audio.AudioData;
import com.jme3.audio.AudioNode; import com.jme3.audio.AudioNode;
import pp.monopoly.notification.GameEventListener; import pp.monopoly.notification.GameEventListener;
import pp.monopoly.notification.SoundEvent; import pp.monopoly.notification.SoundEvent;
import static pp.util.PreferencesUtils.getPreferences; import static pp.util.PreferencesUtils.getPreferences;
/** /**
* An application state that plays sounds. * An application state that plays sounds based on game events.
*/ */
public class GameSound extends AbstractAppState implements GameEventListener { public class GameSound extends AbstractAppState implements GameEventListener {
private static final Logger LOGGER = System.getLogger(GameSound.class.getName()); private static final Logger LOGGER = System.getLogger(GameSound.class.getName());
@@ -71,7 +67,6 @@ public class GameSound extends AbstractAppState implements GameEventListener {
/** /**
* Sets the enabled state of this AppState. * Sets the enabled state of this AppState.
* Overrides {@link com.jme3.app.state.AbstractAppState#setEnabled(boolean)}
* *
* @param enabled {@code true} to enable the AppState, {@code false} to disable it. * @param enabled {@code true} to enable the AppState, {@code false} to disable it.
*/ */
@@ -79,16 +74,15 @@ public class GameSound extends AbstractAppState implements GameEventListener {
public void setEnabled(boolean enabled) { public void setEnabled(boolean enabled) {
if (isEnabled() == enabled) return; if (isEnabled() == enabled) return;
super.setEnabled(enabled); super.setEnabled(enabled);
LOGGER.log(Level.INFO, "Sound enabled: {0}", enabled); //NON-NLS LOGGER.log(Level.INFO, "Sound enabled: {0}", enabled);
PREFERENCES.putBoolean(ENABLED_PREF, enabled); PREFERENCES.putBoolean(ENABLED_PREF, enabled);
} }
/** /**
* Initializes the sound effects for the game. * Initializes the sound effects for the game and stores the application reference.
* Overrides {@link AbstractAppState#initialize(AppStateManager, Application)}
* *
* @param stateManager The state manager * @param stateManager The state manager
* @param app The application * @param app The application instance
*/ */
@Override @Override
public void initialize(AppStateManager stateManager, Application app) { public void initialize(AppStateManager stateManager, Application app) {
@@ -109,18 +103,16 @@ public class GameSound extends AbstractAppState implements GameEventListener {
/** /**
* Loads a sound from the specified file. * Loads a sound from the specified file.
* *
* @param app The application
* @param name The name of the sound file. * @param name The name of the sound file.
* @return The loaded AudioNode. * @return The loaded AudioNode.
*/ */
private AudioNode loadSound(Application app, String name) { private AudioNode loadSound(String name) {
try { try {
final AudioNode sound = new AudioNode(app.getAssetManager(), name, AudioData.DataType.Buffer); AudioNode sound = new AudioNode(app.getAssetManager(), name, AudioData.DataType.Buffer);
sound.setLooping(false); sound.setLooping(false);
sound.setPositional(false); sound.setPositional(false);
return sound; return sound;
} } catch (Exception ex) {
catch (AssetLoadException | AssetNotFoundException ex) {
LOGGER.log(Level.ERROR, ex.getMessage(), ex); LOGGER.log(Level.ERROR, ex.getMessage(), ex);
} }
return null; return null;
@@ -239,4 +231,4 @@ public class GameSound extends AbstractAppState implements GameEventListener {
case BUTTON -> button(); case BUTTON -> button();
} }
} }
} }//heloo

View File

@@ -18,6 +18,7 @@ import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger; import com.jme3.input.controls.KeyTrigger;
import com.jme3.input.controls.MouseButtonTrigger; import com.jme3.input.controls.MouseButtonTrigger;
import com.jme3.system.AppSettings; import com.jme3.system.AppSettings;
import com.jme3.texture.Texture;
import com.simsilica.lemur.GuiGlobals; import com.simsilica.lemur.GuiGlobals;
import com.simsilica.lemur.Label; import com.simsilica.lemur.Label;
import com.simsilica.lemur.style.BaseStyles; import com.simsilica.lemur.style.BaseStyles;
@@ -279,7 +280,19 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
private void handleB(boolean isPressed) { private void handleB(boolean isPressed) {
if (isPressed) { if (isPressed) {
Dialog tmp = new BuyCard(this); Dialog tmp = new BuyCard(this);
tmp.open(); if (eventCard != null && isBuyCardPopupOpen) {
// Schließe das SettingsMenu
System.out.println("Schließe BuyCardPopup...");
eventCard.close();
eventCard = null;
tmp.open();
} else {
// Öffne das SettingsMenu
System.out.println("Öffne BuyCardPopup...");
eventCard = new EventCard(this);
eventCard.open();
dialogManager.close(tmp);
}
} }
} }
@@ -308,7 +321,6 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
attachGameSound(); attachGameSound();
attachGameMusic(); attachGameMusic();
stateManager.attach(new GameAppState());
} }
/** /**
@@ -432,7 +444,6 @@ public class MonopolyApp extends SimpleApplication implements MonopolyClient, Ga
*/ */
@Override @Override
public void receivedEvent(ClientStateEvent event) { public void receivedEvent(ClientStateEvent event) {
stateManager.getState(GameAppState.class).setEnabled(true);
} }
/** /**

View File

@@ -3,8 +3,10 @@ package pp.monopoly.client.gui;
import com.jme3.scene.Node; import com.jme3.scene.Node;
import com.jme3.scene.Spatial; import com.jme3.scene.Spatial;
import pp.monopoly.model.Board; import pp.monopoly.model.Board;
import pp.monopoly.model.Item; import pp.monopoly.model.Item;
import pp.monopoly.model.Item;
import pp.monopoly.model.Visitor; import pp.monopoly.model.Visitor;
import pp.monopoly.notification.GameEventListener; import pp.monopoly.notification.GameEventListener;
import pp.monopoly.notification.ItemAddedEvent; import pp.monopoly.notification.ItemAddedEvent;
@@ -24,10 +26,14 @@ abstract class BoardSynchronizer extends ModelViewSynchronizer<Item> implements
* *
* @param board the game board to synchronize * @param board the game board to synchronize
* @param root the root node to which the view representations of the board items are attached * @param root the root node to which the view representations of the board items are attached
* @param board the game board to synchronize
* @param root the root node to which the view representations of the board items are attached
*/ */
protected BoardSynchronizer(Board board, Node root) {
protected BoardSynchronizer(Board board, Node root) { protected BoardSynchronizer(Board board, Node root) {
super(root); super(root);
this.board = board; this.board = board;
this.board = board;
} }
/** /**
@@ -42,6 +48,7 @@ abstract class BoardSynchronizer extends ModelViewSynchronizer<Item> implements
} }
/** /**
* Adds the existing items from the board to the view during initialization.
* Adds the existing items from the board to the view during initialization. * Adds the existing items from the board to the view during initialization.
*/ */
protected void addExisting() { protected void addExisting() {
@@ -49,26 +56,36 @@ abstract class BoardSynchronizer extends ModelViewSynchronizer<Item> implements
} }
/** /**
* Handles the event when an item is removed from the board.
* Handles the event when an item is removed from the board. * Handles the event when an item is removed from the board.
* *
* @param event the event indicating that an item has been removed from the board * @param event the event indicating that an item has been removed from the board
* @param event the event indicating that an item has been removed from the board
*/ */
@Override @Override
public void receivedEvent(ItemRemovedEvent event) { public void receivedEvent(ItemRemovedEvent event) {
if (board == event.getBoard()) { if (board == event.getBoard()) {
delete(event.getItem()); delete(event.getItem());
} }
if (board == event.getBoard()) {
delete(event.getItem());
}
} }
/** /**
* Handles the event when an item is added to the board.
* Handles the event when an item is added to the board. * Handles the event when an item is added to the board.
* *
* @param event the event indicating that an item has been added to the board * @param event the event indicating that an item has been added to the board
* @param event the event indicating that an item has been added to the board
*/ */
@Override @Override
public void receivedEvent(ItemAddedEvent event) { public void receivedEvent(ItemAddedEvent event) {
if (board == event.getBoard()) { if (board == event.getBoard()) {
add(event.getItem()); add(event.getItem());
} }
if (board == event.getBoard()) {
add(event.getItem());
}
} }
} }

View File

@@ -61,9 +61,4 @@ public class ChoosePartner extends Dialog {
app.getGuiNode().attachChild(background); app.getGuiNode().attachChild(background);
} }
@Override
public void escape() {
new SettingsMenu(app).open();
}
} }

View File

@@ -6,12 +6,17 @@ import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Quad; import com.jme3.scene.shape.Quad;
import com.jme3.texture.Texture; import com.jme3.texture.Texture;
import com.simsilica.lemur.Axis; import com.simsilica.lemur.Axis;
import com.simsilica.lemur.Axis;
import com.simsilica.lemur.Button; import com.simsilica.lemur.Button;
import com.simsilica.lemur.Container; import com.simsilica.lemur.Container;
import com.simsilica.lemur.HAlignment; import com.simsilica.lemur.HAlignment;
import com.simsilica.lemur.Container;
import com.simsilica.lemur.HAlignment;
import com.simsilica.lemur.component.QuadBackgroundComponent; import com.simsilica.lemur.component.QuadBackgroundComponent;
import com.simsilica.lemur.component.SpringGridLayout; import com.simsilica.lemur.component.SpringGridLayout;
import com.simsilica.lemur.component.SpringGridLayout;
import pp.dialog.Dialog; import pp.dialog.Dialog;
import pp.monopoly.client.MonopolyApp; import pp.monopoly.client.MonopolyApp;
import pp.monopoly.notification.Sound; import pp.monopoly.notification.Sound;
@@ -20,10 +25,12 @@ import pp.monopoly.notification.Sound;
* Constructs the startup menu dialog for the Monopoly application. * Constructs the startup menu dialog for the Monopoly application.
import pp.monopoly.client.gui.GameMenu; import pp.monopoly.client.gui.GameMenu;
*/ */
*/
public class StartMenu extends Dialog { public class StartMenu extends Dialog {
private final MonopolyApp app; private final MonopolyApp app;
/** /**
* Constructs the Startup Menu dialog for the Monopoly application.
* Constructs the Startup Menu dialog for the Monopoly application. * Constructs the Startup Menu dialog for the Monopoly application.
* *
* @param app the MonopolyApp instance * @param app the MonopolyApp instance
@@ -41,8 +48,10 @@ public class StartMenu extends Dialog {
Geometry background = new Geometry("Background", quad); Geometry background = new Geometry("Background", quad);
Material backgroundMaterial = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); Material backgroundMaterial = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
backgroundMaterial.setTexture("ColorMap", backgroundImage); backgroundMaterial.setTexture("ColorMap", backgroundImage);
backgroundMaterial.setTexture("ColorMap", backgroundImage);
background.setMaterial(backgroundMaterial); background.setMaterial(backgroundMaterial);
background.setLocalTranslation(0, 0, -1); // Ensure it is behind other GUI elements background.setLocalTranslation(0, 0, -1); // Ensure it is behind other GUI elements
background.setLocalTranslation(0, 0, -1); // Ensure it is behind other GUI elements
app.getGuiNode().attachChild(background); app.getGuiNode().attachChild(background);
// Center container for title and play button // Center container for title and play button

View File

@@ -0,0 +1,80 @@
package pp.monopoly.client.gui;
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.texture.Texture;
import com.jme3.system.JmeCanvasContext;
import com.jme3.system.AppSettings;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
public class TestWorldWithMenu extends SimpleApplication {
public static void createAndShowGUI() {
// Create JFrame
JFrame frame = new JFrame("Test World with Menu");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.setSize(800, 600);
// Create Menu Bar
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem exitItem = new JMenuItem(new AbstractAction("Exit") {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
fileMenu.add(exitItem);
menuBar.add(fileMenu);
frame.setJMenuBar(menuBar);
// Create Canvas for jMonkey
AppSettings settings = new AppSettings(true);
settings.setWidth(800);
settings.setHeight(600);
TestWorldWithMenu app = new TestWorldWithMenu();
app.setSettings(settings);
app.createCanvas(); // Create a canvas for embedding
JmeCanvasContext ctx = (JmeCanvasContext) app.getContext();
ctx.setSystemListener(app);
Canvas canvas = ctx.getCanvas();
canvas.setSize(800, 600);
// Add the canvas to JFrame
frame.add(canvas, BorderLayout.CENTER);
// Show the frame
frame.setVisible(true);
// Start the jMonkeyEngine application
app.startCanvas();
}
@Override
public void simpleInitApp() {
// Erstelle ein Quadrat
Box box = new Box(1, 0.01f, 1); // Dünnes Quadrat für die Textur
Geometry geom = new Geometry("Box", box);
// Setze das Material mit Textur
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
Texture texture = assetManager.loadTexture("Pictures/board.png"); // Replace with the path to your image
mat.setTexture("ColorMap", texture);
geom.setMaterial(mat);
// Füge das Quadrat zur Szene hinzu
rootNode.attachChild(geom);
// Setze die Kameraposition, um das Quadrat zu fokussieren
cam.setLocation(new Vector3f(0, 0, 3)); // Kamera auf der Z-Achse, nah am Quadrat
cam.lookAt(geom.getLocalTranslation(), Vector3f.UNIT_Y);
}
}

View File

@@ -27,10 +27,11 @@ public class Toolbar extends Dialog {
private final MonopolyApp app; private final MonopolyApp app;
private final Container toolbarContainer; private final Container toolbarContainer;
private final BitmapText positionText; // Anzeige für die aktuelle Position private final BitmapText positionText; // Anzeige für die aktuelle Position
private final float boardLimit = 0.95f; // Grenzen des Bretts
private final float stepSize = 0.18f; // Schrittgröße pro Bewegung
private int currentPosition = 0; // Aktuelle Position auf dem Spielfeld private int currentPosition = 0; // Aktuelle Position auf dem Spielfeld
private String diceOneImage = "Pictures/dice/one.png"; private final int positionsPerSide = 10; // Anzahl der Positionen pro Seite
private String diceTwoImage = "Pictures/dice/two.png"; private final Random random = new Random(); // Zufallsgenerator für den Würfelwurf
/** /**
* Konstruktor für die Toolbar. * Konstruktor für die Toolbar.
@@ -93,12 +94,12 @@ public class Toolbar extends Dialog {
leftContainer.setPreferredSize(new Vector3f(100, 150, 0)); // Adjust size as needed leftContainer.setPreferredSize(new Vector3f(100, 150, 0)); // Adjust size as needed
Label imageLabel = new Label(""); Label imageLabel = new Label("");
IconComponent icon = new IconComponent(diceOneImage); // Icon mit Textur erstellen IconComponent icon = new IconComponent("Pictures/dice/one.png"); // Icon mit Textur erstellen
icon.setIconSize(new Vector2f(100,100)); // Skalierung des Bildes icon.setIconSize(new Vector2f(100,100)); // Skalierung des Bildes
imageLabel.setIcon(icon); imageLabel.setIcon(icon);
Label imageLabel2 = new Label(""); Label imageLabel2 = new Label("");
IconComponent icon2 = new IconComponent(diceTwoImage); // Icon mit Textur erstellen IconComponent icon2 = new IconComponent("Pictures/dice/two.png"); // Icon mit Textur erstellen
icon2.setIconSize(new Vector2f(100,100)); // Skalierung des Bildes icon2.setIconSize(new Vector2f(100,100)); // Skalierung des Bildes
imageLabel2.setIcon(icon2); imageLabel2.setIcon(icon2);
@@ -131,7 +132,7 @@ public class Toolbar extends Dialog {
Button diceButton = new Button("Würfeln"); Button diceButton = new Button("Würfeln");
diceButton.setPreferredSize(new Vector3f(200, 50, 0)); // Full width for Würfeln button diceButton.setPreferredSize(new Vector3f(200, 50, 0)); // Full width for Würfeln button
diceButton.addClickCommands(s -> ifTopDialog(() -> { diceButton.addClickCommands(s -> ifTopDialog(() -> {
//TODO dice roll logic rollDice();
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
})); }));
diceContainer.addChild(diceButton); diceContainer.addChild(diceButton);
@@ -141,9 +142,9 @@ public class Toolbar extends Dialog {
// Menü-Container: Ein Nested-Container für Handeln, Grundstücke und Zug beenden // Menü-Container: Ein Nested-Container für Handeln, Grundstücke und Zug beenden
Container menuContainer = toolbarContainer.addChild(new Container()); Container menuContainer = toolbarContainer.addChild(new Container());
menuContainer.addChild(addTradeMenuButton()); menuContainer.addChild(new Button("Handeln"));
menuContainer.addChild(addPropertyMenuButton()); menuContainer.addChild(new Button("Grundstücke"));
menuContainer.addChild(addEndTurnButton()); menuContainer.addChild(new Button("Zug beenden"));
menuContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f))); menuContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.4657f, 0.4735f, 0.4892f, 1.0f)));
// Füge die Toolbar zur GUI hinzu // Füge die Toolbar zur GUI hinzu
@@ -154,35 +155,107 @@ public class Toolbar extends Dialog {
updatePositionDisplay(); // Initialisiere die Anzeige mit der Startposition updatePositionDisplay(); // Initialisiere die Anzeige mit der Startposition
} }
private Button addTradeMenuButton() { /**
Button tradebutton = new Button("Handeln"); * Initialisiert die Buttons in der Toolbar.
tradebutton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons */
tradebutton.addClickCommands(s -> ifTopDialog( () -> { private void initializeButtons() {
addTradeMenuButton(); // Bewegung nach vorne
addEndTurnButton(); // Bewegung nach hinten
addDiceRollButton(); // Würfel-Button
}
/**
* Fügt einen Button mit einer Bewegung hinzu.
*
* @param label Der Text des Buttons
* @param step Schrittweite (+1 für vorwärts, -1 für rückwärts)
*/
/*private void addButton(String label, int step) {
Button button = new Button(label);
button.setPreferredSize(new Vector3f(150, 50, 0)); // Größe der Buttons
button.addClickCommands(source -> moveCube(step));
toolbarContainer.addChild(button);
}*/
/**
* Fügt den Würfel-Button hinzu, der die Figur entsprechend der gewürfelten Zahl bewegt.
*/
private Button addDiceRollButton() {
Button diceButton = new Button("Würfeln");
diceButton.setPreferredSize(new Vector3f(50, 20, 0));
diceButton.addClickCommands(s -> ifTopDialog(() -> {
rollDice();
app.getGameLogic().playSound(Sound.BUTTON);
}));
toolbarContainer.addChild(diceButton);
return diceButton;
}
private void addTradeMenuButton() {
Button diceButton = new Button("Handeln");
diceButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons
diceButton.addClickCommands(s -> {
rollDice();
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
this.close(); this.close();
System.out.println("test");
new ChoosePartner(app).open(); new ChoosePartner(app).open();
});
toolbarContainer.addChild(diceButton);
}// TODO Funktion der Buttons Überarbeiten und prüfen
private void addEndTurnButton() {
Button diceButton = new Button("Grundstücke");
diceButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons
diceButton.addClickCommands(s -> ifTopDialog(() -> {
rollDice();
app.getGameLogic().playSound(Sound.BUTTON);
})); }));
return tradebutton; toolbarContainer.addChild(diceButton);
} }
private Button addEndTurnButton() { private void addPropertyMenuButton() {
Button endTurnButton = new Button("Grundstücke"); Button diceButton = new Button("Zug beenden");
endTurnButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons diceButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons
endTurnButton.addClickCommands(s -> ifTopDialog(() -> { diceButton.addClickCommands(s -> ifTopDialog(() -> {
rollDice();
app.getGameLogic().playSound(Sound.BUTTON); app.getGameLogic().playSound(Sound.BUTTON);
//TODO open property dialog
})); }));
return endTurnButton; toolbarContainer.addChild(diceButton);
} }
private Button addPropertyMenuButton() { /**
Button propertyMenuButton = new Button("Zug beenden"); * Simuliert einen Würfelwurf und bewegt die Figur entsprechend.
propertyMenuButton.setPreferredSize(new Vector3f(150, 50, 0)); // Größe des Buttons */
propertyMenuButton.addClickCommands(s -> ifTopDialog(() -> { private void rollDice() {
app.getGameLogic().playSound(Sound.BUTTON); int diceRoll = random.nextInt(6) + 1; // Zahl zwischen 1 und 6
//TODO send end turn System.out.println("Gewürfelt: " + diceRoll);
})); }
return propertyMenuButton;
/**
* Berechnet die neue Position des Würfels basierend auf der aktuellen Brettseite und Position.
*
* @param position Aktuelle Position auf dem Spielfeld
* @return Die berechnete Position als Vector3f
*/
private Vector3f calculatePosition(int position) {
int side = position / positionsPerSide; // Seite des Bretts (0 = unten, 1 = rechts, 2 = oben, 3 = links)
int offset = position % positionsPerSide; // Position auf der aktuellen Seite
switch (side) {
case 0: // Unten (positive x-Achse)
return new Vector3f(-boardLimit + offset * stepSize, 0.1f, -boardLimit + 0.05f);
case 1: // Rechts (positive z-Achse)
return new Vector3f(boardLimit - 0.05f, 0.1f, -boardLimit + offset * stepSize);
case 2: // Oben (negative x-Achse)
return new Vector3f(boardLimit - offset * stepSize, 0.1f, boardLimit - 0.05f);
case 3: // Links (negative z-Achse)
return new Vector3f(-boardLimit + 0.05f, 0.1f, boardLimit - offset * stepSize);
default:
throw new IllegalArgumentException("Ungültige Position: " + position);
}
} }
/** /**

View File

@@ -15,13 +15,13 @@ import pp.monopoly.client.MonopolyApp;
import pp.monopoly.client.gui.SettingsMenu; import pp.monopoly.client.gui.SettingsMenu;
import pp.monopoly.model.fields.BoardManager; import pp.monopoly.model.fields.BoardManager;
import pp.monopoly.model.fields.BuildingProperty; import pp.monopoly.model.fields.BuildingProperty;
import pp.monopoly.notification.Sound;
/** /**
* SettingsMenu ist ein Overlay-Menü, das durch ESC aufgerufen werden kann. * SettingsMenu ist ein Overlay-Menü, das durch ESC aufgerufen werden kann.
*/ */
public class BuyCard extends Dialog { public class BuyCard extends Dialog {
private final MonopolyApp app; private final MonopolyApp app;
private final Geometry overlayBackground;
private final Container buyCardContainer; private final Container buyCardContainer;
private final Container backgroundContainer; private final Container backgroundContainer;
@@ -34,18 +34,22 @@ public class BuyCard extends Dialog {
//Generate the corresponfing field //Generate the corresponfing field
BuildingProperty field = (BuildingProperty) new BoardManager().getFieldAtIndex(index); BuildingProperty field = (BuildingProperty) new BoardManager().getFieldAtIndex(index);
// Halbtransparentes Overlay hinzufügen
overlayBackground = createOverlayBackground();
app.getGuiNode().attachChild(overlayBackground);
// Create the background container // Create the background container
backgroundContainer = new Container(); backgroundContainer = new Container();
backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background backgroundContainer.setBackground(new QuadBackgroundComponent(new ColorRGBA(0.8657f, 0.8735f, 0.8892f, 1.0f))); // Darker background
attachChild(backgroundContainer); app.getGuiNode().attachChild(backgroundContainer);
// Hauptcontainer für die Gebäudekarte // Hauptcontainer für die Gebäudekarte
buyCardContainer = new Container(); buyCardContainer = new Container();
buyCardContainer.setBackground(new QuadBackgroundComponent(field.getColor().getColor()));
Label title = buyCardContainer.addChild(new Label( field.getName(), new ElementId("label-Bold"))); Label settingsTitle = buyCardContainer.addChild(new Label( field.getName(), new ElementId("settings-title")));
title.setBackground(new QuadBackgroundComponent(field.getColor().getColor())); settingsTitle.setFontSize(48);
title.setFontSize(48);
// Text, der auf der Karte steht // Text, der auf der Karte steht
// Die Preise werden dynamisch dem BoardManager entnommen // Die Preise werden dynamisch dem BoardManager entnommen
@@ -66,17 +70,9 @@ public class BuyCard extends Dialog {
// Beenden-Button // Beenden-Button
Button quitButton = buyCardContainer.addChild(new Button("Beenden", new ElementId("button"))); Button quitButton = buyCardContainer.addChild(new Button("Beenden", new ElementId("button")));
quitButton.setFontSize(32); quitButton.setFontSize(32);
quitButton.addClickCommands(s -> ifTopDialog(() -> {
app.getGameLogic().playSound(Sound.BUTTON);
close();
}));
// Kaufen-Button // Kaufen-Button
Button buyButton = buyCardContainer.addChild(new Button("Kaufen", new ElementId("button"))); Button buyButton = buyCardContainer.addChild(new Button("Kaufen", new ElementId("button")));
buyButton.setFontSize(32); buyButton.setFontSize(32);
buyButton.addClickCommands(s -> ifTopDialog( () -> {
app.getGameLogic().playSound(Sound.BUTTON);
//TODO send buy property request
}));
float padding = 10; // Padding around the settingsContainer for the background float padding = 10; // Padding around the settingsContainer for the background
backgroundContainer.setPreferredSize(buyCardContainer.getPreferredSize().addLocal(padding, padding, 0)); backgroundContainer.setPreferredSize(buyCardContainer.getPreferredSize().addLocal(padding, padding, 0));
@@ -98,6 +94,22 @@ public class BuyCard extends Dialog {
app.getGuiNode().attachChild(buyCardContainer); app.getGuiNode().attachChild(buyCardContainer);
} }
/**
* Erstellt einen halbtransparenten Hintergrund für das Menü.
*
* @return Geometrie des Overlays
*/
private Geometry createOverlayBackground() {
Quad quad = new Quad(app.getCamera().getWidth(), app.getCamera().getHeight());
Geometry overlay = new Geometry("Overlay", quad);
Material material = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
material.setColor("Color", new ColorRGBA(0, 0, 0, 0.5f)); // Halbtransparent
material.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
overlay.setMaterial(material);
overlay.setLocalTranslation(0, 0, 0);
return overlay;
}
/** /**
* Schließt das Menü und entfernt die GUI-Elemente. * Schließt das Menü und entfernt die GUI-Elemente.
*/ */
@@ -105,6 +117,7 @@ public class BuyCard extends Dialog {
public void close() { public void close() {
app.getGuiNode().detachChild(buyCardContainer); // Entferne das Menü app.getGuiNode().detachChild(buyCardContainer); // Entferne das Menü
app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand app.getGuiNode().detachChild(backgroundContainer); //Entfernt Rand
app.getGuiNode().detachChild(overlayBackground); // Entferne das Overlay
super.close(); super.close();
} }

View File

@@ -34,13 +34,13 @@ public class MonopolyConfig extends Config {
* The width of the game map in terms of grid units. * The width of the game map in terms of grid units.
*/ */
@Property("map.width") @Property("map.width")
private int mapWidth = 10; private int mapWidth = 12;
/** /**
* The height of the game map in terms of grid units. * The height of the game map in terms of grid units.
*/ */
@Property("map.height") @Property("map.height")
private int mapHeight = 10; private int mapHeight = 12;
/** /**
* Creates an instance of {@code MonopolyConfig} with default settings. * Creates an instance of {@code MonopolyConfig} with default settings.

View File

@@ -199,10 +199,10 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
@Override @Override
public void received(BuyPropertyResponse msg) { public void received(BuyPropertyResponse msg) {
if (msg.isSuccessful()) { if (msg.isSuccessful()) {
setInfoText("You successfully bought " + msg.getPropertyName() + "!");
playSound(Sound.MONEY_LOST); playSound(Sound.MONEY_LOST);
} else { } else {
setInfoText("Unable to buy " + msg.getPropertyName() + ". Reason: " + msg.getReason());
} }
} }
@@ -213,7 +213,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(DiceResult msg) { public void received(DiceResult msg) {
setInfoText("You rolled a " + msg.calcTotal() + "!");
//Set the dice images //Set the dice images
playSound(Sound.DICE_ROLL); playSound(Sound.DICE_ROLL);
} }
@@ -225,7 +225,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(EventDrawCard msg) { public void received(EventDrawCard msg) {
setInfoText("Event card drawn: " + msg.getCardDescription());
// Kartenlogik // Kartenlogik
playSound(Sound.EVENT_CARD); playSound(Sound.EVENT_CARD);
} }
@@ -238,11 +238,11 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
@Override @Override
public void received(GameOver msg) { public void received(GameOver msg) {
if (msg.isWinner()) { if (msg.isWinner()) {
setInfoText("Congratulations! You have won the game!");
//Winner popup //Winner popup
playSound(Sound.WINNER); playSound(Sound.WINNER);
} else { } else {
setInfoText("Game over. Better luck next time!");
// Looser popup // Looser popup
playSound(Sound.LOSER); playSound(Sound.LOSER);
} }
@@ -256,8 +256,8 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
@Override @Override
public void received(GameStart msg) { public void received(GameStart msg) {
players = msg.getPlayers(); players = msg.getPlayers();
setInfoText("The game has started! Good luck!");
setState(new WaitForTurnState(this)); setState(new WaitForTurnState(this));
} }
/** /**
@@ -268,10 +268,10 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
@Override @Override
public void received(JailEvent msg) { public void received(JailEvent msg) {
if (msg.isGoingToJail()) { if (msg.isGoingToJail()) {
setInfoText("You are sent to jail!");
playSound(Sound.GULAG); playSound(Sound.GULAG);
} else { } else {
setInfoText("You are out of jail!");
} }
} }
@@ -283,7 +283,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
@Override @Override
public void received(PlayerStatusUpdate msg) { public void received(PlayerStatusUpdate msg) {
setInfoText("Player " + msg.getPlayerName() + " status updated: " + msg.getStatus());
} }
/** /**
@@ -293,7 +293,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(TimeOutWarning msg) { public void received(TimeOutWarning msg) {
setInfoText("Warning! Time is running out. You have " + msg.getRemainingTime() + " seconds left.");
} }
/** /**
@@ -303,7 +303,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(ViewAssetsResponse msg) { public void received(ViewAssetsResponse msg) {
setInfoText("Your current assets are being displayed.");
} }
/** /**
@@ -314,10 +314,10 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
@Override @Override
public void received(TradeReply msg) { public void received(TradeReply msg) {
if (msg.getTradeHandler().getStatus()) { if (msg.getTradeHandler().getStatus()) {
setInfoText("Trade accepted by " + msg.getTradeHandler().getReceiver().getName() + ".");
playSound(Sound.TRADE_ACCEPTED); playSound(Sound.TRADE_ACCEPTED);
} else { } else {
setInfoText("Trade rejected by " + msg.getTradeHandler().getReceiver().getName() + ".");
playSound(Sound.TRADE_REJECTED); playSound(Sound.TRADE_REJECTED);
} }
} }
@@ -329,7 +329,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(TradeRequest msg) { public void received(TradeRequest msg) {
setInfoText("Trade offer received from " + msg.getTradeHandler().getSender().getName());
// playSound(Sound.TRADE_REQUEST); no sound effect // playSound(Sound.TRADE_REQUEST); no sound effect
// notifyListeners(); // notifyListeners();
} }
@@ -341,8 +341,7 @@ public class ClientGameLogic implements ServerInterpreter, GameEventBroker {
*/ */
@Override @Override
public void received(NextPlayerTurn msg) { public void received(NextPlayerTurn msg) {
setInfoText("It's your turn!");
System.out.println("Du bsit am zug message empfangen");
setState(new ActiveState(this)); setState(new ActiveState(this));
} }
} }

View File

@@ -175,7 +175,7 @@ public class ServerGameLogic implements ClientInterpreter {
LOGGER.log(Level.DEBUG, "Ending turn for player {0}", player.getName()); LOGGER.log(Level.DEBUG, "Ending turn for player {0}", player.getName());
Player next = playerHandler.nextPlayer(); Player next = playerHandler.nextPlayer();
next.setActive(); next.setActive();
send(next, new NextPlayerTurn()); send(next, new NextPlayerTurn(next));
} }
} }
} }
@@ -207,7 +207,7 @@ public class ServerGameLogic implements ClientInterpreter {
send(p, new GameStart(playerHandler.getPlayers())); send(p, new GameStart(playerHandler.getPlayers()));
} }
playerHandler.randomOrder(); playerHandler.randomOrder();
send(playerHandler.getPlayerAtIndex(0), new NextPlayerTurn()); send(playerHandler.getPlayerAtIndex(0), new NextPlayerTurn(playerHandler.getPlayerAtIndex(0)));
} }
} }

View File

@@ -2,13 +2,20 @@ package pp.monopoly.message.server;
import com.jme3.network.serializing.Serializable; import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player;
@Serializable @Serializable
public class NextPlayerTurn extends ServerMessage{ public class NextPlayerTurn extends ServerMessage{
private Player player;
/** /**
* Default constructor for serialization purposes. * Default constructor for serialization purposes.
*/ */
public NextPlayerTurn() { private NextPlayerTurn() { /* empty */ }
public NextPlayerTurn(Player player) {
this.player = player;
} }
@Override @Override
@@ -21,4 +28,9 @@ public class NextPlayerTurn extends ServerMessage{
// TODO Auto-generated method stub // TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'getInfoTextKey'"); throw new UnsupportedOperationException("Unimplemented method 'getInfoTextKey'");
} }
public Player getPlayer() {
return player;
}
} }

View File

@@ -3,11 +3,8 @@ package pp.monopoly.model.fields;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class BuildingProperty extends PropertyField { public class BuildingProperty extends PropertyField {
private int houses; private int houses;
@@ -20,12 +17,6 @@ public class BuildingProperty extends PropertyField {
private final int rentFactor4 = 55; private final int rentFactor4 = 55;
private final int rentFactorHotel = 70; private final int rentFactorHotel = 70;
private BuildingProperty(){
super("", 0, 0, 0);
this.housePrice = 0;
this.color = null;
}
BuildingProperty(String name, int id, int price, int rent, int housePrice, FieldColor color) { BuildingProperty(String name, int id, int price, int rent, int housePrice, FieldColor color) {
super(name, id, price, rent); super(name, id, price, rent);
this.housePrice = housePrice; this.housePrice = housePrice;

View File

@@ -1,18 +1,11 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class EventField extends Field{ public class EventField extends Field{
private EventField() { public EventField(String name, int id) {
super("", 0);
}
EventField(String name, int id) {
super(name, id); super(name, id);
} }

View File

@@ -1,19 +1,11 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable abstract class Field {
public abstract class Field {
protected final String name; protected final String name;
protected final int id; protected final int id;
private Field() {
this.name = "";
this.id = 0;
}
protected Field(String name, int id) { protected Field(String name, int id) {
this.name = name; this.name = name;
this.id= id; this.id= id;

View File

@@ -1,12 +1,10 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.network.serializing.Serializable;
/** /**
* Enum representing eight distinct colors for properties in the game. * Enum representing eight distinct colors for properties in the game.
*/ */
// @Serializable
public enum FieldColor { public enum FieldColor {
BROWN(new ColorRGBA(148 / 255f, 86 / 255f, 57 / 255f, 1)), BROWN(new ColorRGBA(148 / 255f, 86 / 255f, 57 / 255f, 1)),
GREEN(new ColorRGBA(30 / 255f, 179 / 255f, 90 / 255f, 1)), GREEN(new ColorRGBA(30 / 255f, 179 / 255f, 90 / 255f, 1)),
@@ -19,10 +17,6 @@ public enum FieldColor {
private final ColorRGBA color; private final ColorRGBA color;
private FieldColor() {
this.color = null;
}
/** /**
* Constructs a FieldColor with the specified ColorRGBA value. * Constructs a FieldColor with the specified ColorRGBA value.
* *

View File

@@ -1,19 +1,11 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class FineField extends Field{ public class FineField extends Field{
private final int fine; private final int fine;
private FineField() {
super("", 0);
this.fine = 0;
}
FineField(String name, int id, int fine) { FineField(String name, int id, int fine) {
super(name, id); super(name, id);
this.fine = fine; this.fine = fine;

View File

@@ -1,17 +1,10 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class FoodField extends PropertyField { public class FoodField extends PropertyField {
private FoodField() { public FoodField(String name, int id) {
super("", 0, 0, 0);
}
FoodField(String name, int id) {
super(name, id, 1500,0); super(name, id, 1500,0);
} }

View File

@@ -1,14 +1,8 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class GateField extends PropertyField{
private GateField() { public class GateField extends PropertyField{
super("", 0, 0, 0);
}
GateField(String name, int id) { GateField(String name, int id) {
super(name, id, 2000, 25); super(name, id, 2000, 25);

View File

@@ -1,12 +1,10 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class GoField extends Field{ public class GoField extends Field{
GoField() { public GoField() {
super("Monatsgehalt", 0); super("Monatsgehalt", 0);
} }

View File

@@ -1,9 +1,7 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class GulagField extends Field{ public class GulagField extends Field{
private int bailCost = 500; private int bailCost = 500;

View File

@@ -1,14 +1,11 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
/** /**
* Represents an abstract property field in the Monopoly game. * Represents an abstract property field in the Monopoly game.
* Contains attributes related to ownership, price, rent, and mortgage status. * Contains attributes related to ownership, price, rent, and mortgage status.
*/ */
@Serializable
public abstract class PropertyField extends Field { public abstract class PropertyField extends Field {
private final int price; private final int price;
@@ -16,12 +13,6 @@ public abstract class PropertyField extends Field {
private Player owner; private Player owner;
private boolean mortgaged = false; private boolean mortgaged = false;
private PropertyField() {
super("", 0);
this.price = 0;
this.rent = 0;
}
/** /**
* Constructs a PropertyField with the specified name, ID, price, and rent. * Constructs a PropertyField with the specified name, ID, price, and rent.
* *

View File

@@ -1,10 +1,7 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class TestStreckeField extends Field{ public class TestStreckeField extends Field{
private int money; private int money;

View File

@@ -1,13 +1,10 @@
package pp.monopoly.model.fields; package pp.monopoly.model.fields;
import com.jme3.network.serializing.Serializable;
import pp.monopoly.game.server.Player; import pp.monopoly.game.server.Player;
@Serializable
public class WacheField extends Field{ public class WacheField extends Field{
WacheField() { public WacheField() {
super("Wache", 30); super("Wache", 30);
} }

View File

@@ -1,26 +1,25 @@
////////////////////////////////////////
// Programming project code
// UniBw M, 2022, 2023, 2024
// www.unibw.de/inf2
// (c) Mark Minas (mark.minas@unibw.de)
////////////////////////////////////////
package pp.monopoly.notification; package pp.monopoly.notification;
/** /**
* Event when an item is added to a map. * Event when a sound needs to be played.
* *
* @param sound the sound to be played * @param soundFileName the sound file to be played
*/ */
public record SoundEvent(Sound sound) implements GameEvent { public class SoundEvent implements GameEvent {
private final String soundFileName;
public SoundEvent(Sound sound) {
this.soundFileName = sound.getFileName(); // Angenommen, Sound hat eine Methode getFileName()
}
public String getSoundFileName() {
return soundFileName;
}
/**
* Notifies the game event listener of this event.
*
* @param listener the game event listener
*/
@Override @Override
public void notifyListener(GameEventListener listener) { public void notifyListener(GameEventListener listener) {
listener.receivedEvent(this); listener.receivedEvent(this);
} }
} }

View File

@@ -43,18 +43,6 @@ import pp.monopoly.message.server.ServerMessage;
import pp.monopoly.model.Figure; import pp.monopoly.model.Figure;
import pp.monopoly.model.IntPoint; import pp.monopoly.model.IntPoint;
import pp.monopoly.model.LimitedLinkedList; import pp.monopoly.model.LimitedLinkedList;
import pp.monopoly.model.fields.BuildingProperty;
import pp.monopoly.model.fields.EventField;
import pp.monopoly.model.fields.Field;
import pp.monopoly.model.fields.FieldColor;
import pp.monopoly.model.fields.FineField;
import pp.monopoly.model.fields.FoodField;
import pp.monopoly.model.fields.GateField;
import pp.monopoly.model.fields.GoField;
import pp.monopoly.model.fields.GulagField;
import pp.monopoly.model.fields.PropertyField;
import pp.monopoly.model.fields.TestStreckeField;
import pp.monopoly.model.fields.WacheField;
/** /**
* Server implementing the visitor pattern as MessageReceiver for ClientMessages * Server implementing the visitor pattern as MessageReceiver for ClientMessages
@@ -141,19 +129,7 @@ public class MonopolyServer implements MessageListener<HostedConnection>, Connec
Serializer.registerClass(NextPlayerTurn.class); Serializer.registerClass(NextPlayerTurn.class);
Serializer.registerClass(Player.class); Serializer.registerClass(Player.class);
Serializer.registerClass(Figure.class); Serializer.registerClass(Figure.class);
// Serializer.registerClass(PlayerHandler.class); Serializer.registerClass(PlayerHandler.class);
// Serializer.registerClass(BuildingProperty.class);
// Serializer.registerClass(EventField.class);
// Serializer.registerClass(Field.class);
// // Serializer.registerClass(FieldColor.class);
// Serializer.registerClass(FineField.class);
// Serializer.registerClass(FoodField.class);
// Serializer.registerClass(GateField.class);
// Serializer.registerClass(GoField.class);
// Serializer.registerClass(GulagField.class);
// Serializer.registerClass(PropertyField.class);
// Serializer.registerClass(TestStreckeField.class);
// Serializer.registerClass(WacheField.class);
} }
private void registerListeners() { private void registerListeners() {