added the missing solution for exercise 12
ships will now sink when destroyed and will be removed when they are fully submerged
This commit is contained in:
		
						parent
						
							44a25a2e1f
						
					
				
				
					commit
					ca57507b53
				
			@@ -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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user