2016-05-12 191 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此線程的全部目的是我不必在任何地方更新它 –