好的,所以在我的游戏设计课上,我们使用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
        }
    }
}

最佳答案

我想我看到了您的错误(调试也应显示此错误):

这是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条生命的火箭。只需重复使用当前的火箭,直到其死亡即可。

10-06 08:48