Development #37

Merged
j23f0779 merged 20 commits from development into dev/server_h 2024-12-07 15:36:25 +01:00
8 changed files with 157 additions and 11 deletions
Showing only changes of commit 2ac2de645b - Show all commits

View File

@@ -158,7 +158,9 @@ else if(boardSelect != null) {
gameView.getBoardHandler().movePieceStartAnim(p,0); gameView.getBoardHandler().movePieceStartAnim(p,0);
gameView.getBoardHandler().movePieceAnim(p,0, 8); gameView.getBoardHandler().movePieceAnim(p,0, 8);
} else { } else {
gameView.getBoardHandler().throwBombAnim(p); // gameView.getBoardHandler().throwBombAnim(p);
gameView.getBoardHandler().throwPiece(p,Color.CYBER);
//gameView.getBoardHandler().movePieceStartAnim(p,0); //gameView.getBoardHandler().movePieceStartAnim(p,0);
} }

View File

@@ -29,6 +29,7 @@ public class JetAnimation {
private final float animationDuration; // Dauer der Animation private final float animationDuration; // Dauer der Animation
private Explosion explosion; private Explosion explosion;
private final UUID id; private final UUID id;
private Runnable actionAfter;
/** /**
* Konstruktor für die ThrowAnimation-Klasse. * Konstruktor für die ThrowAnimation-Klasse.
@@ -40,7 +41,7 @@ public class JetAnimation {
* @param curveHeight Die maximale Höhe der Flugkurve * @param curveHeight Die maximale Höhe der Flugkurve
* @param animationDuration Die Gesamtdauer der Animation in Sekunden * @param animationDuration Die Gesamtdauer der Animation in Sekunden
*/ */
public JetAnimation(MdgaApp app, Node rootNode, UUID uuid, Vector3f targetPoint, float curveHeight, float animationDuration) { public JetAnimation(MdgaApp app, Node rootNode, UUID uuid, Vector3f targetPoint, float curveHeight, float animationDuration, Runnable actionAfter) {
Vector3f spawnPoint = targetPoint.add(170, 50, 50); Vector3f spawnPoint = targetPoint.add(170, 50, 50);
Vector3f controlPoint = targetPoint.add(new Vector3f(0, 0, -45)); Vector3f controlPoint = targetPoint.add(new Vector3f(0, 0, -45));
@@ -58,6 +59,7 @@ public JetAnimation(MdgaApp app, Node rootNode, UUID uuid, Vector3f targetPoint,
id = uuid; id = uuid;
explosion = new Explosion(app, rootNode, nodePoint); explosion = new Explosion(app, rootNode, nodePoint);
this.actionAfter = actionAfter;
} }
/** /**
@@ -120,10 +122,7 @@ protected void controlUpdate(float tpf) {
} }
if (elapsedTime > 6.0f) { if (elapsedTime > 6.0f) {
GameView gameView = (GameView) app.getView(); endAnim();
BoardHandler boardHandler = gameView.getBoardHandler();
boardHandler.throwPieceAnim(id);
} }
} }
@@ -134,6 +133,10 @@ protected void controlRender(RenderManager rm, ViewPort vp) {
}); });
} }
private void endAnim(){
actionAfter.run();
}
/** /**
* Repräsentiert eine 3D-Bezier-Kurve mit vier Kontrollpunkten. * Repräsentiert eine 3D-Bezier-Kurve mit vier Kontrollpunkten.
*/ */

View File

@@ -0,0 +1,98 @@
package pp.mdga.client.animation;
import com.jme3.effect.ParticleEmitter;
import com.jme3.effect.ParticleMesh.Type;
import com.jme3.material.Material;
import com.jme3.material.RenderState;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import pp.mdga.client.InitControl;
import pp.mdga.client.MdgaApp;
import pp.mdga.client.acoustic.MdgaSound;
import java.util.Random;
import java.util.Vector;
public class MatrixAnimation extends InitControl {
private MdgaApp app;
private static final Random RANDOM = new Random();
public MatrixAnimation(MdgaApp app){
this.app = app;
}
@Override
protected void initSpatial() {
for(int i = 0; i < 5; i++){
particleStream(
generateMatrixColor(),
generateMatrixColor(),
getRandomFloat(0,1f),
getRandomPosition(),
getRandomFloat(1,2)
);
}
}
@Override
protected void controlUpdate(float tpf) {
}
private void particleStream(ColorRGBA start, ColorRGBA end, float speedVar, Vector3f pos, float spawnVar){
Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Particle.j3md");
mat.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha);
mat.setTexture("Texture", app.getAssetManager().loadTexture("Images/particle/particle_cir.png"));
ParticleEmitter matrix = new ParticleEmitter("Effect", Type.Triangle, 50);
matrix.setMaterial(mat);
matrix.setImagesX(2); // columns
matrix.setImagesY(1); // rows
matrix.setSelectRandomImage(true);
matrix.setStartColor(start);
matrix.setEndColor(end);
matrix.getParticleInfluencer().setInitialVelocity(new Vector3f(0f, 0f, -4f - speedVar));
matrix.getParticleInfluencer().setVelocityVariation(0f);
matrix.setStartSize(0.4f);
matrix.setEndSize(0.6f);
matrix.setGravity(0, 0, 0f);
matrix.setLowLife(3f);
matrix.setHighLife(3f);
matrix.setLocalTranslation(pos.add(new Vector3f(0,0,15)));
matrix.setParticlesPerSec(spawnVar);
app.getRootNode().attachChild(matrix);
}
public static Vector3f getRandomPosition() {
// Generate a random angle in radians (0 to )
float angle = (float) (2 * Math.PI * RANDOM.nextDouble());
// Generate a random radius with uniform distribution
float radius = (float) Math.sqrt(RANDOM.nextDouble());
radius *= 1f;
// Convert polar coordinates to Cartesian
float x = radius * (float) Math.cos(angle);
float y = radius * (float) Math.sin(angle);
return new Vector3f(x,y,0);
}
public static float getRandomFloat(float start, float end) {
if (start > end) {
throw new IllegalArgumentException("Start must be less than or equal to end.");
}
return start + RANDOM.nextFloat() * (end - start);
}
public static ColorRGBA generateMatrixColor() {
// Red is dominant
float red = 0.8f + RANDOM.nextFloat() * 0.2f; // Red channel: 0.8 to 1.0
// Green is moderately high
float green = 0.4f + RANDOM.nextFloat() * 0.3f; // Green channel: 0.4 to 0.7
// Blue is minimal
float blue = RANDOM.nextFloat() * 0.2f; // Blue channel: 0.0 to 0.2
float alpha = 1.0f; // Fully opaque
return new ColorRGBA(red, green, blue, alpha);
}
}

View File

@@ -1,6 +1,8 @@
package pp.mdga.client.board; package pp.mdga.client.board;
import com.jme3.material.Material; import com.jme3.material.Material;
import com.jme3.material.RenderState.BlendMode;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f; import com.jme3.math.Vector3f;
import com.jme3.post.FilterPostProcessor; import com.jme3.post.FilterPostProcessor;
import com.jme3.renderer.queue.RenderQueue; import com.jme3.renderer.queue.RenderQueue;
@@ -10,6 +12,7 @@
import pp.mdga.client.Asset; import pp.mdga.client.Asset;
import pp.mdga.client.MdgaApp; import pp.mdga.client.MdgaApp;
import pp.mdga.client.acoustic.MdgaSound; import pp.mdga.client.acoustic.MdgaSound;
import pp.mdga.client.animation.MatrixAnimation;
import pp.mdga.client.animation.MoveControl; import pp.mdga.client.animation.MoveControl;
import pp.mdga.client.animation.JetAnimation; import pp.mdga.client.animation.JetAnimation;
import pp.mdga.client.gui.DiceControl; import pp.mdga.client.gui.DiceControl;
@@ -188,6 +191,9 @@ private Spatial createModel(Asset asset, Vector3f pos, float rot) {
model.setShadowMode(RenderQueue.ShadowMode.CastAndReceive); model.setShadowMode(RenderQueue.ShadowMode.CastAndReceive);
Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md"); Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md");
mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(texName)); mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(texName));
mat.setColor("Diffuse", new ColorRGBA(1.0f, 1.0f, 1.0f, 0.5f)); // Example: set 50% transparency (alpha = 0.5)
mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha); // Enable alpha blending
// mat.getAdditionalRenderState().setDepthWrite(false);
model.setMaterial(mat); model.setMaterial(mat);
rootNodeBoard.attachChild(model); rootNodeBoard.attachChild(model);
@@ -726,18 +732,45 @@ public void throwPieceAnim(UUID uuid){
); );
} }
public void throwPiece(UUID uuid, Color throwColor){
switch(throwColor){
case ARMY -> throwShell(uuid);
case NAVY -> throwMissle(uuid);
case CYBER -> throwMatrix(uuid);
case AIRFORCE -> throwBomb(uuid);
default -> throw new RuntimeException("invalid color");
}
}
/** /**
* Animates the throwing of a piece to the next available waiting node. * Animates the throwing of a piece to the next available waiting node.
* *
* @param uuid the UUID of the piece to animate * @param uuid the UUID of the piece to animate
*/ */
public void throwBombAnim(UUID uuid){ private void throwBomb(UUID uuid) {
Vector3f targetPoint = pieces.get(uuid).getLocation(); Vector3f targetPoint = pieces.get(uuid).getLocation();
JetAnimation anim = new JetAnimation(app, rootNode, uuid, targetPoint, 40, 6); JetAnimation anim = new JetAnimation(app, rootNode, uuid, targetPoint, 40, 6, ()->throwPieceAnim(uuid));
anim.start(); anim.start();
} }
private void throwMatrix(UUID uuid) {
pieces.get(uuid).getSpatial().addControl(new MatrixAnimation(app));
}
private void throwMissle(UUID uuid) {
}
private void throwShell(UUID uuid) {
}
public void throwBombAnim(UUID uuid){
}
/** /**
* Animates the swapping of two pieces by swapping their positions and rotations. * Animates the swapping of two pieces by swapping their positions and rotations.
* *

View File

@@ -141,7 +141,7 @@ public void initSpatial(){
} }
public void rotateInit() { public void rotateInit() {
// rotate(rotation - initRotation); setRotation(initRotation);
} }
/** /**
@@ -278,4 +278,5 @@ public boolean isSelectable() {
public void setHoverable(boolean hoverable) { public void setHoverable(boolean hoverable) {
this.hoverable = hoverable; this.hoverable = hoverable;
} }
} }

View File

@@ -48,6 +48,7 @@ public GameView(MdgaApp app) {
@Override @Override
public void onEnter() { public void onEnter() {
setOwnColor(Color.AIRFORCE);
camera.init(ownColor); camera.init(ownColor);
boardHandler.init(); boardHandler.init();
guiHandler.init(ownColor); guiHandler.init(ownColor);

View File

@@ -42,7 +42,7 @@ protected void handlePowerCard(PlayCardMessage msg){
protected void throwPiece(Piece piece){ protected void throwPiece(Piece piece){
logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(piece)].clearOccupant(); logic.getGame().getBoard().getInfield()[logic.getGame().getBoard().getInfieldIndexOfPiece(piece)].clearOccupant();
logic.getGame().getBoard().getPlayerData().get(piece.getColor()).addWaitingPiece(piece); logic.getGame().getBoard().getPlayerData().get(piece.getColor()).addWaitingPiece(piece);
logic.addNotification(new ThrowPieceNotification(piece.getUuid())); // logic.addNotification(new ThrowPieceNotification(piece.getUuid()));
logic.getGame().getPlayerByColor(piece.getColor()).getPlayerStatistic().increasePiecesBeingThrown(); logic.getGame().getPlayerByColor(piece.getColor()).getPlayerStatistic().increasePiecesBeingThrown();
logic.getGame().getGameStatistics().increasePiecesBeingThrown(); logic.getGame().getGameStatistics().increasePiecesBeingThrown();
piece.setState(PieceState.WAITING); piece.setState(PieceState.WAITING);

View File

@@ -1,5 +1,7 @@
package pp.mdga.notification; package pp.mdga.notification;
import pp.mdga.game.Color;
import java.util.UUID; import java.util.UUID;
/** /**
@@ -10,12 +12,14 @@ public class ThrowPieceNotification extends Notification {
* The id of the piece that was thrown. * The id of the piece that was thrown.
*/ */
private final UUID pieceId; private final UUID pieceId;
private final Color throwColor;
/** /**
* This constructor is used to create a new ThrowPieceNotification * This constructor is used to create a new ThrowPieceNotification
*/ */
public ThrowPieceNotification(UUID pieceId) { public ThrowPieceNotification(UUID pieceId, Color throwColor) {
this.pieceId = pieceId; this.pieceId = pieceId;
this.throwColor = throwColor;
} }
/** /**
@@ -26,4 +30,8 @@ public ThrowPieceNotification(UUID pieceId) {
public UUID getPieceId() { public UUID getPieceId() {
return pieceId; return pieceId;
} }
public Color getThrowColor() {
return throwColor;
}
} }