2014-01-18 3 views
0

Я делаю файтинг, и я хочу, чтобы действия игрока были приурочены, чтобы вы не могли спамить ключ атаки и выиграть легко.Задержка атаки с таймером Не работает хорошо

Здесь я делаю материал клавиатуры и задерживаю. Он задерживает первый раз, но затем он медленно замедляется во времени и заканчивается тем, что он равен 0, и позволяет вам спамить ключ. Как вы можете видеть, что я сделал много вещей, чтобы попытаться остановить ключ от регистрации в задержке и т.д.

public void keyPressed(KeyEvent e) { 
    int key = e.getKeyCode(); 
    if (isAction == false) { 
     if (key == KeyEvent.VK_LEFT) { 
      dx = -1; 
      if (nHeroX < -10) { 
       dx = 0; 
      } 
      isRight = false; 
      isMoving = true; 
     } else if (key == KeyEvent.VK_RIGHT) { 
      dx = 1; 
      if (nHeroX > 1200) { 
       dx = 0; 
      } 
      isRight = true; 
      isMoving = true; 
     } else if (key == KeyEvent.VK_C) { 
      dx = 0; 
      isAction = true; 
      isMoving = false; 
      isBlock = true; 
      nImage = 1; 
     } else if (key == KeyEvent.VK_X) { 
      dx = 0; 
      isAction = true; 
      isMoving = false; 
      isWeak = true; 
      nImage = 2; 
     } else if (key == KeyEvent.VK_Z) { 
      dx = 0; 
      isAction = true; 
      isMoving = false; 
      isStrong = true; 
      nImage = 3; 
     } else if (key == KeyEvent.VK_P) { 
      if (!pause) { 
       pause = true; 
      } else if (pause) { 
       pause = false; 
      } 
     } 
    } 
} 

public void keyReleased(KeyEvent e) { 
    int key = e.getKeyCode(); 
    if (key == KeyEvent.VK_LEFT || key == KeyEvent.VK_RIGHT && !isAction) { 
     dx = 0; 
     isMoving = false; 
     nState = nImage = 1; 
    } else if (key == KeyEvent.VK_C && !isWeak && !isStrong) { 
     delayTask = new DelayTask(); 
     tmrDelay.schedule(delayTask, 0, 500); 
    } else if (key == KeyEvent.VK_X && !isBlock && !isStrong) { 
     z = new DelayTask(); 
     tmrDelay.schedule(z, 0, 450); 
    } else if (key == KeyEvent.VK_Z && !isBlock && !isWeak) { 
     x = new DelayTask(); 
     tmrDelay.schedule(x, 0, 1200); 
    } 
    nImgNum = (int) (Math.random() * 6 + 1); 
    nDelay = 0; 
} 

//http://www.javaprogrammingforums.com/java-se-api-tutorials/883-how-use-tmrDelay-java.html 
class DelayTask extends TimerTask { 

    public int nTimes = 0; 

    @Override 
    public void run() { 
     nTimes++; 
     if (nTimes == 2) { 
      isAction = isBlock = isStrong = isWeak = false; 
      nState = nImage = 1; 
     } 
    } 
} 

Может кто-то объяснить, почему моя задержка перепутались? Спасибо.

Кроме того, этот код:

private class Keys extends KeyAdapter { 

    @Override 
    public void keyPressed(KeyEvent e) { 
     hero.keyPressed(e); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     hero.keyReleased(e); 
     if (hero.getPause()) { 
      repaint(); 
     } 
    } 
} 
+1

Почему бы не использовать 'System.currentTimeMillis()' вместо 'TimerTask'? – Justin

+0

Не используйте 'java.util.Timer' с приложениями Swing, поскольку вы рискуете столкнуться с проблемами Threading Swing. –

+0

Вместо того, чтобы пытаться задержать нажатия клавиш или использовать любой тип таймера, почему бы не работать с другой стороны уравнения - если объект Player игнорирует ввод клавиатуры, если он слишком близко расположен. Дайте ему длинное поле, которое является временем последнего ввода клавиатуры, и если дельта недостаточно велика, просто проигнорируйте ввод, верните. Я бы использовал Key Bindings, а не KeyListener. –

ответ

2

Самый простой способ сделать это просто вспомнить последний раз.

Итак:

private long lastTime = 0; 

void doAction() { 
    long timeNow = System.currentTimeMillis() 
    if (lastTime + MIN_DELAY < timeNow) { 
     return; 
    } 
    lastTime = timeNow; 

    // Do action 
} 

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

+0

Точно. 1+ по голосу. –

+0

Я сделал что-то вроде того, что вы сделали, потому что ваш код не работал в моей программе. Я инициализировал lastTime как System.currentTime() и сделал if (timeNow - lastTime

+0

Да, это тот же алгоритм, написанный несколько иначе. Должно работать просто отлично :) –

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

  • Нет связанных вопросов^_^