簡體   English   中英

為什么碰撞后我的火箭彈壽命不會減少?

[英]Why won't my rocket lives decrease upon collision?

好的,所以在我的游戲設計課上,我們使用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條生命的火箭。 只需重復使用當前的火箭,直到其死亡即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM