gpt4 book ai didi

java - keyPressed 事件在第一次重复时变慢

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:13:33 25 4
gpt4 key购买 nike

好吧,我很抱歉这是一个非常奇怪的问题,但它让我发疯。

我通过以下方式处理游戏的 WASD 移动:

Action ClassWASDKeyPressed = new ClassWASDKeyPressed();
Action ClassWASDKeyReleased = new ClassWASDKeyReleased();
BitKeys movementBitKeys = new BitKeys(); //for WASD movement key pressed/releases

//pressed
theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("W"), "wButtonPress");
theDesktop.getActionMap().put("wButtonPress", ClassWASDKeyPressed);
theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("A"), "aButtonPress");
theDesktop.getActionMap().put("aButtonPress", ClassWASDKeyPressed);
theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("S"), "sButtonPress");
theDesktop.getActionMap().put("sButtonPress", ClassWASDKeyPressed);
theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("D"), "dButtonPress");
theDesktop.getActionMap().put("dButtonPress", ClassWASDKeyPressed);
//released
theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released W"), "wButtonRelease");
theDesktop.getActionMap().put("wButtonRelease", ClassWASDKeyReleased);
theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released A"), "aButtonRelease");
theDesktop.getActionMap().put("aButtonRelease", ClassWASDKeyReleased);
theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released S"), "sButtonRelease");
theDesktop.getActionMap().put("sButtonRelease", ClassWASDKeyReleased);
theDesktop.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("released D"), "dButtonRelease");
theDesktop.getActionMap().put("dButtonRelease", ClassWASDKeyReleased);

这是两个 Action 类:

class ClassWASDKeyPressed extends AbstractAction {
private static final long serialVersionUID = 1L;

public void actionPerformed(ActionEvent e) {
if (chatTextField.isFocusOwner() == false){
if (e.getActionCommand().equals("w")){
keyPressed(87);
} else if(e.getActionCommand().equals("a")){
keyPressed(65);
} else if(e.getActionCommand().equals("s")){
keyPressed(83);
} else if(e.getActionCommand().equals("d")){
keyPressed(68);
}
}
}
}

class ClassWASDKeyReleased extends AbstractAction {
private static final long serialVersionUID = 1L;

public void actionPerformed(ActionEvent e) {
if (chatTextField.isFocusOwner() == false){
if (e.getActionCommand().equals("w")){
keyReleased(87);
} else if(e.getActionCommand().equals("a")){
keyReleased(65);
} else if(e.getActionCommand().equals("s")){
keyReleased(83);
} else if(e.getActionCommand().equals("d")){
keyReleased(68);
}
}
}
}

逻辑如下:

public void keyPressed(int e) {
long endTime = System.nanoTime();
long elapsedTime = endTime - startTime;
double elapsedTimeSeconds = (double)elapsedTime / 1000000000.0;

if (elapsedTimeSeconds < .125){ //let them move 8 times a second
logger.info("KeyPressed (QUICK): " + elapsedTimeSeconds);
} else {
logger.info("KeyPressed (VALID): " + elapsedTimeSeconds);
//logger.debug("Key Pressed: " + e.getKeyChar()); //FOR TROUBLESHOOTING
movementBitKeys.keyPressed(e);
//movementBitKeys.showKeyList(); //FOR TROUBLESHOOTING

if (movementBitKeys.isKeyPressed(87) && !movementBitKeys.isKeyPressed(68) && !movementBitKeys.isKeyPressed(83) && !movementBitKeys.isKeyPressed(65)){
requestCharacterMove("North");
}
if (movementBitKeys.isKeyPressed(87) && movementBitKeys.isKeyPressed(68) && !movementBitKeys.isKeyPressed(83) && !movementBitKeys.isKeyPressed(65)){
requestCharacterMove("NorthEast");
}
if (movementBitKeys.isKeyPressed(87) && !movementBitKeys.isKeyPressed(68) && !movementBitKeys.isKeyPressed(83) && movementBitKeys.isKeyPressed(65)){
requestCharacterMove("NorthWest");
}
if (!movementBitKeys.isKeyPressed(87) && movementBitKeys.isKeyPressed(68) && !movementBitKeys.isKeyPressed(83) && !movementBitKeys.isKeyPressed(65)){
requestCharacterMove("East");
}
if (!movementBitKeys.isKeyPressed(87) && !movementBitKeys.isKeyPressed(68) && movementBitKeys.isKeyPressed(83) && !movementBitKeys.isKeyPressed(65)){
requestCharacterMove("South");
}
if (!movementBitKeys.isKeyPressed(87) && movementBitKeys.isKeyPressed(68) && movementBitKeys.isKeyPressed(83) && !movementBitKeys.isKeyPressed(65)){
requestCharacterMove("SouthEast");
}
if (!movementBitKeys.isKeyPressed(87) && !movementBitKeys.isKeyPressed(68) && movementBitKeys.isKeyPressed(83) && movementBitKeys.isKeyPressed(65)){
requestCharacterMove("SouthWest");
}
if (!movementBitKeys.isKeyPressed(87) && !movementBitKeys.isKeyPressed(68) && !movementBitKeys.isKeyPressed(83) && movementBitKeys.isKeyPressed(65)){
requestCharacterMove("West");
}
startTime = endTime;
}
}

public void keyReleased(int e) {
//logger.debug("Key Released: " + e.getKeyChar()); //FOR TROUBLESHOOTING
movementBitKeys.keyReleased(e);
//movementBitKeys.showKeyList(); //FOR TROUBLESHOOTING
}

public void keyTyped(int e) {
// not used - but in case I ever want it
}

还有 BitSet 类:

package com.jayavon.game.helper;

import java.util.BitSet;

public class BitKeys{

private BitSet keyBits = new BitSet(256);

public void keyPressed(final int keyCode) {
keyBits.set(keyCode);
}

public void keyReleased(final int keyCode) {
keyBits.clear(keyCode);
}

public void keyTyped(final int keyCode) {
// don't care
}

public boolean isKeyPressed(final int keyCode) {
return keyBits.get(keyCode);
}

public void showKeyList(){
System.out.println(keyBits.toString());
}

}

我的问题是,当您在第一次和第二次“移动”之间按住其中一个移动键时,比所需的 0.125 毫秒等待时间长得多。这是一些示例数据:

第 1 组:

6059 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(有效):2.567790275

6620 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(有效):0.560479937

6670 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(快速):0.05044696710 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(快速):0.093605166750 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(有效):0.129943376

6791 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(快速):0.040095056821 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(快速):0.070989976851 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(快速):0.1023786866902 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(有效):0.152006677

第 2 组:

9690 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(有效):2.03802468

10272 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(有效):0.582025645

10322 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(快速):0.05474932310342 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(快速):0.06989004210372 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(快速):0.10079021210412 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(有效):0.141337411

10462 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(快速):0.04948345810462 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(快速):0.04972038110512 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(快速):0.09888852410542 [AWT-EventQueue-0] 信息 com.jayavon.game.client.MyClient - KeyPressed(有效):0.128729361

现在是提问时间。显然,您第一次移动所用的时间很长,具体取决于多长时间,所以这是有道理的。我不明白为什么第二个“运动”是在 0.5 左右而不是接近 0.125。正如您从数据中看到的那样,按住键时第三步和第四步的触发速度如此之快,以至于它们小于 .125。

谁能帮我解决这个问题?任何以任何方式改进我的代码的建议都将是巨大的帮助。毫秒数。

最佳答案

由于@aioobe 的巨大帮助,我解决了这个问题。

Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
checkKeyStrokes();
}
}, 0, 0135);

public void checkKeyStrokes(){
if (movementBitKeys.isKeyPressed(87)){ //w
keyPressed(87);
}
if (movementBitKeys.isKeyPressed(65)){ //a
keyPressed(65);
}
if (movementBitKeys.isKeyPressed(83)){ //s
keyPressed(83);
}
if (movementBitKeys.isKeyPressed(68)){ //d
keyPressed(68);
}
}

希望这对其他人有帮助!!!

关于java - keyPressed 事件在第一次重复时变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13043229/

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