Iterator.remove() 删除所有元素,而我想删除一个
Iterator.remove() removes all elements while I want to remove one
存在关于如何从 ArrayList 中删除特定元素而不是 ArrayList 的迭代器的问题。使用下面的代码,它删除了 ArrayList 中的所有元素,但我想删除特定元素,即与播放器发生碰撞的元素。任何人都可以告诉我如何更改此代码以使其这样做吗?提前致谢。
public void update() {
for(Iterator<Object> iter = list.iterator(); iter.hasNext();) {
Object o = iter.next();
o.update();
if(Enemy.collide == true) {
iter.remove();
}
}
}
这是对象 class(敌人和玩家 class 扩展):
package game;
public abstract class Object {
protected float x;
protected float y;
protected float sX, sY;
abstract void update();
public void render() {
Draw.Rect(x, y, sX, sY);
}
public float getX() {
return x;
}
public float getY() {
return y;
}
public float getSX() {
return sX;
}
public float getSY() {
return sY;
}
public float getCenterY() {
return y + sY/2;
}
public void removeObject(Object o) {
Game.list2.remove(o);
Game.list = Game.list2;
Enemy.collide = false;
}
}
敌人class:
package game;
import java.util.Iterator;
public class Enemy extends Object {
private int i = 0;
private int health = 100;
private int point = 0;
static boolean collide = false;
Enemy(float x, float y) {
this.x = x;
this.y = y;
this.sX = Player.size;
this.sY = Player.size;
}
void update() {
if(Physics.checkCollision(this, Game.player)) {
collide = true;
}
if(Math.abs(Game.player.x - this.x) <= 30 && Math.abs(Game.player.x - this.x) >= 1 && Physics.checkCollision(this, Game.player) != true) {
switch(i) {
case 1:
break;
case 0:
if(Game.player.x >= this.x) this.x++;
if(Game.player.x <= this.x) this.x--;
if(Game.player.y >= this.y) this.y++;
if(Game.player.y <= this.y) this.y--;
break;
}
}
}
}
玩家class:
package game;
public class Player extends Object {
public final static float size = 30;
public Player(float x, float y) {
this.x = x;
this.y = y;
this.sX = size;
this.sY = size;
}
public void update() {
}
public void moveY(double magY) {
y += magY;
}
public void moveX(double magX) {
x += magX;
}
}
第一个大问题,请将您的 Object
class 重命名为 GameObject
。我没有看到任何 import game.Object
,因此假设您的 Enemy
和 Player
class 从 java.lang.Object
.
扩展
那么,collide
应该是一个非静态字段,以允许每个实例的冲突。
for(Iterator<Object> iter = list.iterator(); iter.hasNext();) {
Object o = iter.next();
o.update();
if(o.collide == true) {
iter.remove();
}
}
此外,您可以简单地执行 collide = Physics.checkCollision(this, Game.player
而不是使用 if
。这允许在碰撞结束时将 collide
布尔值设置为 false
。
最后,你应该检查 Physics.checkCollision(this, Game.player)
returns 是否是预期的结果 =)
祝你好运!
我注意到的一些 WTFs:
public abstract class Object
- 认真的?!不要将您自己的 类 命名为 java.lang
中的 类 或标准库中的其他 类。
static boolean collide = false;
ofc 你的迭代器遍历你的列表并删除所有它们。只有那些独立于具体实例的字段才应该是静态的。可能实际问题有所不同,但我强烈建议更改该部分的设计。
float
在处理图形时准确性很差。它应该会导致很多舍入错误。
Physics.checkCollision(this, Game.player)
显示此代码,我还建议将此代码移至 Object
并使用适当的设计模式来处理真正发生碰撞的对象的不同情况。
存在关于如何从 ArrayList 中删除特定元素而不是 ArrayList 的迭代器的问题。使用下面的代码,它删除了 ArrayList 中的所有元素,但我想删除特定元素,即与播放器发生碰撞的元素。任何人都可以告诉我如何更改此代码以使其这样做吗?提前致谢。
public void update() {
for(Iterator<Object> iter = list.iterator(); iter.hasNext();) {
Object o = iter.next();
o.update();
if(Enemy.collide == true) {
iter.remove();
}
}
}
这是对象 class(敌人和玩家 class 扩展):
package game;
public abstract class Object {
protected float x;
protected float y;
protected float sX, sY;
abstract void update();
public void render() {
Draw.Rect(x, y, sX, sY);
}
public float getX() {
return x;
}
public float getY() {
return y;
}
public float getSX() {
return sX;
}
public float getSY() {
return sY;
}
public float getCenterY() {
return y + sY/2;
}
public void removeObject(Object o) {
Game.list2.remove(o);
Game.list = Game.list2;
Enemy.collide = false;
}
}
敌人class:
package game;
import java.util.Iterator;
public class Enemy extends Object {
private int i = 0;
private int health = 100;
private int point = 0;
static boolean collide = false;
Enemy(float x, float y) {
this.x = x;
this.y = y;
this.sX = Player.size;
this.sY = Player.size;
}
void update() {
if(Physics.checkCollision(this, Game.player)) {
collide = true;
}
if(Math.abs(Game.player.x - this.x) <= 30 && Math.abs(Game.player.x - this.x) >= 1 && Physics.checkCollision(this, Game.player) != true) {
switch(i) {
case 1:
break;
case 0:
if(Game.player.x >= this.x) this.x++;
if(Game.player.x <= this.x) this.x--;
if(Game.player.y >= this.y) this.y++;
if(Game.player.y <= this.y) this.y--;
break;
}
}
}
}
玩家class:
package game;
public class Player extends Object {
public final static float size = 30;
public Player(float x, float y) {
this.x = x;
this.y = y;
this.sX = size;
this.sY = size;
}
public void update() {
}
public void moveY(double magY) {
y += magY;
}
public void moveX(double magX) {
x += magX;
}
}
第一个大问题,请将您的 Object
class 重命名为 GameObject
。我没有看到任何 import game.Object
,因此假设您的 Enemy
和 Player
class 从 java.lang.Object
.
那么,collide
应该是一个非静态字段,以允许每个实例的冲突。
for(Iterator<Object> iter = list.iterator(); iter.hasNext();) {
Object o = iter.next();
o.update();
if(o.collide == true) {
iter.remove();
}
}
此外,您可以简单地执行 collide = Physics.checkCollision(this, Game.player
而不是使用 if
。这允许在碰撞结束时将 collide
布尔值设置为 false
。
最后,你应该检查 Physics.checkCollision(this, Game.player)
returns 是否是预期的结果 =)
祝你好运!
我注意到的一些 WTFs:
public abstract class Object
- 认真的?!不要将您自己的 类 命名为java.lang
中的 类 或标准库中的其他 类。static boolean collide = false;
ofc 你的迭代器遍历你的列表并删除所有它们。只有那些独立于具体实例的字段才应该是静态的。可能实际问题有所不同,但我强烈建议更改该部分的设计。float
在处理图形时准确性很差。它应该会导致很多舍入错误。Physics.checkCollision(this, Game.player)
显示此代码,我还建议将此代码移至Object
并使用适当的设计模式来处理真正发生碰撞的对象的不同情况。