对用户Keyevents作出反应,但不包括laggs JavaFx
我想做的第一件事是为我的英语道歉,我会尽量写得通俗易懂。 另外,我已经试着寻找这个问题的解决方案,但直到现在我才找到 代码中有问题的部分如下所示:对用户Keyevents作出反应,但不包括laggs JavaFx,java,javafx,Java,Javafx,我想做的第一件事是为我的英语道歉,我会尽量写得通俗易懂。 另外,我已经试着寻找这个问题的解决方案,但直到现在我才找到 代码中有问题的部分如下所示: //eventmanagement for the bat scene.setOnKeyPressed (new EventHandler <KeyEvent> () { public void moveBat(double speed) { if ((speed > 0) &
//eventmanagement for the bat
scene.setOnKeyPressed (new EventHandler <KeyEvent> () {
public void moveBat(double speed) {
if ((speed > 0) && ((bat.getLayoutX() + bat.getWidth())<scene.getWidth())){
bat.setLayoutX(bat.getLayoutX() + speed);
}
if ((speed < 0) && ((bat.getLayoutX() > 0))){
bat.setLayoutX(bat.getLayoutX() + speed);
}
};
@Override
public void handle(KeyEvent event){
if (event.getCode().toString() == "RIGHT"){
this.moveBat(batVelocity);
}
if (event.getCode().toString() == "LEFT"){
this.moveBat(-batVelocity);
}
}
});
//bat的事件管理
scene.setOnKeyPressed(新的EventHandler(){
公用移动蝙蝠(双速){
如果((速度>0)和((bat.getLayoutX()+bat.getWidth())0))){
bat.setLayoutX(bat.getLayoutX()+速度);
}
};
@凌驾
公共无效句柄(KeyEvent事件){
if(event.getCode().toString()==“RIGHT”){
这是moveBat(batVelocity);
}
if(event.getCode().toString()=“左”){
这个.moveBat(-batVelocity);
}
}
});
这个东西可以工作,但是如果我按下左键,我不会取消按下,所以让它保持按下状态,那么“蝙蝠”将向左移动一次,然后延迟大约1秒,然后继续向左移动
我想在左键保持按下时,在左方向上继续移动。有人知道如何解决这个问题吗
非常感谢您的时间和回答
Crutz因此,
OnKeyPressed
在第一次按下某个键时触发,然后每隔一秒钟左右触发一次。如果您希望连续发生一些事情,而不是在<代码> OnKeKEngEng/<代码>事件发生时,考虑“<代码> OnKyPress的< /COD>”和“代码> OnKelpEng/<代码>控制某种类型的<代码>布尔键按下,并在某种类型的while循环中使用该代码。因此,onkeyppressed
将设置keyipressed=true
,而onkeyereleased
将做相反的事情因此,onkeyppressed
在第一次按下某个键时触发,然后每隔一秒左右触发一次。如果您希望连续发生一些事情,而不是在<代码> OnKeKEngEng/<代码>事件发生时,考虑“<代码> OnKyPress的< /COD>”和“代码> OnKelpEng/<代码>控制某种类型的<代码>布尔键按下,并在某种类型的while循环中使用该代码。因此,onkeyppressed
将设置keyipressed=true
,而onkeyereleased
将执行相反的操作,因此您要做的是将键码保存到列表中,并在动画计时器中进行检查:
字段:
private List<KeyCode> input = new ArrayList<>();
scene.setOnKeyPressed((KeyEvent event) -> {
input.add(event.getCode());
});
scene.setOnKeyReleased((KeyEvent event) -> {
input.remove(event.getCode());
});
if (input.contains(KeyCode.RIGHT)) {
//do something
}
if (input.contains(KeyCode.LEFT)) {
//do something else
}
在动画计时器中:
private List<KeyCode> input = new ArrayList<>();
scene.setOnKeyPressed((KeyEvent event) -> {
input.add(event.getCode());
});
scene.setOnKeyReleased((KeyEvent event) -> {
input.remove(event.getCode());
});
if (input.contains(KeyCode.RIGHT)) {
//do something
}
if (input.contains(KeyCode.LEFT)) {
//do something else
}
因此,您要做的是将关键码保存到列表中,并在AnimationTimer中选中它: 字段:
private List<KeyCode> input = new ArrayList<>();
scene.setOnKeyPressed((KeyEvent event) -> {
input.add(event.getCode());
});
scene.setOnKeyReleased((KeyEvent event) -> {
input.remove(event.getCode());
});
if (input.contains(KeyCode.RIGHT)) {
//do something
}
if (input.contains(KeyCode.LEFT)) {
//do something else
}
在动画计时器中:
private List<KeyCode> input = new ArrayList<>();
scene.setOnKeyPressed((KeyEvent event) -> {
input.add(event.getCode());
});
scene.setOnKeyReleased((KeyEvent event) -> {
input.remove(event.getCode());
});
if (input.contains(KeyCode.RIGHT)) {
//do something
}
if (input.contains(KeyCode.LEFT)) {
//do something else
}
请看和:,这在各方面都是错误的。按如下方式比较按键操作
event.getCode()==KeyCode.RIGHT
好的,非常感谢!!:)请看和:,这在各方面都是错误的。按如下方式比较按键操作event.getCode()==KeyCode.RIGHT
好的,非常感谢!!:)不是一个while循环,它将锁定应用程序。使用时间线
将图形作为关键帧的事件,按此键播放,释放时停止。@MouseEvent谢谢,你说得对,我没在想,我打得很快。这个帮助了我,谢谢你的时间线评论!!不是一个while循环,它将锁定应用程序。使用时间线
将图形作为关键帧的事件,按此键播放,释放时停止。@MouseEvent谢谢,你说得对,我没在想,我打得很快。这个帮助了我,谢谢你的时间线评论@克鲁兹,我的回答对你有帮助吗?如果不让我知道。如果:那么请将其标记为答案!嗨,我尝试了答案,但我仍然有同样的问题!可悲的是,它并没有改变任何事情。如果我一直按下右边的按钮,它仍然会等待一秒钟,直到它不断向右移动。@Crutz我的回答对你有帮助吗?如果不让我知道。如果:那么请将其标记为答案!嗨,我尝试了答案,但我仍然有同样的问题!可悲的是,它没有改变任何事情。如果我一直按下右键,它仍然会等待一秒钟,直到它不断向右移动。