diff --git a/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/ShipControl.java b/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/ShipControl.java index 81acfbb1..57631af9 100644 --- a/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/ShipControl.java +++ b/Projekte/battleship/client/src/main/java/pp/battleship/client/gui/ShipControl.java @@ -14,6 +14,9 @@ import com.jme3.scene.control.AbstractControl; import pp.battleship.model.Battleship; +import java.lang.System.Logger; +import java.lang.System.Logger.Level; + import static pp.util.FloatMath.DEG_TO_RAD; import static pp.util.FloatMath.TWO_PI; import static pp.util.FloatMath.sin; @@ -48,6 +51,13 @@ class ShipControl extends AbstractControl { */ private float time; + /** + * The ship to be controlled + */ + private final Battleship battleship; + + static final Logger LOGGER = System.getLogger(ShipControl.class.getName()); + /** * Constructs a new ShipControl instance for the specified Battleship. * The ship's orientation determines the axis of rotation, while its length influences @@ -56,6 +66,8 @@ class ShipControl extends AbstractControl { * @param ship the Battleship object to control */ public ShipControl(Battleship ship) { + battleship = ship; + // Determine the axis of rotation based on the ship's orientation axis = switch (ship.getRot()) { case LEFT, RIGHT -> Vector3f.UNIT_X; @@ -63,7 +75,7 @@ public ShipControl(Battleship ship) { }; // Set the cycle duration and amplitude based on the ship's length - cycle = ship.getLength() * 2f; + cycle = battleship.getLength() * 2f; amplitude = 5f * DEG_TO_RAD / ship.getLength(); } @@ -78,17 +90,25 @@ protected void controlUpdate(float tpf) { // If spatial is null, do nothing if (spatial == null) return; - // Update the time within the oscillation cycle - time = (time + tpf) % cycle; + if (battleship.isDestroyed() && spatial.getLocalTranslation().getY() <= -0.6f) { + LOGGER.log(Level.INFO, "Ship removed {0}", spatial.getName()); + spatial.getParent().detachChild(spatial); + } else if (battleship.isDestroyed()) { + spatial.move(0, -0.05f * tpf, 0); + } else { + // Update the time within the oscillation cycle + time = (time + tpf) % cycle; - // Calculate the current angle of the oscillation - final float angle = amplitude * sin(time * TWO_PI / cycle); + // Calculate the current angle of the oscillation + final float angle = amplitude * sin(time * TWO_PI / cycle); - // Update the pitch Quaternion with the new angle - pitch.fromAngleAxis(angle, axis); + // Update the pitch Quaternion with the new angle + pitch.fromAngleAxis(angle, axis); + + // Apply the pitch rotation to the spatial + spatial.setLocalRotation(pitch); + } - // Apply the pitch rotation to the spatial - spatial.setLocalRotation(pitch); } /**