Моя проблема в том, что когда я добавляю дополнительный метод в класс Bullet1 или Bullet2, игра выдает ошибку, когда один игрок попадает в другое (например, игрок 1 попадает пулей в игрока 2). Это выдает мне терминальную ошибку:
Код: Выделить всё
Caused by: greenfoot.ActorRemovedFromWorld
at greenfoot.World.removeObject(World.java:466)
at Bullet1.checkCollision(Bullet1.java:34)
at Bullet1.act(Bullet1.java:23)
... 4 more ....
Код: Выделить всё
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
public class BATTLEFIELD extends World {
public BATTLEFIELD() {
super(800, 400, 1, false);
prepare();
}
private void prepare() {
Wall wall = new Wall();
addObject(wall, getWidth()/2, getHeight()/2 - 110);
Wall2 wall2 = new Wall2();
addObject(wall2, getWidth()/2, getHeight()/2 + 110);
Counter counter1 = new Counter("Player 1 HP: ");
Counter counter2 = new Counter("Player 2 HP: ");
addObject(counter1, getWidth()/2 - 320, getHeight()/2 - 180);
addObject(counter2, getWidth()/2 + 320, getHeight()/2 - 180);
Player1 player1 = new Player1(counter1);
Player2 player2 = new Player2(counter2);
addObject(player1, 50, getHeight() / 2);
addObject(player2, getWidth() - 50, getHeight() / 2);
}
}
Код: Выделить всё
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
public class Bullet1 extends Actor {
private Player1 player1;
private GreenfootImage hitImage;
private int damage = 5;
public Bullet1(Player1 player1) {
this.player1 = player1;
hitImage = new GreenfootImage("explode1.png");
}
public void act() {
move(20);
checkCollision();
bulletCollision(); // this is the problem when I add any additional method in this act method
}
private void checkCollision() {
Actor player = getOneIntersectingObject(Player2.class);
if (player != null) {
((Player2)player).takeDamage(damage);
setImage(hitImage);
Greenfoot.playSound("takingDamageSFX.mp3");
Greenfoot.delay(4);
getWorld().removeObject(this);
}
}
private void bulletCollision() {
Actor bullet2 = getOneIntersectingObject(Bullet2.class);
if (bullet2 != null) {
setImage(hitImage);
Greenfoot.delay(4);
World world = getWorld();
world.removeObject(bullet2);
world.removeObject(this);
}
}
}
Код: Выделить всё
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
public class Bullet2 extends Actor {
private Player2 player2;
private int damage = 5;
private GreenfootImage hitImage;
public Bullet2(Player2 player2) {
this.player2 = player2;
setRotation(180);
hitImage = new GreenfootImage("explode1.png");
}
public void act() {
move(20);
checkCollision();
bulletCollision(); // this is the problem when I add any additional method in this act method
}
private void checkCollision() {
Actor player = getOneIntersectingObject(Player1.class);
if (player != null) {
((Player1)player).takeDamage(damage);
setImage(hitImage);
Greenfoot.playSound("takingDamageSFX.mp3");
Greenfoot.delay(4);
getWorld().removeObject(this);
}
}
private void bulletCollision() {
Actor bullet1 = getOneIntersectingObject(Bullet1.class);
if (bullet1 != null) {
setImage(hitImage);
Greenfoot.delay(4);
World world = getWorld();
world.removeObject(bullet1);
world.removeObject(this);
}
}
}
Код: Выделить всё
import greenfoot.*;
public class Player1 extends Actor {
private int speed = 5;
private int reloadTime = 10;
private int reloadDelay = 0;
private int hp = 100;
private GreenfootImage explodedImage;
private GreenfootImage shieldedImage;
private GreenfootImage baseImage;
private Counter counter;
private boolean shieldActive = false;
private int shieldDuration = 300;
private int shieldTimer = 0;
public Player1(Counter counter) {
setRotation(270);
this.counter = counter;
counter.setValue(hp);
explodedImage = new GreenfootImage("explode2.png");
shieldedImage = new GreenfootImage("shielded_blue_tank.png");
baseImage = new GreenfootImage("tank_blue.png");
}
public void act() {
movementKeys();
checkBoundaries();
manageShield();
reloadDelay++;
}
private void movementKeys() {
if (Greenfoot.isKeyDown("w")) {
setLocation(getX(), getY() - speed);
}
if (Greenfoot.isKeyDown("s")) {
setLocation(getX(), getY() + speed);
}
if (Greenfoot.isKeyDown("space")) {
shootBullet();
}
}
private void shootBullet() {
if (reloadDelay >= reloadTime) {
getWorld().addObject(new Bullet1(this), getX(), getY());
Greenfoot.playSound("firingSFX.mp3");
reloadDelay = 0;
}
}
public void takeDamage(int damage) {
hp -= damage;
counter.setValue(hp);
if (hp = shieldDuration) {
deactivateShield();
}
}
}
public void activateShield() {
shieldActive = true;
setImage(shieldedImage);
}
public void deactivateShield() {
shieldActive = false;
setImage(baseImage);
}
public boolean isShieldActive() {
return shieldActive;
}
}
Код: Выделить всё
import greenfoot.*;
public class Player2 extends Actor {
private int speed = 5;
private int reloadTime = 10;
private int reloadDelay = 0;
private int hp = 100;
private Counter counter;
private GreenfootImage explodedImage;
public Player2(Counter counter) {
GreenfootImage image = getImage();
image.mirrorVertically();
setImage(image);
setRotation(270);
this.counter = counter;
counter.setValue(hp);
explodedImage = new GreenfootImage("explode2.png");
}
public void act() {
movementKeys();
checkBoundaries();
reloadDelay++;
}
private void movementKeys() {
if (Greenfoot.isKeyDown("up")) {
setLocation(getX(), getY() - speed);
}
if (Greenfoot.isKeyDown("down")) {
setLocation(getX(), getY() + speed);
}
if (Greenfoot.isKeyDown("enter")) {
shootBullet();
}
}
private void shootBullet() {
if (reloadDelay >= reloadTime) {
getWorld().addObject(new Bullet2(this), getX(), getY());
Greenfoot.playSound("firingSFX.mp3");
reloadDelay = 0;
}
}
public void takeDamage(int damage) {
hp -= damage;
counter.setValue(hp);
if (hp
Подробнее здесь: [url]https://stackoverflow.com/questions/78680539/tank-duel-game-in-greenfoot-error-bulletcollision[/url]
Мобильная версия