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

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/

10-11 22:19
查看更多