gpt4 book ai didi

java - 新对象似乎改变了先前对象的字段

转载 作者:行者123 更新时间:2023-12-01 22:53:06 25 4
gpt4 key购买 nike

我正在编写一个游戏,其中包含电梯作为障碍。电梯在屏幕左侧或右侧生成,并且有随机机会成为上升电梯或下降电梯。它看起来像这样:

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++;
}

我的问题是,每当创建新的电梯时,所有当前的电梯都会将其方向更改为新电梯的方向。因此,假设我绘制了两个上升的电梯,每当我的第三个电梯被创建为下降时,另外两个先前上升的电梯现在就会上升!

这是什么原因造成的?

最佳答案

这是你的问题:

public static boolean ascending;
^^^^^^

static 表示“这是一个由所有对象共享字段”。因此,如果您更改了一个对象的字段,该类型的所有对象都会注意到这一点。

删除它以使ascending成为实例字段意味着Elevator的每个实例都将拥有其自己的副本,它可以自行修改而无需更改其他实例的副本。

关于java - 新对象似乎改变了先前对象的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24454439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com