Игра «Танковая дуэль» в Greenfoot Error BulletCollisionJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Игра «Танковая дуэль» в Greenfoot Error BulletCollision

Сообщение Anonymous »

Я делаю простую игру для двух игроков в Greenfoot про танки. Они стреляют друг в друга.
Моя проблема в том, что когда я добавляю дополнительный метод в класс 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);
}
}
Пункт 1:

Код: Выделить всё

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);
}
}
}
Bullet2:

Код: Выделить всё

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);
}
}
}
Игрок 1:

Код: Выделить всё

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;
}
}
Игрок2:

Код: Выделить всё

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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»