好的,所以在我的游戏设计课上,我们使用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条生命的火箭。只需重复使用当前的火箭,直到其死亡即可。