我现在一直在摸不着头脑,我真的很困惑。最近,我一直在制作游戏,现在我正在尝试重做我最初创建Camera class
的方式。它现在是Thread
的一部分,并遵循特定的Location
。
以下是代码:
public void run(){
while (game.isRunning()){
if (!lockLocation) continue;
while (center == null){
EntityHandler handler = game.getEntityHandler();
if (handler == null) continue;
center = (Entity) game.getEntityHandler().getFirst(ObjectType.PLAYER);
}
xOffset = center.getLocation().getRawX() - (Game.WIDTH / 2) + (center.getWidth() / 2);
yOffset = center.getLocation().getRawY() - (Game.HEIGHT / 2) + (center.getHeight() / 2);
}
try { thread.join(); }
catch (InterruptedException e) { e.printStackTrace(); }
}
所以这段代码在某些条件下有效。 请注意以下几行:
xOffset = center.getLocation().getRawX() - (Game.WIDTH / 2) + (center.getWidth() / 2);
yOffset = center.getLocation().getRawY() - (Game.HEIGHT / 2) + (center.getHeight() / 2);
当我保持原样时,只有yOffset
有效。当我注释掉yOffset
行时,xOffset
将停止工作(因此,两行都不起作用)。
当我注释掉xOffset
行时,与评论yOffset
很相似,yOffset
将不再有效,导致整个代码无用。
这是最奇怪的部分;当我使用System.out.println()
方法时,它们都会起作用。 (如果其中一个被评论并且放置了System.out.println()
,则取消注释的那个将起作用。)
我不知道为什么while
循环只是忽略某些行,除非它在某些条件下。我完全没理由这样做。有什么想法吗?
答案 0 :(得分:3)
是否有可能另一个线程正在更新xOffset,yOffset或center?
如果两个线程都试图更新这些变量,您可能会看到所描述的行为。您可以尝试在这两行周围添加锁定语句或synchronized
块。锁定需要与更新这些变量的其他线程共享,并且该线程还需要锁定语句。
答案 1 :(得分:2)
解决! :D答案如下:
synchronized (game.getMainThread()){
xOffset = center.getLocation().getRawX() - (Game.WIDTH / 2) + (center.getWidth() / 2);
yOffset = center.getLocation().getRawY() - (Game.HEIGHT / 2) + (center.getHeight() / 2);
}