Compare commits

..

2 Commits

Author SHA1 Message Date
Luca Puderbach
7b82b20736 HoHoHo 2024-12-09 20:22:17 +01:00
Luca Puderbach
698937e77c Bayblade Mode activated 2024-12-09 19:53:47 +01:00
7 changed files with 92 additions and 16 deletions

View File

@ -3,6 +3,9 @@ package pp.monopoly.client;
import com.jme3.app.Application; import com.jme3.app.Application;
import com.jme3.app.state.AppStateManager; import com.jme3.app.state.AppStateManager;
import com.jme3.asset.AssetManager; import com.jme3.asset.AssetManager;
import com.jme3.effect.ParticleEmitter;
import com.jme3.effect.ParticleMesh;
import com.jme3.effect.shapes.EmitterSphereShape;
import com.jme3.light.AmbientLight; import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight; import com.jme3.light.DirectionalLight;
import com.jme3.material.Material; import com.jme3.material.Material;
@ -203,10 +206,10 @@ public class BoardAppState extends MonopolyAppState {
final float x = board.getWidth(); final float x = board.getWidth();
final float y = board.getHeight(); final float y = board.getHeight();
final Box seaMesh = new Box(y, 0.1f, x); final Box seaMesh = new Box(y, 0.1f, x);
final Geometry seaGeo = new Geometry("sea", seaMesh); //NONs-NLS final Geometry seaGeo = new Geometry("sea", seaMesh); //NON-NLS
seaGeo.setLocalTranslation(new Vector3f(0, -0.1f, 0)); seaGeo.setLocalTranslation(new Vector3f(0, -0.1f, 0));
Quaternion rotation = new com.jme3.math.Quaternion(); Quaternion rotation = new Quaternion();
rotation.fromAngleAxis(FastMath.HALF_PI, com.jme3.math.Vector3f.UNIT_Y); rotation.fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y);
seaGeo.setLocalRotation(rotation); seaGeo.setLocalRotation(rotation);
final Material seaMat = new Material(getApp().getAssetManager(), "Common/MatDefs/Light/Lighting.j3md"); final Material seaMat = new Material(getApp().getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");
Texture texture = getApp().getAssetManager().loadTexture("Pictures/board2.png"); Texture texture = getApp().getAssetManager().loadTexture("Pictures/board2.png");
@ -214,8 +217,12 @@ public class BoardAppState extends MonopolyAppState {
seaGeo.setMaterial(seaMat); seaGeo.setMaterial(seaMat);
seaGeo.setShadowMode(ShadowMode.CastAndReceive); seaGeo.setShadowMode(ShadowMode.CastAndReceive);
TangentBinormalGenerator.generate(seaGeo); TangentBinormalGenerator.generate(seaGeo);
sceneNode.attachChild(createCardDeck()); sceneNode.attachChild(createCardDeck());
sceneNode.attachChild(seaGeo); sceneNode.attachChild(seaGeo);
// Schneefall hinzufügen
addSnowEffect(sceneNode);
} }
private Node createCardDeck() { private Node createCardDeck() {
@ -237,5 +244,34 @@ public class BoardAppState extends MonopolyAppState {
public Vector3f getCurrentTarget(){ public Vector3f getCurrentTarget(){
return currentTarget; return currentTarget;
} }
private void addSnowEffect(Node parentNode) {
// ParticleEmitter für Schnee
ParticleEmitter snowEmitter = new ParticleEmitter("Snow", ParticleMesh.Type.Triangle, 5000);
Material snowMat = new Material(getApp().getAssetManager(), "Common/MatDefs/Misc/Particle.j3md");
snowMat.setTexture("Texture", getApp().getAssetManager().loadTexture("Textures/snowflake.png")); // Schneeflocken-Textur
snowEmitter.setMaterial(snowMat);
// Eigenschaften für Schneepartikel
snowEmitter.setImagesX(1);
snowEmitter.setImagesY(1);
snowEmitter.setEndColor(new ColorRGBA(1f, 1f, 1f, 0.5f)); // Weiß, halbtransparent
snowEmitter.setStartColor(new ColorRGBA(1f, 1f, 1f, 1f)); // Vollweiß
snowEmitter.setStartSize(0.1f);
snowEmitter.setEndSize(0.2f);
snowEmitter.setGravity(0, 0.5f, 0); // Langsames Fallen
snowEmitter.setLowLife(3f);
snowEmitter.setHighLife(15f);
snowEmitter.getParticleInfluencer().setInitialVelocity(new Vector3f(0, -1, 0));
snowEmitter.getParticleInfluencer().setVelocityVariation(0.3f);
// Spawn-Bereich für Schneeflocken definieren
snowEmitter.setParticlesPerSec(200);
snowEmitter.setLocalTranslation(0, 10, 0);
snowEmitter.setShape(new EmitterSphereShape(new Vector3f(0, 0, 0), 15)); // Bereich von -15 bis 15
// Emitter zur Szene hinzufügen
parentNode.attachChild(snowEmitter);
}
} }

View File

@ -106,6 +106,26 @@ public class MonopolyAppConfig extends MonopolyClientConfig {
@Property("overlay.top.color") //NON-NLS @Property("overlay.top.color") //NON-NLS
private ColorRGBA topColor = ColorRGBA.White; private ColorRGBA topColor = ColorRGBA.White;
private ColorRGBA applyGammaCorrection(ColorRGBA color) {
return new ColorRGBA(
correctGamma(color.r),
correctGamma(color.g),
correctGamma(color.b),
color.a // Alpha bleibt unverändert
);
}
private float correctGamma(float channel) {
// Formel: ((RGB / 255)^2.2) * 255
float normalized = channel / 255.0f; // RGB normalisieren (0-1)
float gammaCorrected = (float) Math.pow(normalized, 2.2); // ^2.2
return gammaCorrected * 255.0f; // Zurückskalieren auf 0-255
}
private float correctGamma(float channel, float gamma) {
return (float) Math.pow(channel, gamma);
}
/** /**
* Creates a default {@code MonopolyAppConfig} with predefined values. * Creates a default {@code MonopolyAppConfig} with predefined values.
*/ */

View File

@ -3,6 +3,9 @@ package pp.monopoly.client.gui;
import com.jme3.material.Material; import com.jme3.material.Material;
import com.jme3.material.RenderState.BlendMode; import com.jme3.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA; import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.renderer.queue.RenderQueue.ShadowMode; import com.jme3.renderer.queue.RenderQueue.ShadowMode;
import com.jme3.scene.Geometry; import com.jme3.scene.Geometry;
import com.jme3.scene.Node; import com.jme3.scene.Node;
@ -42,8 +45,10 @@ public class BobTheBuilder extends GameBoardSynchronizer {
// Setze die Position basierend auf der Feld-ID // Setze die Position basierend auf der Feld-ID
node.setLocalTranslation(figure.getPos()); node.setLocalTranslation(figure.getPos());
// Setze die Rotation basierend auf der Feld-ID // Setze die Anfangsrotation auf 90 Grad nach links
node.setLocalRotation(figure.getRot().toQuaternion()); Quaternion initialRotation = new Quaternion().fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y);
node.setLocalRotation(initialRotation);
node.addControl(new FigureControl(node, figure, app)); node.addControl(new FigureControl(node, figure, app));
return node; return node;
} }

View File

@ -1,6 +1,7 @@
package pp.monopoly.client.gui; package pp.monopoly.client.gui;
import com.jme3.math.FastMath; import com.jme3.math.FastMath;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.renderer.RenderManager; import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort; import com.jme3.renderer.ViewPort;
@ -50,14 +51,30 @@ public class FigureControl extends AbstractControl implements GameEventListener
return; // Warte, bis die Verzögerung abgeschlossen ist return; // Warte, bis die Verzögerung abgeschlossen ist
} }
delayTime = 0; // Verzögerung abgeschlossen delayTime = 0; // Verzögerung abgeschlossen
LOGGER.log(Level.DEBUG, "Delay completed. Starting animation..."); System.out.println("Delay completed. Starting animation...");
} }
if (currentTarget == null && !path.isEmpty()) { if (currentTarget == null && !path.isEmpty()) {
// Hole das nächste Ziel aus dem Pfad // Hole das nächste Ziel aus dem Pfad
currentTarget = path.poll(); currentTarget = path.poll();
animationTime = 0f; animationTime = 0f;
LOGGER.log(Level.DEBUG, "Next target: {0}", currentTarget);
// Prüfe, ob eine Drehung erforderlich ist (Felder 0, 10, 20, 30)
int currentField = figure.getCurrentFieldID();
int nextField = nextField(currentField);
if ((nextField(currentField) == 10) ||
(nextField(currentField) == 20) ||
(nextField(currentField) == 30) ||
(nextField(currentField) == 0)) {
Quaternion rotation = spatial.getLocalRotation();
Quaternion turnRight = new Quaternion().fromAngleAxis(-FastMath.HALF_PI, Vector3f.UNIT_Y);
spatial.setLocalRotation(rotation.mult(turnRight));
}
System.out.println("Next target: " + currentTarget);
} }
if (currentTarget != null) { if (currentTarget != null) {
@ -71,7 +88,7 @@ public class FigureControl extends AbstractControl implements GameEventListener
// Hüpfeffekt hinzufügen // Hüpfeffekt hinzufügen
float hopHeight = 0.5f * FastMath.sin(FastMath.PI * (animationTime / durationPerField)); float hopHeight = 0.5f * FastMath.sin(FastMath.PI * (animationTime / durationPerField));
interpolatedPosition.setY(hopHeight + 1); interpolatedPosition.setY(hopHeight );
spatial.setLocalTranslation(interpolatedPosition); spatial.setLocalTranslation(interpolatedPosition);
// Ziel erreicht // Ziel erreicht
@ -80,17 +97,15 @@ public class FigureControl extends AbstractControl implements GameEventListener
figure.moveTo(currentTarget); // Synchronisiere die interne Position figure.moveTo(currentTarget); // Synchronisiere die interne Position
currentTarget = null; // Setze Ziel zurück currentTarget = null; // Setze Ziel zurück
LOGGER.log(Level.DEBUG, "Target reached. Remaining path: {0}", path.size()); System.out.println("Target reached.");
} }
} }
} }
// Beispiel: Berechnung des nächsten Feldes private int nextField(int currentField) {
private int nextField() { return (currentField + 1) % 40;
int currentField = figure.getCurrentFieldID();
return (currentField + 1) % 40; // Weiter zum nächsten Feld
} }

View File

@ -65,7 +65,7 @@ public class StartMenu extends Dialog {
app.getGuiNode().attachChild(centerMenu); app.getGuiNode().attachChild(centerMenu);
// Load the Monopoly logo as a texture // Load the Monopoly logo as a texture
Texture logoTexture = app.getAssetManager().loadTexture("Pictures/logo-monopoly.png"); Texture logoTexture = app.getAssetManager().loadTexture("Pictures/logo-monopolyw.png");
// Create a container for the logo // Create a container for the logo
Container logoContainer = new Container(); Container logoContainer = new Container();

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB