【发布时间】:2019-01-22 01:20:28
【问题描述】:
我正在尝试制作一个非常简单的游戏,但它仍然可能需要同时使用大约 8 个键。
使用 keyListener,我可以花大约 3-4 个延迟,这是我不想要的。
我不知道如何使用 keyBinding,我认为它可以解决我的问题。 (请不要只放这个链接,我已经看过它以及其他来源:https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)
我的第一个猜测是向 keyListener 添加线程,但我不知道如何做到这一点,查找它并没有给我很好的答案。
private void makeKeyListeners() {
f.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch (key) {. . .}
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
switch (key) {. . .}
}
});
}
使用这个,我没有得到足够的输入(无法检测到同时按下的 8 个键)
所以我最大的问题是;如何一次从 8 个以上的键中获取输入?
如果解决此问题的最佳方法是使用 keyBindings,您能帮我一个忙并深入解释一下吗?
【问题讨论】:
-
上面的代码没有记录所有八次按键,这让我难以置信。我们可能需要查看其余代码,并提供一些输出来说明为什么您认为没有多次按键。 (P.S. Swing 不是线程安全的,所以你不能用多线程来解决这个问题。游戏的多线程很棘手,无论如何用户输入应该是一个线程完成的。)
-
“我的第一个猜测是向 keyListener 添加线程,” 好吧,这是个坏主意,因为 Swing 是单线程的,并且事件将在事件调度线程上传递.我鼓励使用键绑定,因为它解决了
KeyListener的主要问题之一——焦点问题。假设您不需要同时激活所有键,我将使用 Set,它定义了哪些键被激活,并允许游戏“主循环”简单地检查它以确定需要采取哪些操作 -
“无法检测到同时按下的 8 个键” 这不是 Swing 的问题,而是硬件的限制
-
您可能想阅读this 并深入了解键盘和驱动程序的工作原理
-
和this了解更多详情
标签: java multithreading keylistener