mirror of
https://athene2.informatik.unibw-muenchen.de/progproj/gruppen-ht24/Gruppe-02.git
synced 2025-04-12 04:21:08 +02:00
Compare commits
2 Commits
7cbf000c44
...
7b82b20736
Author | SHA1 | Date | |
---|---|---|---|
|
7b82b20736 | ||
|
698937e77c |
@ -3,6 +3,9 @@ package pp.monopoly.client;
|
||||
import com.jme3.app.Application;
|
||||
import com.jme3.app.state.AppStateManager;
|
||||
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.DirectionalLight;
|
||||
import com.jme3.material.Material;
|
||||
@ -203,10 +206,10 @@ public class BoardAppState extends MonopolyAppState {
|
||||
final float x = board.getWidth();
|
||||
final float y = board.getHeight();
|
||||
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));
|
||||
Quaternion rotation = new com.jme3.math.Quaternion();
|
||||
rotation.fromAngleAxis(FastMath.HALF_PI, com.jme3.math.Vector3f.UNIT_Y);
|
||||
Quaternion rotation = new Quaternion();
|
||||
rotation.fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y);
|
||||
seaGeo.setLocalRotation(rotation);
|
||||
final Material seaMat = new Material(getApp().getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");
|
||||
Texture texture = getApp().getAssetManager().loadTexture("Pictures/board2.png");
|
||||
@ -214,8 +217,12 @@ public class BoardAppState extends MonopolyAppState {
|
||||
seaGeo.setMaterial(seaMat);
|
||||
seaGeo.setShadowMode(ShadowMode.CastAndReceive);
|
||||
TangentBinormalGenerator.generate(seaGeo);
|
||||
|
||||
sceneNode.attachChild(createCardDeck());
|
||||
sceneNode.attachChild(seaGeo);
|
||||
|
||||
// Schneefall hinzufügen
|
||||
addSnowEffect(sceneNode);
|
||||
}
|
||||
|
||||
private Node createCardDeck() {
|
||||
@ -237,5 +244,34 @@ public class BoardAppState extends MonopolyAppState {
|
||||
|
||||
public Vector3f getCurrentTarget(){
|
||||
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);
|
||||
}
|
||||
}
|
@ -106,6 +106,26 @@ public class MonopolyAppConfig extends MonopolyClientConfig {
|
||||
@Property("overlay.top.color") //NON-NLS
|
||||
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.
|
||||
*/
|
||||
|
@ -3,6 +3,9 @@ package pp.monopoly.client.gui;
|
||||
import com.jme3.material.Material;
|
||||
import com.jme3.material.RenderState.BlendMode;
|
||||
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.scene.Geometry;
|
||||
import com.jme3.scene.Node;
|
||||
@ -42,8 +45,10 @@ public class BobTheBuilder extends GameBoardSynchronizer {
|
||||
// Setze die Position basierend auf der Feld-ID
|
||||
node.setLocalTranslation(figure.getPos());
|
||||
|
||||
// Setze die Rotation basierend auf der Feld-ID
|
||||
node.setLocalRotation(figure.getRot().toQuaternion());
|
||||
// Setze die Anfangsrotation auf 90 Grad nach links
|
||||
Quaternion initialRotation = new Quaternion().fromAngleAxis(FastMath.HALF_PI, Vector3f.UNIT_Y);
|
||||
node.setLocalRotation(initialRotation);
|
||||
|
||||
node.addControl(new FigureControl(node, figure, app));
|
||||
return node;
|
||||
}
|
||||
@ -81,7 +86,7 @@ public class BobTheBuilder extends GameBoardSynchronizer {
|
||||
private Spatial createFigure(Figure figure) {
|
||||
// Lade das Modell
|
||||
Spatial model = app.getAssetManager().loadModel("models/" + "Spielfiguren/" + figure.getType() + "/" + figure.getType() + ".j3o");
|
||||
|
||||
|
||||
// Skaliere und positioniere das Modell
|
||||
model.scale(0.5f);
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
package pp.monopoly.client.gui;
|
||||
|
||||
import com.jme3.math.FastMath;
|
||||
import com.jme3.math.Quaternion;
|
||||
import com.jme3.math.Vector3f;
|
||||
import com.jme3.renderer.RenderManager;
|
||||
import com.jme3.renderer.ViewPort;
|
||||
@ -50,14 +51,30 @@ public class FigureControl extends AbstractControl implements GameEventListener
|
||||
return; // Warte, bis die Verzögerung abgeschlossen ist
|
||||
}
|
||||
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()) {
|
||||
// Hole das nächste Ziel aus dem Pfad
|
||||
currentTarget = path.poll();
|
||||
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) {
|
||||
@ -71,7 +88,7 @@ public class FigureControl extends AbstractControl implements GameEventListener
|
||||
|
||||
// Hüpfeffekt hinzufügen
|
||||
float hopHeight = 0.5f * FastMath.sin(FastMath.PI * (animationTime / durationPerField));
|
||||
interpolatedPosition.setY(hopHeight + 1);
|
||||
interpolatedPosition.setY(hopHeight );
|
||||
spatial.setLocalTranslation(interpolatedPosition);
|
||||
|
||||
// Ziel erreicht
|
||||
@ -80,17 +97,15 @@ public class FigureControl extends AbstractControl implements GameEventListener
|
||||
figure.moveTo(currentTarget); // Synchronisiere die interne Position
|
||||
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 = figure.getCurrentFieldID();
|
||||
return (currentField + 1) % 40; // Weiter zum nächsten Feld
|
||||
private int nextField(int currentField) {
|
||||
return (currentField + 1) % 40;
|
||||
}
|
||||
|
||||
|
||||
|
@ -65,7 +65,7 @@ public class StartMenu extends Dialog {
|
||||
app.getGuiNode().attachChild(centerMenu);
|
||||
|
||||
// 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
|
||||
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 |
Loading…
Reference in New Issue
Block a user