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.
This commit is contained in:
Hanno Fleischer
2024-10-11 11:46:37 +02:00
parent 9df809ded5
commit 3838766504
3 changed files with 63 additions and 24 deletions

View File

@@ -23,10 +23,10 @@ map.own=maps/map1.json
# 2, 3 # 2, 3
# defines four shots, namely at the coordinates # defines four shots, namely at the coordinates
# (x=2, y=0), (x=2, y=1), (x=2, y=2), and (x=2, y=3) # (x=2, y=0), (x=2, y=1), (x=2, y=2), and (x=2, y=3)
robot.targets=2, 0,\ robot.targets=2, 3,\
2, 1,\ 2, 4,\
2, 2,\ 2, 5,\
2, 3 2, 8
# #
# Delay in milliseconds between each shot fired by the RobotClient. # Delay in milliseconds between each shot fired by the RobotClient.
robot.delay=500 robot.delay=500

View File

@@ -14,6 +14,8 @@
import java.lang.System.Logger; import java.lang.System.Logger;
import java.lang.System.Logger.Level; import java.lang.System.Logger.Level;
import java.util.Timer;
import java.util.TimerTask;
/** /**
* This class is used to handle the effects for impacts * 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) { public void createHitEffect(Node battleshipNode, Shot shot) {
ParticleEmitter hitEffect = new ParticleEmitter("HitEffect", Type.Triangle,30); createFieryEffect(battleshipNode,shot, "HitEffect", 30, 0.45f, 0.1f, -0.5f, 1f , 2f, false);
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());
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));
} }
/** /**

View File

@@ -82,6 +82,7 @@ private Spatial handleHit(Shot shot) {
final Node shipNode = requireNonNull((Node) getSpatial(ship), "Missing ship node"); final Node shipNode = requireNonNull((Node) getSpatial(ship), "Missing ship node");
effectHandler.createHitEffect(shipNode, shot); effectHandler.createHitEffect(shipNode, shot);
effectHandler.createFireEffect(shipNode, shot);
return null; return null;
} }