【发布时间】:2016-09-08 23:46:40
【问题描述】:
我已经在这个问题上摸索了一会儿,我真的很困惑。最近,我一直在制作游戏,现在我正在尝试重做我最初创建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 循环只是忽略某些行,除非它在某些条件下。我绝对没有理由这样做。有什么想法吗?
【问题讨论】:
-
听起来像
getLocation()只工作一次。您需要定义“停止工作”。 -
这几乎肯定是Data Race
-
可以说调试中最重要的部分之一就是提出正确的问题。 google.com/#q=scientific+method 。 “我不知道为什么 while 循环只是忽略某些行,除非它在某些条件下” 我向您保证您的代码不是“忽略某些行”。不要说你的问题不好,只要确保你提出了一个有效的假设。
-
您需要提供更多信息。哪些线程正在访问/修改
center?一个好的开始是使用synchronized块来处理竞争条件(如@Natecat 所述)。 -
Data Race 似乎是我问题的最准确表述。我将如何解决数据竞赛? (我会尝试使用同步块)
标签: java