From 3838766504a361aa2772e5acc24b6dfe3afb05b3 Mon Sep 17 00:00:00 2001 From: Hanno Fleischer Date: Fri, 11 Oct 2024 11:46:37 +0200 Subject: [PATCH] added a fire effect for hit ships this will now display a burning fire at the position where the ships was hit and displays it until thge ship is removed. --- Projekte/battleship/client/client.properties | 8 +- .../battleship/client/gui/EffectHandler.java | 78 ++++++++++++++----- .../client/gui/SeaSynchronizer.java | 1 + 3 files changed, 63 insertions(+), 24 deletions(-) diff --git a/Projekte/battleship/client/client.properties b/Projekte/battleship/client/client.properties index 89d59df4..e38eac8b 100644 --- a/Projekte/battleship/client/client.properties +++ b/Projekte/battleship/client/client.properties @@ -23,10 +23,10 @@ map.own=maps/map1.json # 2, 3 # defines four shots, namely at the coordinates # (x=2, y=0), (x=2, y=1), (x=2, y=2), and (x=2, y=3) -robot.targets=2, 0,\ - 2, 1,\ - 2, 2,\ - 2, 3 +robot.targets=2, 3,\ + 2, 4,\ + 2, 5,\ + 2, 8 # # Delay in milliseconds between each shot fired by the RobotClient. robot.delay=500 diff --git a/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/EffectHandler.java b/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/EffectHandler.java index 37152dbc..e4a7f0e1 100644 --- a/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/EffectHandler.java +++ b/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/EffectHandler.java @@ -14,6 +14,8 @@ import java.lang.System.Logger; import java.lang.System.Logger.Level; +import java.util.Timer; +import java.util.TimerTask; /** * This class is used to handle the effects for impacts @@ -36,32 +38,68 @@ public EffectHandler(Application app) { } /** - * this method is used to create a hit effect at a position + * creates a new HitEffect * - * @param battleshipNode the node of the battleship where the effect should be attached to + * @param battleshipNode the node of the ship + * @param shot the shot which triggered the effect */ public void createHitEffect(Node battleshipNode, Shot shot) { - ParticleEmitter hitEffect = new ParticleEmitter("HitEffect", Type.Triangle,30); - hitEffect.setMaterial(particleMat); - hitEffect.setImagesX(2); - hitEffect.setImagesY(2); - hitEffect.setStartColor(ColorRGBA.Orange); - hitEffect.setEndColor(ColorRGBA.Red); - hitEffect.getParticleInfluencer().setInitialVelocity(new Vector3f(0,1,0)); - hitEffect.setStartSize(0.45f); - hitEffect.setEndSize(0.1f); - hitEffect.setGravity(0, -0.5f, 0); - hitEffect.setLowLife(1f); - hitEffect.setHighLife(2f); - hitEffect.setParticlesPerSec(0); - hitEffect.setLocalTranslation(shot.getY() + 0.5f, 0 , shot.getX() + 0.5f); - LOGGER.log(Level.DEBUG, "Created HitEffect at {0}", hitEffect.getLocalTranslation().toString()); + createFieryEffect(battleshipNode,shot, "HitEffect", 30, 0.45f, 0.1f, -0.5f, 1f , 2f, false); + } - hitEffect.emitAllParticles(); + /** + * creates a new FireEffect + * + * @param battleshipNode the node of the ship + * @param shot the shot which triggered the effect + */ + public void createFireEffect(Node battleshipNode, Shot shot) { + createFieryEffect(battleshipNode, shot, "FireEffect", 30, 0.1f, 0.05f, -0.9f, 1f , 2f, true); + } - battleshipNode.attachChild(hitEffect); + /** + * creates a fiery type hit effect + * + * @param battleshipNode the ship to which the effect should be attached + * @param shot the shot that triggered the effect + * @param name the name of the particle emitter + * @param numOfParticle the overall numberOfParticles + * @param startSize the start size of the particles + * @param endSize the end size of the particles + * @param gravity the gravity of the particles + * @param lowLife the lowest lifetime of a particle + * @param highLife the maximum lifetime of a particle + * @param loop if the effect should be looped + */ + public void createFieryEffect(Node battleshipNode, Shot shot, String name, int numOfParticle, float startSize, float endSize, float gravity, + float lowLife, float highLife, boolean loop) { + ParticleEmitter fieryEffect = new ParticleEmitter(name, Type.Triangle, numOfParticle); + fieryEffect.setMaterial(particleMat); + fieryEffect.setImagesX(2); + fieryEffect.setImagesY(2); + fieryEffect.setStartColor(ColorRGBA.Orange); + fieryEffect.setEndColor(ColorRGBA.Red); + fieryEffect.getParticleInfluencer().setInitialVelocity(new Vector3f(0,1,0)); + fieryEffect.setStartSize(startSize); + fieryEffect.setEndSize(endSize); + fieryEffect.setGravity(0, gravity, 0); + fieryEffect.setLowLife(lowLife); + fieryEffect.setHighLife(highLife); - hitEffect.addControl(new EffectControl(hitEffect, battleshipNode)); + if(!loop) { + fieryEffect.setLocalTranslation(shot.getY() + 0.5f, 0 , shot.getX() + 0.5f); + fieryEffect.setParticlesPerSec(0); + fieryEffect.emitAllParticles(); + } else { + fieryEffect.setLocalTranslation(shot.getY() + 0.5f, 0 , shot.getX() + 0.5f); + fieryEffect.getLocalTranslation().subtractLocal(battleshipNode.getLocalTranslation()); + fieryEffect.setParticlesPerSec(10); + } + + battleshipNode.attachChild(fieryEffect); + LOGGER.log(Level.DEBUG, "Created {0} at {1}", name ,fieryEffect.getLocalTranslation().toString()); + + fieryEffect.addControl(new EffectControl(fieryEffect, battleshipNode)); } /** diff --git a/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/SeaSynchronizer.java b/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/SeaSynchronizer.java index 94dbc511..f233f4f2 100644 --- a/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/SeaSynchronizer.java +++ b/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/SeaSynchronizer.java @@ -82,6 +82,7 @@ private Spatial handleHit(Shot shot) { final Node shipNode = requireNonNull((Node) getSpatial(ship), "Missing ship node"); effectHandler.createHitEffect(shipNode, shot); + effectHandler.createFireEffect(shipNode, shot); return null; }