- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
好吧,我很抱歉这是一个非常奇怪的问题,但它让我发疯。
我通过以下方式处理游戏的 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/
这是我的代码: $( '#Example' ).on( "keypress", function( keyEvent ) { if ( keyEvent.which != 44 ) {
自从我切换到 MAC 以来,我一直讨厌这样一个事实,即我必须使用 cmd+tab 的 alt 键来隐藏窗口。 我知道有一些应用程序(如 witch )可以替代 cmd+tab 功能,但我喜欢当前的界面
我希望在文本框上按键时运行一个函数,因此我有以下代码: $("input[x]").keypress(function() { DoX(); }) 这工作正常,但在我的函数中我
我有一个场景,我想通过进行 Http REST 调用来获取匹配的字符串,将每次击键时输入框中出现的字符串发送到服务器。但它没有按我的预期工作,例如,假设输入框中的当前值为“modul”,如果我在“mo
我刚刚开始使用 p5.js,我喜欢它的简单性,但有一点我无法掌握。 我设置了以下Fiddle : function Player(location, width, height, speed, wei
这里有两个类: public class Cls implements Runnable, KeyListener Thread t; Object obj; public Cls(Thing obj
我将一些程序从学校的计算机(Mac)传输到我的家用电脑。进入我的计算机后,我注意到按键现在在每个程序中都不起作用。我花了几个小时试图找出 KeyPressed 不起作用的原因。两台电脑都使用Eclip
我正在用java为自己制作一个俄罗斯方 block 克隆,作为一个学习项目。然而,我现在陷入了获取左右移动棋子的输入部分。我不确定问题是否出在我的方法中,或者问题出在未调用的 keyPressed 方
基本上我必须为一个项目使用 Processing(并非出于选择)并且遇到了关于一次按下多个键的问题。在 keyPressed() 函数中,我有多个条件,每个都将一个键映射到一个 Action 。这一切
目前我正在使用 jQuery,尤其是该函数 keypress() 这个函数可以告诉我很多关于按下哪个键、在哪里以及何时按下的信息。但什么时候是我的问题:所以这段代码... $(document).ke
我是 JavaScript 新手,在使用“keypress”事件时遇到问题;我目前正在做一个小的跳跃脚本测试,“keydown”和“keyup”事件都起作用,但“keypress”不起作用(我尝试在事
我试图在每次字段更改时执行一个函数。首先,我使用一个简单的 textarea 和一个 div: $("#stuff").keypress(function () { $(
嘿伙计们,可能是一个简单的问题,但在网上找不到任何东西。 我有一个包含搜索结果的列表,我希望能够使用向上和向下键在列表中导航。 if (e.keyCode == 40) { //down
我当前正在通过 .click 事件添加输入,然后想要监听此输入上发生的任何按键。但是,附加内容在插入后不会触发任何事件(即模糊、按键、焦点)。有没有人有什么建议?提前致谢! $("#recipient
我想知道是否可以在表单级别当表单中有控件时处理 KeyPress 事件。 当窗体上没有控件时我可以实现这一点,但是当我添加一些东西时,比如按钮,窗体失去焦点并且我无法将其返回,即使使用 Me.Focu
情况:表单有一个文本框,用户必须在其中键入一些文本。此文本框有一个 KeyPress 事件,在该事件中,窗体的文本属性更改为用户在每次击键时键入的文本。 这是文本框按键事件的代码: private
我正在开发一个应用程序并卡住了。我有一个普通的简单按钮。我想要做的是,如果我单击此按钮,它的行为就像您在软键盘上按空格键一样。 我该怎么做。一定有办法,因为您可以开发软键盘。 所以重复 xP 如果我按
在这个页面上: https://subnetipv4.com/ 如果您单击“IP 地址”列中的任何输入框,然后按“.”或“/”键(句点或斜杠),它会跳转到下一个输入框。 或者至少,它在桌面浏览器上是这
这段代码构建正确,一切似乎都有效,但 key 什么也没做。我认为要么是 Action 监听器,要么是椭圆没有更新。我正在尝试通过初学者 java 游戏编程。我确信这很容易,但我没有捕获它。如果这有所作
我在 jTable 中有一系列文本框和组合框。我使用框中的输入来过滤 JPQL 查询的结果,这些结果显示在 jTable 上。现在,想法是使该过程自动化,以便每次用户在框中键入一个字符时,应用程序都会
我是一名优秀的程序员,十分优秀!