我正在写一个游戏,其中电梯是一个障碍。电梯在屏幕的左侧或右侧产生,并且有随机的机会成为上升电梯或下降电梯。看起来像这样:
public class Elevator extends WorldObject {
public static boolean ascending;
public Elevator(int screenHeight, int xPos) {
super(xPos, screenHeight, 0, 0);
ascending = new Random().nextBoolean();
}
static public boolean isAscending(){
return ascending;
}
}
它扩展的WorldObject看起来像这样:
public class WorldObject {
protected float posX;
protected float posY;
protected float velX, velY;
public float getPosX() {
return posX;
}
public void setPosX(float posX) {
this.posX = posX;
}
public float getPosY() {
return posY;
}
public void setPosY(float posY) {
this.posY = posY;
}
public float getVelX() {
return velX;
}
public void setVelX(float velX) {
this.velX = velX;
}
public float getVelY() {
return velY;
}
public void setVelY(float velY) {
this.velY = velY;
}
public WorldObject(float posX, float posY, float velX, float velY) {
this.posX = posX;
this.posY = posY;
this.velX = velX;
this.velY = velY;
}
}
每隔5秒就会创建一个电梯并将其添加到
Elevator
的ArrayList中,如下所示: if (timeToElevator > 5.0f) {
timeToElevator = 0;
Elevator elevator = new Elevator((int) screenHeight, (int) generateElevatorXPos());
Sprite eSprite = new Sprite(elevatorTexture);
eSprite.setOrigin(0, 0);
elevators.add(elevator);
elevatorSprites.add(eSprite);
}
然后,我检查每个电梯与播放器之间的碰撞,如果超出范围,则将其移除,并且如果两者均未发生,我将更新电梯对象的位置:
public static void calculateElevatorCollisions() {
int counter = 0;
for (Iterator<Elevator> i = elevators.iterator(); i.hasNext(); ) {
Elevator item = i.next();
if (item.getPosY() < -100) {
//remove elevator
} else if (..collision..) {
//collision
} else {
item.setVelY(item.isAscending() ? -5 : 5);
item.setPosY(item.getVelY() + item.getPosY());
elevatorSprites.get(counter).setPosition(item.getPosX(),
item.getPosY());
counter++;
}
我的问题是,每当创建新的
Elevator
时,所有当前Elevator
的方向都会更改为新Elevator
的方向。因此,假设我绘制了两个上升的电梯,每当第三个电梯创建为下降时,其他两个先前的上升电梯现在都将上升!是什么原因造成的?
最佳答案
这是你的问题:
public static boolean ascending;
^^^^^^
static
表示“这是所有对象共享的类字段”。因此,如果您从一个对象更改了该字段,它将在该类型的所有对象中被注意到。删除它以使
ascending
成为实例字段意味着Elevator
的每个实例将具有其自己的副本,可以在不更改其他实例的副本的情况下自行修改。关于java - 一个新对象似乎改变了先前对象的字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24454439/