2016-11-14 97 views
0

我正在制作游戏/模拟器,我需要一个计时器来显示游戏开始以来的经过时间。在游戏中添加一个经过时间的时钟(Java)

我使用的是“SimpleWindow”类为窗口,叫SimulationWindow,对于模拟的视觉呈现。主要类(命名模拟)完成大部分计算。

我想在SimulationWindow而不是在主类显示的时钟。我的意思是我不想使用System.out.println在主类Simulation中显示结果(我知道该怎么做),但结果需要在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; 

} 

}

但我不知道如何发送currentTime的主类,即是应该在SimulationWindow功能返回时间,以便它可以在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的); ?我错过了什么吗?当然,你需要将标记timer()方法作为静态 – 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超。println(“Time passed:”+ timer()) 对不起,我不知道如何格式化代码的评论...:/ – djokerndthief

+0

您可以为SimulationWindow和Simulation类添加完整的代码吗?更新你的问题 – developer

+0

它现在更新! :) – djokerndthief