2016-05-12 4 views
1

私はこの間私の頭を傷つけていましたが、今はかなり混乱しています。最近、私はゲームを作ってきましたが、私は最初にCamera classを作成したやり方をやり直そうとしています。現在、Threadの一部であり、特定のLocationの前後に続きます。ここでwhileループはループを無視しますか?

はコードです:

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は機能しなくなります(したがって、両方の行は機能しません)。

コメントしたyOffsetのように、xOffset行をコメントアウトすると、yOffsetは機能しなくなり、コード全体が役に立たなくなります。

ここで最も奇妙な部分です。彼らは私がSystem.out.println()メソッドを置くと両方とも動作します。 (それらのうちの1つがコメントされており、System.out.println()が置かれている場合は、コメントを外したものが動作します)。

なぜ特定の条件の下でループが特定の行を無視しているのかわかりません。私がそうすることを考える理由は全くありません。何か案は?

+0

「getLocation()」のような音は一度しか働きません。あなたは "働きを止める"を定義する必要があります。 – John3136

+2

これはほぼ間違いなく[Data Race](https://docs.oracle.com/cd/E19205-01/820-0619/geojs/index.html)です。 – Natecat

+0

デバッグの最も重要な部分の1つは、正しい質問。 https://www.google.com/#q=scientific+method。 * "なぜ特定の条件を満たさない限りwhileループが特定の行を無視しているのかわからない。" *あなたのコードが "特定の行を無視する"という保証はありません。あなたの質問は、あなたが有効な仮説を作成することを確認するだけで悪いことではありません。 –

答えて

3

別のスレッドがxOffset、yOffset、またはcenterを更新している可能性はありますか? 2つのスレッドが両方ともこれらの変数を更新しようとすると、説明されている動作が表示されることがあります。これら2つの行の周囲にブロックまたは​​ブロックを追加することができます。ロックは、これらの変数を更新している他のスレッドと共有する必要があり、そのスレッドもロック文を必要とします。

+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

LOL明らかに私はそれを変更する_Somewhere_。私はどこを修正するのか正確には分かりませんが、明らかに私はこうしています:Pこのスレッドの目的は全部でしたので、どこにでも更新する必要はありませんでした –

関連する問題