2017-01-04 2 views
1

В моей платформенной игре у меня есть таймер качания, который тикает следующий метод каждые 17 миллисекунд. Именно здесь я запускаю различные события, которые мне нужно запустить. Мой план состоял в том, чтобы спать таймер на 1 секунду всякий раз, когда игрок умирал.Как спать/ждать Java Swing Timer

Моя проблема заключается в том, что у меня нет четкого понимания того, как спать таймер разворота. Каждый пример, на который я смотрю, включает использование Thread, который не является тем, что я делаю. Когда я делаю следующее, я получаю ошибку IllegalMonitorStateException.

public void actionPerformed(ActionEvent e) 
{ 
    if (!louis.isDead) 
    { 
     if (louis.right) 
     { 
      louis.moveR(); 
     } 
     if (louis.left) 
     { 
      louis.moveL(); 
     } 
     if (!louis.left && !louis.right) 
      louis.friction(); 

     louis.gravity(); 

     louis.checkCol(charMap, mapX, mapY); 

     mapX -= louis.moveX(); 
     mapY -= louis.moveY(); 

     louis.checkDeath(charMap, mapX, mapY); 
    } 
    else 
    { 
     try { 
      time.wait(1000); 
     } catch (InterruptedException e1) {e1.printStackTrace();} 
     mapX = initMapX; 
     mapY = initMapY; 
     louis = new Player(spawnX, spawnY); 
    } 
    repaint(); 
} 

Заранее спасибо

+0

'Каждый пример, который я смотрю на предполагает использование таймера внутри Thread' - I Я этого никогда не видел. Таймер вообще не имеет отношения к Thread. Начните с чтения раздела из учебника Swing [Как использовать таймеры Swing] (http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html) для рабочего примера. – camickr

ответ

2

Моя проблема заключается в том, что я на самом деле не имеют твердое понимание того, как спать таймер качели.

У вас нет. Вы ничего не спите в Swing, если только вы не хотите, чтобы весь ваш GUI спал. Вместо этого почему бы просто не записать время начала, проверить прошедшее время с каждым тиком, а затем активировать любой код, который вы хотите активировать, когда истекшее время больше, чем ваше отсечение?

Не уверен, что вы пытаетесь сделать, но, возможно, что-то в этом роде диапазона (код не тестировался)

private static final long TOTAL_DEATH_TIME = 1000L; // total time of your delay 

private long deathInitTime = -1L; // start time of death throes 

public void actionPerformed(ActionEvent e) { 
    if (!louis.isDead) { 

     // .... etc... unchanged from your code 

    } else { 
     // he's dead 
     if (deathInitTime < 0) { 
      // if dead but just now dead, initialize deathInitTime 
      deathInitTime = System.currentTimeMillis(); 
     } else { 
      // he's been dead 
      // check how long he's been dead 
      long deathTime = System.currentTimeMillis() - deathInitTime; 
      if (deathTime > TOTAL_DEATH_TIME) { 
       // if he's been dead long enough, call this code 
       mapX = initMapX; 
       mapY = initMapY; 
       louis = new Player(spawnX, spawnY); 
       deathInitTime = -1L; // and re-initialize deathInitTime 
      } 
     } 
    } 
    repaint(); 
} 
Смежные вопросы