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_SPEED 从 Obstacle 构造器直接调用 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
我有一个要更改的变量 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_SPEED 从 Obstacle 构造器直接调用 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