2016-05-12 106 views
1

我一直在这个短短的一段时间里对我的头脑发疯,而且我真的很困惑。最近,我一直在做一个游戏,现在我正在尝试重做我最初创建Camera class的方式。它现在是Thread的一部分,并且遵循特定的Locationwhile循环忽略行吗?

下面是代码:

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行时,很像注释yOffsetyOffset将不再起作用,呈现整个代码无用。

这是最古怪的部分;他们都会工作,当我把System.out.println()方法。 (如果其中一个被评论并且放置了System.out.println(),那么未注释的将会有效)。

我不知道为什么while循环只是忽略某些行,除非它在某些条件下。我完全没有理由这样做。有任何想法吗?

+0

听起来像'getLocation()'只能工作一次。你需要定义“停止工作”。 – John3136

+2

这几乎肯定是[数据竞赛](https://docs.oracle.com/cd/E19205-01/820-0619/geojs/index.html) – Natecat

+0

可以说,调试的最重要的部分之一就是要求正确的问题。 https://www.google.com/#q=scientific+方法。 *“我不知道为什么while循环忽略某些行,除非它在某些条件下”*我保证你的代码不是“忽略某些行”。不要说你的问题不好,只要确保你创建了一个有效的假设。 –

回答

3

是否有可能另一个线程正在更新xOffset,yOffset或center? 如果两个线程都试图更新这些变量,您可能会看到所描述的行为。您可以尝试在这两行中添加锁定语句或​​块。该锁将需要与更新这些变量的其他线程共享,并且该线程还需要锁定状态。

+0

不幸的是,没有。在游戏中没有其他位置正在修改xOffset和yOffset变量,而不是在此Camera类中。(我做了一个项目搜索,以确保这些方法和变量的使用) –

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); 
} 
+2

所以,当你说“不幸的是,没有。”在你对@DavidWaters的回答发表评论时,我想你的意思是“其实,是的”:) –

+0

哈哈,显然我修改它_somewhere_。我没有确切地看到我修改它的位置,但显然我确实:P此线程的全部目的是我不必在任何地方更新它 –