Я делаю файтинг, и я хочу, чтобы действия игрока были приурочены, чтобы вы не могли спамить ключ атаки и выиграть легко.Задержка атаки с таймером Не работает хорошо
Здесь я делаю материал клавиатуры и задерживаю. Он задерживает первый раз, но затем он медленно замедляется во времени и заканчивается тем, что он равен 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();
}
}
}
Почему бы не использовать 'System.currentTimeMillis()' вместо 'TimerTask'? – Justin
Не используйте 'java.util.Timer' с приложениями Swing, поскольку вы рискуете столкнуться с проблемами Threading Swing. –
Вместо того, чтобы пытаться задержать нажатия клавиш или использовать любой тип таймера, почему бы не работать с другой стороны уравнения - если объект Player игнорирует ввод клавиатуры, если он слишком близко расположен. Дайте ему длинное поле, которое является временем последнего ввода клавиатуры, и если дельта недостаточно велика, просто проигнорируйте ввод, верните. Я бы использовал Key Bindings, а не KeyListener. –