2016-11-14 3 views
0

Я работаю над игрой/симулятором, и мне нужен таймер, который показывает прошедшее время с начала игры.Добавление часов с истекшим временем игры (Java)

Я использую класс SimpleWindow как окно, называемое SimulationWindow, где представлены визуальные эффекты моделирования. Основной класс (Именованный имитатор) выполняет большинство вычислений.

Мне нужны часы, показанные в SimulationWindow и NOT в основном классе. Я имею в виду, что я не хочу использовать System.out.println, чтобы показать результат в моделировании основного класса (я знаю, как это сделать), но результат должен автоматически обновляться каждую секунду в SimulationWindow.

Я пытаюсь сделать функцию в классе SimulationWindow, но не могу заставить ее работать. Он должен начинать отсчет, как только открывается SimulationeWindow (когда игра начинается).

код из основного класса, класс Simulation:

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 timer() как статический – developer

+0

Я забыл статическую часть, спасибо большое! Но когда функция теперь выглядит следующим образом: \t публичный статический долго таймер (длинный CURRENTTIME) { \t \t долгое время = CURRENTTIME; \t \t время возврата; Я не могу назвать это: \t \t super.writeText («Время прошло:» + таймер (длинный)) – djokerndthief

+0

Вы можете добавить полный код для обоих SimulationWindow и моделирования классов? – developer

ответ

0

, как указано в моих комментариях, вы можете сделать метод statictimer(), а затем вызвать его как SimulationWindow.timer(currentTime);:

статический метод таймера:

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

Я получил его до сих пор, и теперь это исправлено. Спасибо. Однако я не могу заставить его работать в SimulationWindow, чтобы показать прошедшее время. Я пробую это: \t \t super.moveTo (395, 780); \t \t супер.println («Прошло время:» + таймер()) Прошу прощения, я не знаю, как отформатировать код в комментарии ...:/ – djokerndthief

+0

Можете ли вы добавить полный код для классов SimulationWindow и Simulation? update ur question – developer

+0

Теперь он обновлен! :) – djokerndthief

Смежные вопросы