2016-11-14 21 views
0

私はゲーム/シミュレータで作業しています。ゲームが始まってからの経過時間を示すタイマーが必要です。ゲームに経過時間の時計を追加する(Java)

私は、SimulationWindowと呼ばれるウィンドウに "SimpleWindow"クラスを使用して、シミュレーションのビジュアルを表示します。メインクラス(名前付きシミュレート)はほとんどの計算を行います。

SimulationWindowに表示されているクロックをメインクラスには表示しません。つまり、System.out.printlnを使用してメインクラスのシミュレーションで結果を表示したくないのですが(その方法は分かりますが)、結果はSimulationWindow内で毎秒自動的に更新する必要があります。

私はSimulationWindowクラスで関数を作成しようとしていますが、それを動作させることはできません。 SimulationeWindowが開くと(ゲームが開始されると)すぐにカウントを開始する必要があります。メインクラス、シミュレーションクラスから

コード:

import java.util.ArrayList; 
import java.util.Random; 

public class Simulate { 
public static void main(String[] args) 
     throws InterruptedException { 

    SimulationWindow w = new SimulationWindow(); 
    Random rand = new Random(); 

    ArrayList<Player> player = new ArrayList<Player>(); 
    ArrayList<Player> hPlaying= new ArrayList<Player>(); 

    // long startTime = System.nanoTime(); 
    int gameOn = 1; 

    // Adds all players to the game before it starts. 

    for (int i = 1; i < 11; i++) { 

     int randNbr = rand.nextInt(3); 

     if (randNbr == 0) { 
      player.add(new BlueM(w, i, randNbr)); 
     } else if (randNbr == 1) { 
      player.add(new RedM(w, i, randNbr)); 
     } else if (randNbr == 2) { 
      player.add(new BlueS(w, i)); 
     } else if (randNbr == 3) { 
      player.add(new RedS(w, i)); 
     } else if (randNbr == 4) { 
      player.add(new BlueJ(w, i, 
        1 + rand.nextInt(5))); 
     } else if (randNbr == 5) { 
      player.add(new RedJ(w, i, 
        1 + rand.nextInt(5))); 
     } else if (randNbr == 6) { 
      player.add(new BlueA(w, i, 
        rand.nextInt(50))); 
     } else if (randNbr == 7) { 
      player.add(new RedA(w, i, 
        1 + rand.nextInt(5))); 
     } else if (randNbr == 8) { 
      player.add(new BlueT(w, i, 
        1 + rand.nextInt(5))); 
     } else if (randNbr == 9) { 
      player.add(new RedT(w, i, 
        rand.nextInt(50))); 
     } 

    } 

    // Makes all players alive. 
    for (Player h : player) { 
     hPlaying.add(h); 
    } 

    // Starts the game. 
    while (gameOn > 0) { 

     long startTime = System.nanoTime(); 

     for (Player h : player) { 

      // If the player is alive, continue 
      if (hPlaying.contains(h)) { 
       h.Step(); 
      } 
     } 
     SimulationWindow.delay(10); 

     long currentTime = System.nanoTime() - startTime; 
     SimulationWindow.timer(currentTime); 
    } 

    // long currentTime = System.nanoTime() - startTime; 

} 

}

しかし、私はになっていますSimulationWindow内の関数にメインクラスでCURRENTTIMEを送信する方法がわかりませんこのSimulationWindowに表示され、毎秒更新されるように時間を返します(または、プレーヤーがステップをとるたびに問題はありません)。

これは私がSimulationWindowで持っているものです。

import se.lth.cs.pt.window.SimpleWindow; 

public class SimulationWindow extends SimpleWindow { 
public static final int X_START_POS_BLUE = 790; 
public static final int X_END_POS_BLUE = 10; 
public static final int Y_LINE_START_BLUE = 10; 
public static final int Y_LINE_END_BLUE = 790; 
public static final int X_START_POS_RED = 10; 
public static final int X_END_POS_RED = 790; 
public static final int Y_LINE_START_RED = 790; 
public static final int Y_LINE_END_RED = 10; 

public SimulationWindow() { 
    super(800, 690, "game x"); 
    setUp(); 
} 

private void setUp() { 
    super.moveTo(X_START_POS_BLUE - 2, 
      Y_LINE_START_BLUE + 2); 
    super.writeText("1"); 
    super.moveTo(X_START_POS_RED - 2, 
      Y_LINE_START_RED + 2); 
    super.writeText("2"); 
    super.moveTo(X_START_POS_BLUE - 2, 
      Y_LINE_START_BLUE + 0); 
    super.writeText("3"); 
    super.moveTo(X_START_POS_RED - 2, 
      Y_LINE_START_RED + 0); 
    super.writeText("4"); 
    super.moveTo(X_START_POS_BLUE - 0, 
      Y_LINE_START_BLUE + 2); 
    super.writeText("5"); 
    super.moveTo(X_START_POS_RED - 0, 
      Y_LINE_START_RED + 2); 
    super.writeText("6"); 
    super.moveTo(X_START_POS_BLUE - 0, 
      Y_LINE_START_BLUE + 4); 
    super.writeText("7"); 
    super.moveTo(X_START_POS_RED - 0, 
      Y_LINE_START_RED + 4); 
    super.writeText("8"); 
    super.moveTo(X_START_POS_BLUE - 4, 
      Y_LINE_START_BLUE + 0); 
    super.writeText("9"); 
    super.moveTo(X_START_POS_RED - 4, 
      Y_LINE_START_RED + 0); 
    super.writeText("10"); 

    super.moveTo(395, 780); 
    super.println("Time passed: "+ timer()) 
} 

public static int getStartXPos(int startNbr) { 
    if (startNbr == 1 || startNbr == 3 || startNbr == 5 
      || startNbr == 7 || startNbr == 9) { 
     return X_START_POS_BLUE; 
    } else { 
     return X_START_POS_RED; 
    } 
} 

public static int getStartYPos(int startNbr) { 
    if (startNbr == 1 || startNbr == 3 || startNbr == 5 
      || startNbr == 7 || startNbr == 9) { 
     return Y_LINE_START_BLUE + startNbr * 20; 
    } else { 
     return Y_LINE_START_RED + startNbr * 20; 
    } 

} 

public static long timer(long time) { 
    return time; 

} 

}

これを、SimulationWindowクラスでは、私が仕事を得ることができないコードは次のとおりです。任意のヘルプ

super.writeText("Time passed: "+ timer()) 

グレイト!

+2

なぜあなたはSimulationWindowを呼び出すことはできません。タイマー(currentTime); ?何か不足していますか?もちろん、あなたは静的なマークタイマー()メソッドが必要です – developer

+0

私は静的な部分を忘れてしまいました、ありがとう! しかし、関数は次のようになります。 \tパブリック静的長いタイマー(ロングCURRENTTIME){ \t \t長い時間= CURRENTTIME。 \t \t返品時間; 私はそれを呼び出すように見えることはできません。 \t \t super.writeText(「時間が経過:」+タイマー(ロング)) – djokerndthief

+0

あなたはSimulationWindowとシミュレーションクラスの両方のための完全なコードを追加することはできますか? – developer

答えて

0

私のコメントに与えられたとおり、あなたはtimer()メソッドstaticを行い、その後、SimulationWindow.timer(currentTime);としてそれを呼び出すことができます。

静的タイマー方法:

public static long timer(long time); { 
    return time; 
} 
+0

私はこれまでのところそれを得て、それは今修正されました。ありがとうございました。しかし、私はそれが経過時間を表示するためにSimulationWindowで動作するように見えることはできません。私はこれを試しています: \t \t super.moveTo(395,780); \t \t super。コメントのコードを書式設定する方法がわかりません.../ – djokerndthief

+0

SimulationWindowクラスとSimulationクラスのコードを完全に追加できますか?あなたの質問を更新する – developer

+0

これは今更新されました! :) – djokerndthief

関連する問題