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 6ff58bae..8f4b2ccf 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 @@ -8,26 +8,22 @@ import static pp.mdga.client.Util.linInt; -public class FadeControl extends InitControl { +public class FadeControl extends ActionControl { private float duration; // Duration of the fade effect private float timeElapsed = 0; private boolean init = false; private float startAlpha; private float endAlpha; - private Runnable actionAfter; public FadeControl(float duration, float startAlpha, float endAlpha, Runnable actionAfter) { + super(actionAfter); this.duration = duration; this.startAlpha = startAlpha; this.endAlpha = endAlpha; - this.actionAfter = actionAfter; } public FadeControl(float duration, float startAlpha, float endAlpha) { - this.duration = duration; - this.startAlpha = startAlpha; - this.endAlpha = endAlpha; - this.actionAfter = null; + this(duration, startAlpha, endAlpha, null); } @Override @@ -47,7 +43,7 @@ protected void controlUpdate(float tpf) { t = 1; init = false; spatial.removeControl(this); - if(actionAfter != null) actionAfter.run(); + action(); } float alpha = linInt(startAlpha, endAlpha, t); // Interpolate alpha 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 decde97f..7e4170dc 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 @@ -12,7 +12,7 @@ import java.util.*; -public class MatrixAnimation extends InitControl { +public class MatrixAnimation extends ActionControl { private MdgaApp app; private static final Random RANDOM = new Random(); private Vector3f radarPos; @@ -30,10 +30,10 @@ private enum MatrixState{ } private MatrixState state; - public MatrixAnimation(MdgaApp app, float duration, Vector3f radarPos, Runnable runnable){ + public MatrixAnimation(MdgaApp app, Vector3f radarPos, Runnable runnable){ + super(runnable); this.app = app; this.radarPos = radarPos; - this.runnable = runnable; } @Override @@ -90,8 +90,8 @@ public void run() { case MATRIX_OFF -> { if(timeElapsed >= 0.5f){ init = false; - runnable.run(); spatial.removeControl(this); + action(); } } } 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 index a44f56cb..8a9325cb 100644 --- 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 @@ -76,8 +76,8 @@ private void shoot(){ ); Spatial shell = createShell(); - shell.addControl(new ShellControl(this::hitExplosion, shootPos, spatial.getLocalTranslation(), FLYING_HEIGHT, FLYING_DURATION)); app.getRootNode().attachChild(shell); + shell.addControl(new ShellControl(this::hitExplosion, shootPos, spatial.getLocalTranslation(), FLYING_HEIGHT, FLYING_DURATION, app.getAssetManager())); } private Spatial createShell(){ diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ShellControl.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ShellControl.java index 134464d3..72cd7bb8 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ShellControl.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/ShellControl.java @@ -1,5 +1,10 @@ package pp.mdga.client.animation; +import com.jme3.asset.AssetManager; +import com.jme3.effect.ParticleEmitter; +import com.jme3.effect.ParticleMesh; +import com.jme3.material.Material; +import com.jme3.math.ColorRGBA; import com.jme3.math.FastMath; import com.jme3.math.Vector3f; import pp.mdga.client.InitControl; @@ -10,13 +15,16 @@ public class ShellControl extends ActionControl { private final float height; private final float duration; private Vector3f oldPos; + private ParticleEmitter emitter; + private AssetManager assetManager; - public ShellControl(Runnable runnable, Vector3f shootPos, Vector3f endPos, float height, float duration){ + public ShellControl(Runnable runnable, Vector3f shootPos, Vector3f endPos, float height, float duration, AssetManager assetManager){ super(runnable); this.shootPos = shootPos; this.endPos = endPos; this.height = height; this.duration = duration; + this.assetManager = assetManager; } @Override @@ -25,6 +33,9 @@ protected void initSpatial() { shootPos, endPos, ()->{ + emitter.killAllParticles(); + emitter.setParticlesPerSec(0); + emitter.removeFromParent(); spatial.removeControl(this); spatial.removeFromParent(); action(); @@ -34,6 +45,34 @@ protected void initSpatial() { false )); oldPos = spatial.getLocalTranslation().clone(); + createEmitter(); + } + + private void createEmitter() { + emitter = new ParticleEmitter("ShellTrail", ParticleMesh.Type.Triangle, 200); + Material mat = new Material(assetManager, "Common/MatDefs/Misc/Particle.j3md"); + mat.setTexture("Texture", assetManager.loadTexture("Images/particle/line.png")); // Nutze eine schmale, linienartige Textur + emitter.setMaterial(mat); + + // Comic-Style Farben + emitter.setStartColor(new ColorRGBA(1f, 1f, 1f, 1f)); // Reinweiß + emitter.setEndColor(new ColorRGBA(1f, 1f, 1f, 0f)); // Transparent + + // Partikelgröße und Lebensdauer + emitter.setStartSize(0.15f); // Startgröße + emitter.setEndSize(0.1f); // Endgröße + emitter.setLowLife(0.14f); // Sehr kurze Lebensdauer + emitter.setHighLife(0.14f); + + emitter.setGravity(0, 0, 0); // Keine Gravitation + emitter.getParticleInfluencer().setInitialVelocity(new Vector3f(0, 0, 0)); + emitter.getParticleInfluencer().setVelocityVariation(0f); // Kein Variationsspielraum + + // Hohe Dichte für eine glatte Spur + emitter.setParticlesPerSec(500); + + // Zur Shell hinzufügen + spatial.getParent().attachChild(emitter); } @Override @@ -44,5 +83,7 @@ protected void controlUpdate(float tpf) { spatial.rotate(FastMath.HALF_PI,0,0); } oldPos = spatial.getLocalTranslation().clone(); + + emitter.setLocalTranslation(spatial.getLocalTranslation().clone()); } } 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 1b426665..1ab76b22 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 @@ -775,7 +775,7 @@ 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, radarPos,()-> { piece.addControl(new FadeControl(1,1,0, () -> { throwPiece(uuid); diff --git a/Projekte/mdga/client/src/main/resources/Images/particle/line.png b/Projekte/mdga/client/src/main/resources/Images/particle/line.png new file mode 100644 index 00000000..6f7081b0 Binary files /dev/null and b/Projekte/mdga/client/src/main/resources/Images/particle/line.png differ