From 32f49a61817703014e0ef35fdba635fb125376ac Mon Sep 17 00:00:00 2001
From: Cedric Beck
Date: Sat, 7 Dec 2024 13:30:30 +0100
Subject: [PATCH] added shellAnimation without shell asset
---
.../src/main/java/pp/mdga/client/Asset.java | 8 +-
.../pp/mdga/client/InputSynchronizer.java | 8 +-
.../mdga/client/NotificationSynchronizer.java | 2 +-
.../src/main/java/pp/mdga/client/Util.java | 47 +
.../mdga/client/acoustic/AcousticHandler.java | 9 +
.../pp/mdga/client/acoustic/MdgaSound.java | 3 +
.../pp/mdga/client/acoustic/SoundAsset.java | 6 +-
.../mdga/client/animation/ActionControl.java | 18 +
.../pp/mdga/client/animation/FadeControl.java | 14 +-
.../client/animation/MatrixAnimation.java | 1 -
.../pp/mdga/client/animation/MoveControl.java | 74 +-
.../mdga/client/animation/ShellAnimation.java | 140 +
.../pp/mdga/client/board/BoardHandler.java | 25 +-
.../java/pp/mdga/client/board/MapLoader.java | 3 +
.../pp/mdga/client/board/TankTopControl.java | 105 +
.../main/resources/Images/particle/flame.png | Bin 0 -> 47227 bytes
.../resources/Images/particle/vapor_cloud.png | Bin 0 -> 18236 bytes
.../client/src/main/resources/Maps/map.mdga | 6 +-
.../resources/Models/tank/tank_shoot_bot.obj | 1978 +
.../resources/Models/tank/tank_shoot_top.obj | 554 +
.../Models/treeBig/big_trees_background.obj | 383078 +++++++++++++++
.../Models/treeBig/treeBig_background.obj | 239409 +++++++++
.../treeSmall/small_trees_background.obj | 146564 ++++++
.../Models/treeSmall/treeSmall_background.obj | 88741 ++++
.../resources/Models/world/world_diff.png | Bin 11030971 -> 13865674 bytes
.../resources/Models/world/world_diff_old.png | Bin 0 -> 11030971 bytes
.../Models/world/world_export_newTex.obj | 18858 +
.../src/main/resources/Sounds/matrix.wav | Bin 0 -> 597458 bytes
.../src/main/resources/Sounds/tank_shoot.ogg | Bin 0 -> 106263 bytes
.../main/resources/Sounds/turret_rotate.ogg | Bin 0 -> 107100 bytes
30 files changed, 879576 insertions(+), 75 deletions(-)
create mode 100644 Projekte/mdga/client/src/main/java/pp/mdga/client/Util.java
create mode 100644 Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ActionControl.java
create mode 100644 Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ShellAnimation.java
create mode 100644 Projekte/mdga/client/src/main/java/pp/mdga/client/board/TankTopControl.java
create mode 100644 Projekte/mdga/client/src/main/resources/Images/particle/flame.png
create mode 100644 Projekte/mdga/client/src/main/resources/Images/particle/vapor_cloud.png
create mode 100644 Projekte/mdga/client/src/main/resources/Models/tank/tank_shoot_bot.obj
create mode 100644 Projekte/mdga/client/src/main/resources/Models/tank/tank_shoot_top.obj
create mode 100644 Projekte/mdga/client/src/main/resources/Models/treeBig/big_trees_background.obj
create mode 100644 Projekte/mdga/client/src/main/resources/Models/treeBig/treeBig_background.obj
create mode 100644 Projekte/mdga/client/src/main/resources/Models/treeSmall/small_trees_background.obj
create mode 100644 Projekte/mdga/client/src/main/resources/Models/treeSmall/treeSmall_background.obj
create mode 100644 Projekte/mdga/client/src/main/resources/Models/world/world_diff_old.png
create mode 100644 Projekte/mdga/client/src/main/resources/Models/world/world_export_newTex.obj
create mode 100644 Projekte/mdga/client/src/main/resources/Sounds/matrix.wav
create mode 100644 Projekte/mdga/client/src/main/resources/Sounds/tank_shoot.ogg
create mode 100644 Projekte/mdga/client/src/main/resources/Sounds/turret_rotate.ogg
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java
index a24d9d1c..0ce1bcfd 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Asset.java
@@ -28,7 +28,7 @@ public enum Asset {
ship(0.8f),
smallTent,
tank,
- world(1.2f),
+ world("Models/world/world_export_newTex.obj", "Models/world/world_diff.png",1.2f),
shieldRing("Models/shieldRing/shieldRing.j3o", null),
treeSmall(1.2f),
treeBig(1.2f),
@@ -38,7 +38,11 @@ public enum Asset {
swapSymbol("Models/swapCard/swapSymbol.j3o", "Models/swapCard/swapCard_diff.png"),
shieldCard,
shieldSymbol("Models/shieldCard/shieldSymbol.j3o", "Models/shieldCard/shieldCard_diff.png"),
- dice
+ dice,
+ tankShoot("Models/tank/tank_shoot_bot.obj", "Models/tank/tank_diff.png"),
+ tankShootTop("Models/tank/tank_shoot_top.obj", "Models/tank/tank_diff.png"),
+ treesSmallBackground("Models/treeSmall/small_trees_background.obj", "Models/treeSmall/treeSmall_diff.png", 1.2f),
+ treesBigBackground("Models/treeBig/big_trees_background.obj", "Models/treeBig/treeBig_diff.png", 1.2f)
;
private final String modelPath;
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java
index 85af5ae3..2d53db04 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/InputSynchronizer.java
@@ -156,10 +156,14 @@ else if(boardSelect != null) {
p = UUID.randomUUID();
gameView.getBoardHandler().addPlayer(Color.AIRFORCE,List.of(p,UUID.randomUUID(),UUID.randomUUID(),UUID.randomUUID()));
gameView.getBoardHandler().movePieceStartAnim(p,0);
- gameView.getBoardHandler().movePieceAnim(p,0, 8);
+// gameView.getBoardHandler().movePieceAnim(p,0, 8);
} else {
// gameView.getBoardHandler().throwBombAnim(p);
- gameView.getBoardHandler().throwPiece(p,Color.CYBER);
+ gameView.getBoardHandler().throwPiece(p,Color.ARMY);
+// gameView.getBoardHandler().movePieceAnim(p,0,20);
+// gameView.getBoardHandler().throwPiece(p,Color.CYBER);
+// gameView.getBoardHandler().throwPiece(p,Color.AIRFORCE);
+
//gameView.getBoardHandler().movePieceStartAnim(p,0);
}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java
index 8553dbdc..0baad3a8 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/NotificationSynchronizer.java
@@ -138,7 +138,7 @@ private void handleGame(Notification notification) {
}
guiHandler.hideText();
} else if (notification instanceof ThrowPieceNotification n) {
- boardHandler.throwBombAnim(n.getPieceId());
+ boardHandler.throwPiece(n.getPieceId(), n.getThrowColor());
} else if (notification instanceof NoShieldNotification n) {
boardHandler.unshieldPiece(n.getPieceId());
} else if (notification instanceof PlayCardNotification n) {
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/Util.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/Util.java
new file mode 100644
index 00000000..606c4beb
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/Util.java
@@ -0,0 +1,47 @@
+package pp.mdga.client;
+
+import com.jme3.math.Vector3f;
+
+public class Util {
+ private Util(){}
+
+ /**
+ * Performs linear interpolation between two values.
+ *
+ * @param start The starting value.
+ * @param end The ending value.
+ * @param t A parameter between 0 and 1 representing the interpolation progress.
+ * @return The interpolated value.
+ */
+ public static float linInt(float start, float end, float t) {
+ return start + t * (end - start);
+ }
+
+ /**
+ * Performs quadratic interpolation between three points.
+ *
+ * @param p1 The initial point.
+ * @param p2 The middle point.
+ * @param p3 The final point.
+ * @param t The interpolation parameter (0 <= t <= 1).
+ * @return The interpolated point.
+ */
+ public static Vector3f quadInt(Vector3f p1, Vector3f p2, Vector3f p3, float t) {
+ // Quadratic interpolation: (1-t)^2 * p1 + 2 * (1-t) * t * p2 + t^2 * p3
+ float oneMinusT = 1 - t;
+ return p1.mult(oneMinusT * oneMinusT)
+ .add(p2.mult(2 * oneMinusT * t))
+ .add(p3.mult(t * t));
+ }
+
+ /**
+ * A smooth ease-in-out function for interpolation.
+ * It accelerates and decelerates the interpolation for a smoother effect.
+ *
+ * @param x The interpolation parameter (0 <= x <= 1).
+ * @return The adjusted interpolation value.
+ */
+ public static float easeInOut(float x){
+ return x < 0.5 ? 4 * x * x * x : (float) (1 - Math.pow(-2 * x + 2, 3) / 2);
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java
index fae8f487..8ff67526 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/AcousticHandler.java
@@ -123,6 +123,15 @@ public void playSound(MdgaSound sound) {
case BONUS:
assets.add(new SoundAssetDelayVolume(SoundAsset.BONUS, 1.0f, 0.0f));
break;
+ case TURRET_ROTATE:
+ assets.add(new SoundAssetDelayVolume(SoundAsset.TURRET_ROTATE, 0.7f, 0f));
+ break;
+ case TANK_SHOOT:
+ assets.add(new SoundAssetDelayVolume(SoundAsset.TANK_SHOOT, 0.7f, 0f));
+ break;
+ case TANK_EXPLOSION:
+ assets.add(new SoundAssetDelayVolume(SoundAsset.EXPLOSION_1, 1.0f, 0f));
+ break;
default:
break;
}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java
index 857954ad..9471e4f5 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/MdgaSound.java
@@ -35,4 +35,7 @@ public enum MdgaSound {
EXPLOSION,
LOSE,
BONUS,
+ TURRET_ROTATE,
+ TANK_SHOOT,
+ TANK_EXPLOSION
}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java
index 71e4f20a..c9c6b56f 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/acoustic/SoundAsset.java
@@ -35,7 +35,11 @@ enum SoundAsset {
UI90("ui90.ogg"),
BONUS("bonus.ogg"),
LOSE("lose.ogg"),
- CONNECTED("connected.wav");
+ CONNECTED("connected.wav"),
+ TURRET_ROTATE("turret_rotate.ogg"),
+ TANK_SHOOT("tank_shoot.ogg")
+ ;
+
private final String path;
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ActionControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ActionControl.java
new file mode 100644
index 00000000..eb741e9e
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ActionControl.java
@@ -0,0 +1,18 @@
+package pp.mdga.client.animation;
+
+import pp.mdga.client.InitControl;
+
+public class ActionControl extends InitControl {
+ private final Runnable runnable;
+
+ public ActionControl(Runnable runnable){
+ this.runnable = runnable;
+ }
+
+
+
+ protected void action(){
+ if(runnable == null) throw new RuntimeException("runnable is null");
+ else runnable.run();
+ }
+}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/FadeControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/FadeControl.java
index c2a3c5ac..6ff58bae 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/FadeControl.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/FadeControl.java
@@ -6,6 +6,8 @@
import com.jme3.math.ColorRGBA;
import pp.mdga.client.InitControl;
+import static pp.mdga.client.Util.linInt;
+
public class FadeControl extends InitControl {
private float duration; // Duration of the fade effect
private float timeElapsed = 0;
@@ -69,16 +71,4 @@ protected void controlUpdate(float tpf) {
} else throw new RuntimeException("Material is null");
} else throw new RuntimeException("Spatial is not instance of Geometry");
}
-
- /**
- * Performs linear interpolation between two values.
- *
- * @param start The starting value.
- * @param end The ending value.
- * @param t A parameter between 0 and 1 representing the interpolation progress.
- * @return The interpolated value.
- */
- private float linInt(float start, float end, float t) {
- return start + t * (end - start);
- }
}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MatrixAnimation.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MatrixAnimation.java
index ecc2d9a1..decde97f 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MatrixAnimation.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MatrixAnimation.java
@@ -39,7 +39,6 @@ public MatrixAnimation(MdgaApp app, float duration, Vector3f radarPos, Runnable
@Override
protected void initSpatial() {
state = MatrixState.RADAR_ON;
- System.out.println("RADAR ON");
timeElapsed = 0;
init = true;
radar();
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MoveControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MoveControl.java
index 8aea4efc..5dacacbd 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MoveControl.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MoveControl.java
@@ -1,7 +1,8 @@
package pp.mdga.client.animation;
import com.jme3.math.Vector3f;
-import pp.mdga.client.InitControl;
+
+import static pp.mdga.client.Util.*;
/**
* A control that smoothly moves a spatial from an initial position to an end position
@@ -12,16 +13,16 @@
* an ease-in-out curve to create a smooth start and stop effect.
*
*/
-public class MoveControl extends InitControl {
+public class MoveControl extends ActionControl {
private boolean moving;
private final Vector3f initPos;
private final Vector3f endPos;
private final Vector3f middlePos;
- private final static float HEIGHT = 2;
- private final static float MOVE_SPEED = 1f;
- private float progress = 0;
- private final Runnable actionAfter;
+ private final float height;
+ private final float duration;
+ private float timer = 0;
+ private boolean easing;
/**
* Creates a new MoveControl with specified initial and end positions, and an action to run after the movement.
@@ -32,15 +33,22 @@ public class MoveControl extends InitControl {
* @param actionAfter A Runnable that will be executed after the movement finishes.
*/
public MoveControl(Vector3f initPos, Vector3f endPos, Runnable actionAfter){
+ this(initPos, endPos, actionAfter, 2, 1, true);
+ }
+
+ public MoveControl(Vector3f initPos, Vector3f endPos, Runnable actionAfter, float height, float duration, boolean easing){
+ super(actionAfter);
moving = false;
this.initPos = initPos;
this.endPos = endPos;
+ this.height = height;
+ this.duration = duration;
+ this.easing = easing;
middlePos = new Vector3f(
- (initPos.x + endPos.x) / 2,
- (initPos.y + endPos.y) / 2,
- HEIGHT
+ (initPos.x + endPos.x) / 2,
+ (initPos.y + endPos.y) / 2,
+ height
);
- this.actionAfter = actionAfter;
}
/**
@@ -50,7 +58,7 @@ public MoveControl(Vector3f initPos, Vector3f endPos, Runnable actionAfter){
@Override
protected void initSpatial() {
moving = true;
- progress = 0;
+ timer = 0;
}
/**
@@ -63,10 +71,16 @@ protected void initSpatial() {
@Override
protected void controlUpdate(float tpf) {
if(!moving) return;
- progress += tpf * MOVE_SPEED;
- if(progress > 1) progress = 1;
- spatial.setLocalTranslation(quadInt(initPos,middlePos,endPos, easeInOut(progress)));
- if(progress == 1) end();
+ timer += tpf;
+
+ float t = timer / duration;
+ if (t >= 1) t = 1;
+
+ float interpolated = easing ? easeInOut(t) : t;
+
+ spatial.setLocalTranslation(quadInt(initPos,middlePos,endPos, interpolated));
+
+ if(t >= 1) end();
}
/**
@@ -75,35 +89,11 @@ protected void controlUpdate(float tpf) {
*/
private void end(){
moving = false;
- actionAfter.run();
spatial.removeControl(this);
+ action();
}
- /**
- * Performs quadratic interpolation between three points.
- *
- * @param p1 The initial point.
- * @param p2 The middle point.
- * @param p3 The final point.
- * @param t The interpolation parameter (0 <= t <= 1).
- * @return The interpolated point.
- */
- private Vector3f quadInt(Vector3f p1, Vector3f p2, Vector3f p3, float t) {
- // Quadratic interpolation: (1-t)^2 * p1 + 2 * (1-t) * t * p2 + t^2 * p3
- float oneMinusT = 1 - t;
- return p1.mult(oneMinusT * oneMinusT)
- .add(p2.mult(2 * oneMinusT * t))
- .add(p3.mult(t * t));
- }
- /**
- * A smooth ease-in-out function for interpolation.
- * It accelerates and decelerates the interpolation for a smoother effect.
- *
- * @param x The interpolation parameter (0 <= x <= 1).
- * @return The adjusted interpolation value.
- */
- private float easeInOut(float x){
- return x < 0.5 ? 4 * x * x * x : (float) (1 - Math.pow(-2 * x + 2, 3) / 2);
- }
+
+
}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ShellAnimation.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ShellAnimation.java
new file mode 100644
index 00000000..ea51b285
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ShellAnimation.java
@@ -0,0 +1,140 @@
+package pp.mdga.client.animation;
+
+import com.jme3.effect.ParticleEmitter;
+import com.jme3.effect.ParticleMesh;
+import com.jme3.material.Material;
+import com.jme3.math.ColorRGBA;
+import com.jme3.math.Quaternion;
+import com.jme3.math.Vector3f;
+import com.jme3.scene.Geometry;
+import com.jme3.scene.shape.Box;
+import pp.mdga.client.InitControl;
+import pp.mdga.client.MdgaApp;
+import pp.mdga.client.acoustic.MdgaSound;
+import pp.mdga.client.board.TankTopControl;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import static com.jme3.material.Materials.UNSHADED;
+
+public class ShellAnimation extends ActionControl {
+ private static final float FLYING_DURATION = 1.25f;
+ private static final float FLYING_HEIGHT = 12f;
+ private TankTopControl tankTopControl;
+ private MdgaApp app;
+
+ public ShellAnimation(TankTopControl tankTopControl, MdgaApp app, Runnable actionAfter){
+ super(actionAfter);
+ this.tankTopControl = tankTopControl;
+ this.app = app;
+ }
+
+ @Override
+ protected void initSpatial() {
+ tankTopControl.rotate(spatial.getLocalTranslation(), this::shoot);
+ app.getAcousticHandler().playSound(MdgaSound.TURRET_ROTATE);
+ }
+
+ private Vector3f getShootPos(){
+ Vector3f localOffset = new Vector3f(0, -5.4f, 2.9f);
+ Quaternion turretRotation = tankTopControl.getSpatial().getLocalRotation();
+ Vector3f transformedOffset = turretRotation.mult(localOffset);
+ return tankTopControl.getSpatial().getLocalTranslation().add(transformedOffset);
+ }
+
+ private void shoot(){
+ app.getAcousticHandler().playSound(MdgaSound.TANK_SHOOT);
+ Vector3f shootPos = getShootPos();
+ createEffect(
+ shootPos,
+ "Images/particle/flame.png",
+ 2, 2,
+ 1, 3,
+ 1f,
+ 0.3f, 0.7f,
+ new ColorRGBA(1f, 0.8f, 0.4f, 0.5f),
+ new ColorRGBA(1f, 0f, 0f, 0f)
+ );
+ createEffect(
+ shootPos,
+ "Images/particle/vapor_cloud.png",
+ 3, 3,
+ 0.3f, 0.8f,
+ 10,
+ 0.1f, 0.35f,
+ new ColorRGBA(0.5f,0.5f,0.5f,0.5f),
+ ColorRGBA.Black
+ );
+
+ Geometry test = new Geometry("test", new Box(0.25f,0.25f,0.25f));
+ test.setMaterial(new Material(app.getAssetManager(), UNSHADED));
+ test.addControl(new MoveControl(shootPos, spatial.getLocalTranslation(),
+ ()->{
+ app.getRootNode().detachChild(test);
+ hitExplosion();
+ }, FLYING_HEIGHT, FLYING_DURATION, false));
+ app.getRootNode().attachChild(test);
+ }
+
+ private void hitExplosion(){
+ app.getAcousticHandler().playSound(MdgaSound.TANK_EXPLOSION);
+ createEffect(
+ spatial.getLocalTranslation().setZ(1),
+ "Images/particle/flame.png",
+ 2, 2,
+ 1, 5,
+ 2f,
+ 0.3f, 0.7f,
+ new ColorRGBA(1f, 0.8f, 0.4f, 0.5f),
+ new ColorRGBA(1f, 0f, 0f, 0f)
+ );
+ new Timer().schedule(new TimerTask() {
+ @Override
+ public void run() {
+ action();
+ }
+ }, 800);
+ }
+
+ private void createEffect(Vector3f shootPos,
+ String image,
+ int x, int y,
+ float startSize, float endSize,
+ float velocity,
+ float lowLife, float highLife,
+ ColorRGBA start, ColorRGBA end){
+ // Create a particle emitter for the explosion
+ ParticleEmitter explosionEmitter = new ParticleEmitter("Explosion", ParticleMesh.Type.Triangle, 100);
+ Material explosionMat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Particle.j3md");
+ explosionMat.setTexture("Texture", app.getAssetManager().loadTexture(image));
+ explosionEmitter.setMaterial(explosionMat);
+
+ // Particle properties
+ explosionEmitter.setImagesX(x); // Columns in the texture
+ explosionEmitter.setImagesY(y); // Rows in the texture
+ explosionEmitter.setSelectRandomImage(true); // Randomize images for variety
+
+ explosionEmitter.setStartColor(start); // Bright yellowish orange
+ explosionEmitter.setEndColor(end); // Fade to transparent red
+
+ explosionEmitter.setStartSize(startSize); // Initial size
+ explosionEmitter.setEndSize(endSize); // Final size
+ explosionEmitter.setLowLife(lowLife); // Minimum lifetime of particles
+ explosionEmitter.setHighLife(highLife); // Maximum lifetime of particles
+ explosionEmitter.setGravity(0, 0, 1); // Gravity to pull particles down
+ explosionEmitter.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 0, velocity));
+ explosionEmitter.getParticleInfluencer().setVelocityVariation(1f); // Adds randomness to the initial velocity
+ explosionEmitter.setFacingVelocity(true); // Particles face their velocity direction
+ explosionEmitter.setLocalTranslation(shootPos);
+ explosionEmitter.setParticlesPerSec(0);
+ explosionEmitter.emitAllParticles();
+ app.getRootNode().attachChild(explosionEmitter);
+ new Timer().schedule(new TimerTask() {
+ @Override
+ public void run() {
+ app.getRootNode().detachChild(explosionEmitter);
+ }
+ }, 1000);
+ }
+}
\ No newline at end of file
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java
index 68414d00..1b426665 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/BoardHandler.java
@@ -13,10 +13,7 @@
import pp.mdga.client.Asset;
import pp.mdga.client.MdgaApp;
import pp.mdga.client.acoustic.MdgaSound;
-import pp.mdga.client.animation.FadeControl;
-import pp.mdga.client.animation.MatrixAnimation;
-import pp.mdga.client.animation.MoveControl;
-import pp.mdga.client.animation.JetAnimation;
+import pp.mdga.client.animation.*;
import pp.mdga.client.gui.DiceControl;
import pp.mdga.game.Color;
@@ -62,6 +59,8 @@ public class BoardHandler {
private DiceControl diceControl;
//Radar Position for Matrix animation
private Vector3f radarPos;
+ //TankTop for shellAnimation
+ private TankTopControl tankTop;
/**
* Creates a new BoardHandler.
@@ -155,12 +154,18 @@ private void initMap() {
case node_wait_green -> addHomeNode(waitingNodesMap, Color.ARMY, assetOnMap);
case node_wait_yellow -> addHomeNode(waitingNodesMap, Color.CYBER, assetOnMap);
case radar -> addRadar(assetOnMap);
+ case tankShoot -> addTankShoot(assetOnMap);
default -> displayAsset(assetOnMap);
}
}
}
+ private void addTankShoot(AssetOnMap assetOnMap) {
+ displayAsset(assetOnMap);
+ tankTop = displayAndControl(new AssetOnMap(Asset.tankShootTop, assetOnMap.x(), assetOnMap.y(), assetOnMap.rot()), new TankTopControl());
+ }
+
private void addRadar(AssetOnMap assetOnMap) {
radarPos = gridToWorld(assetOnMap.x(), assetOnMap.y());
displayAsset(assetOnMap);
@@ -768,8 +773,9 @@ private void throwBomb(UUID uuid) {
}
private void throwMatrix(UUID uuid) {
+ //app.getAcousticHandler().playSound(MdgaSound.MATRIX);
Spatial piece = pieces.get(uuid).getSpatial();
- piece.addControl(new MatrixAnimation(app, 1, radarPos,()->{
+ piece.addControl(new MatrixAnimation(app, 1, radarPos,()-> {
piece.addControl(new FadeControl(1,1,0,
() -> {
throwPiece(uuid);
@@ -777,8 +783,6 @@ private void throwMatrix(UUID uuid) {
}
));
}));
-
-
}
private void throwMissle(UUID uuid) {
@@ -786,12 +790,7 @@ private void throwMissle(UUID uuid) {
}
private void throwShell(UUID uuid) {
-
- }
-
-
- public void throwBombAnim(UUID uuid){
-
+ pieces.get(uuid).getSpatial().addControl(new ShellAnimation(tankTop, app, ()-> throwPieceAnim(uuid)));
}
/**
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/MapLoader.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/MapLoader.java
index 76b286da..fe994855 100644
--- a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/MapLoader.java
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/MapLoader.java
@@ -109,6 +109,9 @@ private static Asset getLoadedAsset(String assetName) {
case "tank" -> Asset.tank;
case "treeSmall" -> Asset.treeSmall;
case "treeBig" -> Asset.treeBig;
+ case "tank_shoot" -> Asset.tankShoot;
+ case "treesBigBackground" -> Asset.treesBigBackground;
+ case "treesSmallBackground" -> Asset.treesSmallBackground;
default -> throw new IllegalStateException("Unexpected value: " + assetName);
};
}
diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/board/TankTopControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/TankTopControl.java
new file mode 100644
index 00000000..d6dbb128
--- /dev/null
+++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/board/TankTopControl.java
@@ -0,0 +1,105 @@
+package pp.mdga.client.board;
+
+import com.jme3.math.FastMath;
+import com.jme3.math.Quaternion;
+import com.jme3.math.Vector3f;
+import pp.mdga.client.InitControl;
+
+import static pp.mdga.client.Util.linInt;
+
+public class TankTopControl extends InitControl {
+
+ private float timer = 0; // Time elapsed
+ private final static float DURATION = 1.5f; // Total rotation duration in seconds
+ private boolean rotating = false; // Flag to track if rotation is active
+ private float startAngle = 0;
+ private float endAngle = 0;
+ private Runnable actionAfter = null;
+
+ @Override
+ protected void controlUpdate(float tpf) {
+ if (!rotating) return;
+
+ // Update the timer
+ timer += tpf;
+
+ // Calculate interpolation factor (0 to 1)
+ float t = timer / DURATION;
+
+ if (t >= 1) t = 1;
+
+ float curAngle = linInt(startAngle, endAngle, t);
+
+ // Interpolate the rotation
+ Quaternion interpolatedRotation = new Quaternion();
+ interpolatedRotation.fromAngleAxis((float) Math.toRadians(curAngle), Vector3f.UNIT_Z);
+
+ // Apply the interpolated rotation to the spatial
+ spatial.setLocalRotation(interpolatedRotation);
+
+ if(t >= 1){
+ rotating = false;
+ if(actionAfter != null) actionAfter.run();
+ }
+ }
+
+ public void rotate(Vector3f enemyPos, Runnable actionAfter) {
+ if (spatial == null) throw new RuntimeException("spatial is null");
+
+ startAngle = getOwnAngle();
+ endAngle = getEnemyAngle(enemyPos);
+
+ // Adjust endAngle to ensure the shortest path
+ float deltaAngle = endAngle - startAngle;
+ if (deltaAngle > 180) {
+ endAngle -= 360; // Rotate counterclockwise
+ } else if (deltaAngle < -180) {
+ endAngle += 360; // Rotate clockwise
+ }
+
+ timer = 0;
+ rotating = true;
+ this.actionAfter = actionAfter; // Store the action to execute after rotation
+ }
+
+ private float getEnemyAngle(Vector3f enemyPos){
+ // Direction to the enemy in the XY plane
+ Vector3f direction = enemyPos.subtract(spatial.getLocalTranslation());
+ direction.z = 0; // Project to XY plane
+ direction.normalizeLocal();
+
+ Vector3f reference = Vector3f.UNIT_Y.mult(-1);
+
+ // Calculate the angle between the direction vector and the reference vector
+ float angle = FastMath.acos(reference.dot(direction));
+
+ // Determine rotation direction using the cross product
+ Vector3f cross = reference.cross(direction);
+ if (cross.z < 0) {
+ angle = -angle;
+ }
+
+ return (float) Math.toDegrees(angle); // Return the absolute angle in degrees
+ }
+
+ private float getOwnAngle() {
+ // Tank's forward direction in the XY plane
+ Vector3f forward = spatial.getLocalRotation().mult(Vector3f.UNIT_Y);
+ forward.z = 0; // Project to XY plane
+ forward.normalizeLocal();
+
+ // Reference vector: Positive X-axis
+ Vector3f reference = Vector3f.UNIT_Y;
+
+ // Calculate the angle between the forward vector and the reference vector
+ float angle = FastMath.acos(reference.dot(forward));
+
+ // Determine rotation direction using the cross product
+ Vector3f cross = reference.cross(forward);
+ if (cross.z < 0) { // For Z-up, check the Z component of the cross product
+ angle = -angle;
+ }
+
+ return (float) Math.toDegrees(angle); // Return the absolute angle in radians
+ }
+}
diff --git a/Projekte/mdga/client/src/main/resources/Images/particle/flame.png b/Projekte/mdga/client/src/main/resources/Images/particle/flame.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3a31f7921bfde3e5aa0c4e513002f4d34fd8d1d
GIT binary patch
literal 47227
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%0DU&F}h`@Kfvg
zJ{VMD^fQ)C{4$+Kt@?f%aLbaQ@xj?4cgcSh0`<`E-Abte?z^%!F8VTS@Ag(@J=!Wa
zh&t;z`X7ifIrO|ULUmjDX^%EY1A9C`tI4KF;05w^-luXPr?gD6bidAtbpCKaonbtd
zkt~(Qs;T!zXFiDfFaRlS+Hr|iUwHU~^7&1}ddPu#%8i{lCfXA)llqbo$jwlIFMnT!
zT{4L8^g}X6OzRctMaW`j+rWa}=KAw$8YfhB<&iyqu9d%b_6bQPa`1hn%WyDYXt&E&
z?nL0q+S2?yIXR0&PzWqVxG4AN&J$&-vAoaCSw>LWGZ;D}$dKj5Nr<|+ujBx?*}`B%
z^#gU(JEUNIt@=Okvr$*n6sv}yV#t-sDeYOfK<^-v(8$kYdQ?zMH)Yr6$K6~yn79STy4r`}F8
zlNZ^!bIGNF;`^S=r{1UOQV!`9CY4%4n7u|0+XCmS)qsWx!zB$q`pO_z%gmJ4S=7j(
ziU)s+a=FHadBPsE!mgBS3zE{13NL9pOu8T2pD4Y#p!Q%lsgVixN7ksU_s4X&=(ZSc
zTgQ7@4LGLG!w<*QzDUeRF24$Uu$rFX3FBh$rD#QhBWSLbp=