0

好的,所以在我的游戏设计课上,我们使用 GreenFoot 来创建游戏。她要求我们在公平的同时制作最难的小行星游戏。所以我决定添加一定数量的火箭生命。我把它全部设置好了,它可以工作,它永远不会减少火箭的生命,那我该怎么做呢?

这是我的代码:

import greenfoot.*;  // (World, Actor, GreenfootImage, and Greenfoot)
import java.util.List;

/**
 * A rocket that can be controlled by the arrowkeys: up, left, right.
 * The gun is fired by hitting the 'space' key.
 * 
 * @author Poul Henriksen
 * @author Michael Kölling
 * 
 * @version 2.0
 */
public class Rocket extends Mover
{
    private int gunReloadTime;              // The minimum delay between firing the gun.
    private int reloadDelayCount;           // How long ago we fired the gun the last time.
    private Vector acceleration;            // A vector used to accelerate when using booster.
    private Vector deacceleration;
    private int shotsFired;                 // Number of shots fired.
    private int rocketLives;
    private int collisionDamage = 999;

    private GreenfootImage rocket = new GreenfootImage("rocket.png");
    private GreenfootImage rocketWithThrust = new GreenfootImage("rocketWithThrust.png");

    /**
     * Initialise this rocket.
     */
    public Rocket()
    {
        gunReloadTime = 10;
        reloadDelayCount = 0;
        acceleration = new Vector(0, 0.035);    // used to accelerate when thrust is on
        deacceleration = new Vector(0, -0.035);
        increaseSpeed(new Vector(13, 0.3));   // initially slowly drifting
        shotsFired = 0;
        rocketLives = 3;
    }

    /**
     * Do what a rocket's gotta do. (Which is: mostly flying about, and turning,
     * accelerating and shooting when the right keys are pressed.)
     */
    public void act()
    {
        if (rocketLives == 0)
        {
            getWorld().removeObjects(getWorld().getObjects(null));
            Greenfoot.stop();
        }
        else
        {
             move();
             checkKeys();
             checkCollision();
             reloadDelayCount++;
        }
    }

    /**
     * Return the number of shots fired from this rocket.
     */
    public int getShotsFired()
    {
        return shotsFired;
    }

    /**
     * Set the time needed for re-loading the rocket's gun. The shorter this time is,
     * the faster the rocket can fire. The (initial) standard time is 20.
     */
    public void setGunReloadTime(int reloadTime)
    {
        gunReloadTime = reloadTime;
    }

    /**
     * Check whether we are colliding with an asteroid.
     */
    private void checkCollision() 
    {
        Asteroid asteroid = (Asteroid) getOneIntersectingObject(Asteroid.class);
        if (asteroid != null)
        {
            getWorld().addObject(new Explosion(), getX(), getY());
            getWorld().addObject(new Rocket(), (1350/2)-20, 1000/2);
            if(isTouching(Asteroid.class)) {
                asteroid.hit(999);
            }
            getWorld().removeObject(this);
            rocketLives--;
        }
    }

    /**
     * Check whether there are any key pressed and react to them.
     */
    private void checkKeys() 
    {
        ignite(Greenfoot.isKeyDown("w"));

        if(Greenfoot.isKeyDown("s")) {
            deignite(Greenfoot.isKeyDown("s"));
        }
        if(Greenfoot.isKeyDown("a")) {
            turn(-5);
        }        
        if(Greenfoot.isKeyDown("d")) {
            turn(5);
        }
        if(Greenfoot.isKeyDown("space")) {
            fire();
        }
        if(Greenfoot.isKeyDown("shift")) {
            int ran1 = (int)(Math.random()*1350);
            int ran2 = (int)(Math.random()*1000);
            getWorld().addObject(new Asteroid(), ran1, ran2);
        }
    }

    /**
     * Should the rocket be ignited?
     */
    private void ignite(boolean boosterOn) 
    {
        if (boosterOn) {
            setImage(rocketWithThrust);
            acceleration.setDirection(getRotation());
            increaseSpeed(acceleration);
        }
        else {
            setImage(rocket);        
        }
    }

    private void deignite(boolean boosterOn) 
    {
        if (boosterOn) {
            setImage(rocketWithThrust);
            deacceleration.setDirection(getRotation());
            increaseSpeed(deacceleration);
        }
        else {
            setImage(rocket);        
        }
    }

    /**
     * Fire a bullet if the gun is ready.
     */
    private void fire() 
    {
        if (reloadDelayCount >= gunReloadTime) {
            Bullet b = new Bullet(getMovement().copy(), getRotation());
            getWorld().addObject(b, getX(), getY());
            b.move();
            shotsFired++;
            reloadDelayCount = 0;   // time since last shot fired
        }
    }
}
4

1 回答 1

2

我想我看到了你的错误(调试也应该显示这个):

它是以下部分checkCollision()

getWorld().addObject(new Rocket(), (1350/2)-20, 1000/2); //here
if(isTouching(Asteroid.class)) {
  asteroid.hit(999);
}
getWorld().removeObject(this); //and here

在发生碰撞时,您向世界添加一个火箭(初始化为 3 条生命)并移除当前的火箭。因此,您始终拥有拥有 3 条生命的火箭。只需重复使用当前的火箭,直到它死亡。

于 2016-01-27T16:16:47.477 回答