gpt4 book ai didi

java - 使用 TimerTask 延迟攻击效果不佳

转载 作者:行者123 更新时间:2023-12-02 06:18:45 24 4
gpt4 key购买 nike

我正在制作一款格斗游戏,我希望玩家的行动能够计时,这样你就不能乱发攻击键并轻松获胜。

这是我进行键盘操作和延迟的地方。它第一次确实会延迟,但随后延迟会随着时间慢慢减少,最终为 0,让你可以发送垃圾邮件 key 。正如你所看到的,我做了很多事情来尝试阻止 key 在延迟等情况下注册。

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();
}
}
}

最佳答案

最简单的方法就是记住上次的时间。

所以:

 private long lastTime = 0;

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

// Do action
}

所有带有计时器等的东西都只是从比您需要的复杂得多的架构来实现这一点。

关于java - 使用 TimerTask 延迟攻击效果不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21208563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com