From bf84bfa0f90809c956c84273f0c4715cce2b6a1e Mon Sep 17 00:00:00 2001 From: Felix Koppe Date: Sat, 7 Dec 2024 16:40:45 +0100 Subject: [PATCH] Update animations and remove test setup --- .../pp/mdga/client/InputSynchronizer.java | 2 +- .../pp/mdga/client/animation/Explosion.java | 15 ++-- .../mdga/client/animation/JetAnimation.java | 10 +-- .../client/animation/MissileAnimation.java | 68 +++++++++++++++---- .../java/pp/mdga/client/animation/Smoke.java | 11 +-- .../pp/mdga/client/board/BoardHandler.java | 8 +-- .../java/pp/mdga/client/view/GameView.java | 1 - 7 files changed, 79 insertions(+), 36 deletions(-) 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 83c6db04..bda4c252 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 @@ -158,7 +158,7 @@ else if(boardSelect != null) { gameView.getBoardHandler().movePieceStartAnim(p,0); //gameView.getBoardHandler().movePieceAnim(p,0, 8); } else { - gameView.getBoardHandler().throwPiece(p, Color.NAVY); + gameView.getBoardHandler().throwPiece(p, Color.ARMY); //gameView.getBoardHandler().movePieceStartAnim(p,0); } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/Explosion.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/Explosion.java index b1b3b164..439e6ebc 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/Explosion.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/Explosion.java @@ -39,6 +39,7 @@ public Explosion(MdgaApp app, Node rootNode, Vector3f location) { this.location = location; this.mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Particle.j3md"); + mat.setTexture("Texture", app.getAssetManager().loadTexture("Images/particle/flame.png")); } /** @@ -48,12 +49,14 @@ public Explosion(MdgaApp app, Node rootNode, Vector3f location) { private void initializeEmitter() { fire = new ParticleEmitter("Effect", Type.Triangle,50); fire.setMaterial(mat); + fire.setImagesX(2); + fire.setImagesY(2); fire.setStartColor(ColorRGBA.Yellow); fire.setEndColor(ColorRGBA.Red); fire.getParticleInfluencer().setInitialVelocity(new Vector3f(0.2f,0.2f,4f)); fire.getParticleInfluencer().setVelocityVariation(0.4f); - fire.setStartSize(0.1f); - fire.setEndSize(0.8f); + fire.setStartSize(0.7f); + fire.setEndSize(1.8f); fire.setGravity(0, 0, -0.1f); fire.setLowLife(0.5f); fire.setHighLife(2.2f); @@ -63,14 +66,14 @@ private void initializeEmitter() { smoke = new ParticleEmitter("Effect2", Type.Triangle,40); smoke.setMaterial(mat); - smoke.setImagesX(2); - smoke.setImagesY(2); + smoke.setImagesX(3); + smoke.setImagesY(3); smoke.setStartColor(ColorRGBA.DarkGray); smoke.setEndColor(new ColorRGBA(0.05f, 0.05f, 0.05f, 1)); smoke.getParticleInfluencer().setInitialVelocity(new Vector3f(0.0f,0.0f,0.7f)); smoke.getParticleInfluencer().setVelocityVariation(0.5f); - smoke.setStartSize(0.2f); - smoke.setEndSize(0.5f); + smoke.setStartSize(0.8f); + smoke.setEndSize(1.5f); smoke.setGravity(0, 0, -0.3f); smoke.setLowLife(1.2f); smoke.setHighLife(5.5f); diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/JetAnimation.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/JetAnimation.java index 583ac1c6..6607dd58 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/JetAnimation.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/JetAnimation.java @@ -33,7 +33,6 @@ public class JetAnimation { private final float curveHeight; private final float animationDuration; private Explosion explosion; - private final UUID id; private Runnable actionAfter; /** @@ -41,12 +40,11 @@ public class JetAnimation { * * @param app The main application managing the jet animation. * @param rootNode The root node to which the jet model will be attached. - * @param uuid A unique identifier for the animation. * @param targetPoint The target point where the explosion will occur. * @param curveHeight The height of the curve for the jet's flight path. * @param animationDuration The total duration of the jet animation. */ - public JetAnimation(MdgaApp app, Node rootNode, UUID uuid, Vector3f targetPoint, float curveHeight, float animationDuration, Runnable actionAfter) { + public JetAnimation(MdgaApp app, Node rootNode, Vector3f targetPoint, float curveHeight, float animationDuration, Runnable actionAfter) { Vector3f spawnPoint = targetPoint.add(170, 50, 50); Vector3f controlPoint = targetPoint.add(new Vector3f(0, 0, -45)); @@ -61,9 +59,7 @@ public JetAnimation(MdgaApp app, Node rootNode, UUID uuid, Vector3f targetPoint, this.curveHeight = curveHeight; this.animationDuration = animationDuration; - id = uuid; - - explosion = new Explosion(app, rootNode, nodePoint); + explosion = new Explosion(app, rootNode, targetPoint); this.actionAfter = actionAfter; } @@ -92,7 +88,7 @@ private void spawnJet() { rootNode.attachChild(jetModel); } - /** + /**actionAfter * Animates the jet along a Bezier curve path, triggers the explosion effect at the appropriate time, * and performs cleanup operations after the animation completes. */ diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MissileAnimation.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MissileAnimation.java index 79dde9b4..90cca657 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MissileAnimation.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/MissileAnimation.java @@ -1,6 +1,9 @@ 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.FastMath; import com.jme3.math.Vector3f; import com.jme3.renderer.RenderManager; @@ -29,31 +32,54 @@ public class MissileAnimation { private final float flightTime; private Explosion explosion; private Spatial missileModel; + private Runnable actionAfter; + private ParticleEmitter smoke; - private UUID id; + private Node missileNode = new Node(); + + private final Material mat; /** * Constructor for the {@code MissileAnimation} class. * * @param app The main application managing the missile animation. * @param rootNode The root node to which the missile model will be attached. - * @param uuid A unique identifier for the missile animation. * @param target The target point where the missile will explode. * @param flightTime The total flight time of the missile. */ - public MissileAnimation(MdgaApp app, Node rootNode, UUID uuid, Vector3f target, float flightTime) { + public MissileAnimation(MdgaApp app, Node rootNode, Vector3f target, float flightTime, Runnable actionAfter) { this.app = app; this.rootNode = rootNode; this.flightTime = flightTime; + this.actionAfter = actionAfter; explosion = new Explosion(app, rootNode, target); - id = uuid; this.target = target.add(new Vector3f(1.5f, -1, 0)); start = BoardHandler.gridToWorld(12, 0); start.add(new Vector3f(0, 0, 0)); + + this.mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Particle.j3md"); + mat.setTexture("Texture", app.getAssetManager().loadTexture("Images/particle/vapor_cloud.png")); + + smoke = new ParticleEmitter("Effect2", ParticleMesh.Type.Triangle,400); + smoke.setMaterial(mat); + smoke.setImagesX(3); + smoke.setImagesY(3); + smoke.setStartColor(ColorRGBA.DarkGray); + smoke.setEndColor(new ColorRGBA(0.05f, 0.05f, 0.05f, 1)); + smoke.getParticleInfluencer().setInitialVelocity(new Vector3f(0.0f,0.0f,0.0f)); + smoke.getParticleInfluencer().setVelocityVariation(0.1f); + smoke.setStartSize(0.8f); + smoke.setEndSize(1.5f); + smoke.setGravity(0, 0, -0.3f); + smoke.setLowLife(1.2f); + smoke.setHighLife(3.5f); + smoke.setParticlesPerSec(100); + missileNode.attachChild(smoke); + smoke.move(1, 0.85f, 1.0f); } /** @@ -77,8 +103,11 @@ private void loadMissile() { Material mat = new Material(app.getAssetManager(), "Common/MatDefs/Light/Lighting.j3md"); mat.setTexture("DiffuseMap", app.getAssetManager().loadTexture(Asset.missile.getDiffPath())); missileModel.setMaterial(mat); - missileModel.setLocalTranslation(start); - rootNode.attachChild(missileModel); + + missileNode.setLocalTranslation(start); + missileNode.attachChild(missileModel); + + rootNode.attachChild(missileNode); } /** @@ -86,28 +115,39 @@ private void loadMissile() { * and removes the missile model after the animation completes. */ private void animateMissile() { - missileModel.addControl(new AbstractControl() { + missileNode.addControl(new AbstractControl() { private float elapsedTime = 0; @Override protected void controlUpdate(float tpf) { + if(elapsedTime > 6) { + endAnim(); + rootNode.detachChild(missileNode); + this.spatial.removeControl(this); + } + elapsedTime += tpf; float progress = elapsedTime / flightTime; + if (progress >= 0.55) { + smoke.setParticlesPerSec(30); + } + + if (progress >= 0.7) { + smoke.setParticlesPerSec(0); + } + if (progress >= 0.95f) { explosion.trigger(); } if (progress >= 1) { explosion.trigger(); - - rootNode.detachChild(missileModel); - this.spatial.removeControl(this); - return; + missileNode.detachChild(missileModel); } Vector3f currentPosition = computeParabolicPath(start, target, progress); - missileModel.setLocalTranslation(currentPosition); + missileNode.setLocalTranslation(currentPosition); Vector3f direction = computeParabolicPath(start, target, progress + 0.01f) .subtract(currentPosition) @@ -122,6 +162,10 @@ protected void controlRender(RenderManager rm, ViewPort vp) { }); } + private void endAnim(){ + actionAfter.run(); + } + /** * Computes a position along a parabolic path at a given progress value {@code t}. * diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/Smoke.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/Smoke.java index 41058d2d..1786a656 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/Smoke.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/animation/Smoke.java @@ -35,6 +35,7 @@ public Smoke(MdgaApp app, Node rootNode, Vector3f location) { this.location = location; this.mat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Particle.j3md"); + mat.setTexture("Texture", app.getAssetManager().loadTexture("Images/particle/vapor_cloud.png")); } /** @@ -46,10 +47,10 @@ private void initializeEmitter() { fire.setMaterial(mat); fire.setStartColor(ColorRGBA.DarkGray); fire.setEndColor(ColorRGBA.DarkGray); - fire.getParticleInfluencer().setInitialVelocity(new Vector3f(0.2f,0.2f,8f)); + fire.getParticleInfluencer().setInitialVelocity(new Vector3f(0.2f,0.2f,4f)); fire.getParticleInfluencer().setVelocityVariation(0.4f); - fire.setStartSize(0.1f); - fire.setEndSize(0.8f); + fire.setStartSize(0.7f); + fire.setEndSize(3.8f); fire.setGravity(0, 0, -0.1f); fire.setLowLife(0.5f); fire.setHighLife(1.2f); @@ -65,8 +66,8 @@ private void initializeEmitter() { smoke.setEndColor(new ColorRGBA(0.05f, 0.05f, 0.05f, 1)); smoke.getParticleInfluencer().setInitialVelocity(new Vector3f(0.0f,0.0f,2f)); smoke.getParticleInfluencer().setVelocityVariation(0.5f); - smoke.setStartSize(0.2f); - smoke.setEndSize(0.5f); + smoke.setStartSize(0.5f); + smoke.setEndSize(1.5f); smoke.setGravity(0, 0, -0.3f); smoke.setLowLife(1.2f); smoke.setHighLife(2.5f); 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 6b0c33c7..3ec30a2c 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 @@ -800,7 +800,7 @@ public void throwPieceAnim(UUID uuid){ public void throwPiece(UUID uuid, Color throwColor){ switch(throwColor){ case ARMY -> throwShell(uuid); - case NAVY -> throwMissle(uuid); + case NAVY -> throwMissile(uuid); case CYBER -> throwMatrix(uuid); case AIRFORCE -> throwBomb(uuid); default -> throw new RuntimeException("invalid color"); @@ -815,7 +815,7 @@ public void throwPiece(UUID uuid, Color throwColor){ private void throwBomb(UUID uuid) { Vector3f targetPoint = pieces.get(uuid).getLocation(); - JetAnimation anim = new JetAnimation(app, rootNode, uuid, targetPoint, 40, 6, ()->throwPieceAnim(uuid)); + JetAnimation anim = new JetAnimation(app, rootNode, targetPoint, 40, 6, ()->throwPieceAnim(uuid)); anim.start(); } @@ -832,10 +832,10 @@ private void throwMatrix(UUID uuid) { })); } - private void throwMissle(UUID uuid) { + private void throwMissile(UUID uuid) { Vector3f targetPoint = pieces.get(uuid).getLocation(); - MissileAnimation anim = new MissileAnimation(app, rootNode, uuid, targetPoint, 2); + MissileAnimation anim = new MissileAnimation(app, rootNode, targetPoint, 2f, ()->throwPieceAnim(uuid)); anim.start(); } diff --git a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java index 4f77a6a9..bd77237a 100644 --- a/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java +++ b/Projekte/mdga/client/src/main/java/pp/mdga/client/view/GameView.java @@ -52,7 +52,6 @@ public GameView(MdgaApp app) { @Override public void onEnter() { - setOwnColor(Color.AIRFORCE); camera.init(ownColor); boardHandler.init(); guiHandler.init(ownColor);