Java 在另一个 class 中更改静态变量不会影响对象值

Java changing static variable in another class doesn't affect object value

我有一个要更改的变量 SCROLL_SPEED

这个变量是static并且定义在下面class:

public class ScrollHandler {

    public static int SCROLL_SPEED = -57;
    public final int TOWER_GAP = 200;

    private GameWorld gameWorld;

    public ScrollHandler(GameWorld gameWorld, float yPos) {
        this.gameWorld = gameWorld;

        GameWorld.obstacle1 = new Obstacle(210, 0, 25, 0, SCROLL_SPEED, yPos);
        GameWorld.obstacle2 = new Obstacle(GameWorld.obstacle1.getTailX() + TOWER_GAP, 0, 25, 0, SCROLL_SPEED, yPos);
        GameWorld.obstacle3 = new Obstacle(GameWorld.obstacle2.getTailX() + TOWER_GAP, 0, 25, 0, SCROLL_SPEED, yPos);
        GameWorld.obstacle4 = new Obstacle(GameWorld.obstacle3.getTailX() + TOWER_GAP, 0, 25, 0, SCROLL_SPEED, yPos);
    }

    public void update(float delta) {
        // Update our objects
        GameWorld.obstacle1.update(delta);
        GameWorld.obstacle2.update(delta);
        GameWorld.obstacle3.update(delta);
        GameWorld.obstacle4.update(delta);

        // Check if any of the obstacles are scrolled left,
        // and reset accordingly
        if (GameWorld.obstacle1.isScrolledLeft()) {
            GameWorld.obstacle1.reset(GameWorld.obstacle4.getTailX() + TOWER_GAP);
        } else if (GameWorld.obstacle2.isScrolledLeft()) {
            GameWorld.obstacle2.reset(GameWorld.obstacle1.getTailX() + TOWER_GAP);
        } else if (GameWorld.obstacle3.isScrolledLeft()) {
            GameWorld.obstacle3.reset(GameWorld.obstacle2.getTailX() + TOWER_GAP);
        } else if (GameWorld.obstacle4.isScrolledLeft()) {
            GameWorld.obstacle4.reset(GameWorld.obstacle3.getTailX() + TOWER_GAP);
        }
    }

当我将 SCROLL_SPEED 通常更改为 public static int SCROLL_SPEED = -285 时,它工作得很好。

但是当我像下面这样从另一个 class 更改 SCROLL_SPEED 时,它不起作用(值仍然相同):

try {
        turbomode = new Rectangle(GameWorld.obstacle2.getX() - GameRenderer.generator2.getValue2(),
                GameWorld.obstacle2.getY() + GameRenderer.generator2.getValue1(), 15, 15);
        if ((Intersector.overlaps(GameWorld.wizard.getBoundingRectangle(), turbomode))){
            GameRenderer.TurboModeActive = true;
            activeItem = true;
            case1 = true;
            if (activeItem){
                System.out.println("TEST 1");
                ScrollHandler.SCROLL_SPEED = -285;
            } else{
                ScrollHandler.SCROLL_SPEED = -57;
            }
            System.out.println("TEST 2");
            new java.util.Timer().schedule(
                    new java.util.TimerTask() {
                        public void run() {
                            GameRenderer.TurboModeActive = false; 
                            activeItem = false;
                            case1 = false;
                        }
                    },
                    8000
            );
        }
} catch (NullPointerException e){
    System.out.println("TEST 3");
}

我知道它通过 if 语句,因为它打印出 TEST 1,但我不知道为什么它不起作用。有人可以告诉我可能是什么问题吗?

这是时间问题。

GameWorld.obstacle1 = new Obstacle(210, 0, 25, 0, SCROLL_SPEED, yPos);

如果在创建 obstacle1 之后更改 SCROLL_SPEED,那将不再有任何效果。这个障碍已经有了它的价值。

所以你需要找到障碍物实例并改变它的速度实例变量,或者让障碍物看你的静态变量而不是它自己的变量。

如果你想改变SCROLL_SPEED并影响所有障碍物,你只需要移除SCROLL_SPEEDObstacle 构造器直接调用 ScrollHandler.SCROLL_SPEED障碍需要的时候

所以

GameWorld.obstacle1 = new Obstacle(210, 0, 25, 0, SCROLL_SPEED, yPos);

成为

GameWorld.obstacle1 = new Obstacle(210, 0, 25, 0, yPos);

并在 Obstacle 构造函数中调用 ScrollHandler.SCROLL_SPEED