java - 使用 setOnKeyPressed 和 setOnKeyReleased 移动
问题描述
我编写了一些代码来使用 JavaFX 控制屏幕上一个小矩形的移动。基本上,我使用这些代码在游戏循环中平稳地移动玩家:
(PS:玩家是我的对象)
player.setTranslateX(player.getTranslateX() + player.velocityX);
player.setTranslateY(player.getTranslateY() + player.velocityY);
这些是键绑定:
myScene.setOnKeyPressed(e -> {
Thread t1;
t1 = new Thread(new Runnable() {
@Override
public void run() {
switch(e.getCode()) {
case A:
player.velocityX = -1;
break;
case D:
player.velocityX = 1;
break;
case W:
player.velocityY = -1;
break;
case S:
player.velocityY = 1;
break;
}
}
});
t1.start();
})
主要版本:
myScene.setOnKeyReleased(e -> {
Thread t2;
t2 = new Thread(new Runnable() {
@Override
public void run() {
switch(e.getCode()) {
case A:
player.velocityX = 0;
break;
case D:
player.velocityX = 0;
break;
case W:
player.velocityY = 0;
break;
case S:
player.velocityY = 0;
break;
}
}
});
t2.start();
})
它工作正常,但有一个错误,当我同时按下多个键并释放其中一个时,对象停止移动,直到我将手指从键上松开并再次按下键。现在我知道这与歧义概念有关,但我已经碰壁了,我对想法持开放态度。
解决方案
我之前在编写游戏时遇到过这个问题,就像你正在写的一样。
经过一堆调试,看起来问题实际上与您正在编写的代码有关,而不是与库本身有关。似乎如果您按住多个键,则接收到的按键缓冲区会“卡住”,并且在您松开并再次按下之前它不会响应。
在 Mac 上解决此问题的一种方法是在终端中运行以下命令:
defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false
这似乎解决了这种行为。对于 Windows,我们无法找到任何解决问题的方法。
推荐阅读
- vue.js - 在 vue.js 中使用 agora.io
- angular - 显示数据时未定义
- html - 绝对定位的 div 覆盖了我的内容
- android - 单击通知时,所有其他通知也消失了
- amazon-s3 - 重置生产 create-react-app 应用程序的浏览器缓存
- python - python:计算向量到矩阵每一行的欧几里得距离的最快方法?
- javascript - 从使用 gatsby-plugin-react-svg 导入 svg 接收“InvalidCharacterError:字符串包含无效字符”
- kotlin - 二阶 SOQL SOSL 注入 SFDC
- oracle - 查找所有 Goldengate 复制表的列表
- c - Solaris - 内部编译器错误:cg_inbuf_emit() 错过/搞砸了重定位