当前位置: 首页 > 知识库问答 >
问题:

如何设置按键持续时间?

汪坚
2023-03-14

我正在尝试创建一个蛇游戏,我使用箭头键或WASD移动蛇。最初,蛇的速度很慢,并且以每秒2帧的速度移动(就像经典的蛇游戏),我希望当我按住其中一个键时,蛇的移动速度更快,当我松开它时,将其设置为原始速度。

我试着在按下ON键的情况下改变移动速度:

scene.setOnKeyPressed(event -> {input = event.getCode().toString();
            for (String acceptedKey : acceptedKeys) {
                if (event.getCode().toString().contains(acceptedKey)) {
                    movement.setRate(4);
                    break;
                }
            }
        });

然后在我发布时将其更改为正常速率:

scene.setOnKeyReleased(event -> movement.setRate(1));

*运动是一条时间线,从游戏开始到蛇停止或死亡。

代码按我的预期工作,但每次我按下一个键时,它都会加速一个周期,然后变慢。我希望速度只有在我按住一个键一段时间(比如400毫秒)时才会改变,所以有没有办法我可以放一个if语句来检查onKeypress()的持续时间?

共有1个答案

乌靖
2023-03-14

与其在监听器中处理这种复杂的逻辑,不如设置一个布尔标志,当按下某个键时,该标志会被打开。

scene.setOnKeyPressed(event -> {input = event.getCode().toString();
            for (String acceptedKey : acceptedKeys) {
                if (event.getCode().toString().contains(acceptedKey)) {
                    acceptedKeyBeingPressed = true;
                    break;
                }
            }
        });
scene.setOnKeyReleased(event -> acceptedKeyBeingPressed = false);

然后,当按下标志acceptedKeyPressedtrue时,使用某种numtickshold变量跟踪时间。

检查每个勾号上的acceptedKeyPressed是否为真。当按下acceptedKeyPressedfalse时,将numtickshold变量重置为0。如果为,则增加1。如果numtickshold高于某个阈值,移动。设置速率(4)

我不知道tick/update方法在您的框架中是什么样子的,但它应该是这样的:

public void tick() {
    if(acceptedKeyPressed) {
        numTicksHeld++;
        if(numTicksHeld > KEY_HELD_THRESHOLD)
            movement.setRate(4)
    } else {
        numTicksHeld = 0;
        movement.setRate(1)
    }
}
 类似资料:
  • 我试图用libgdx做一个游戏,但有一个问题。我已经找得很好了,但我找不到解决办法。

  • 问题内容: 我正在寻找Play 2.0持续集成设置的想法。它会包含典型的工作,例如在git push之后进行构建,每晚进行部署并部署到测试Heroku实例等。此外,代码质量和测试覆盖率指标的生成也很方便。 目前,堆栈看起来像带Java的Play 2.0,但可能会更改为Scala。 对于“传统” Java Web应用程序,我将使用Hudson / Jenkins。我找到了适用于Play的Hudson

  • 如何在同一个字母中设置助记符解析。在我的项目中,在button中设置助记符,但button<code>setText</code>在每个事件操作中都会发生变化,但在<code>_o</code>中助记符是相同的,但短键只在一个事件中起作用。如何解决这个问题 抱歉,我的< code >英语

  • 问题内容: 为了测试并发的goroutine,我在函数中添加了一行代码,以使其花费随机的时间返回(最多一秒钟) 但是,当我编译时,出现此错误 。\ crawler.go:49:无效操作:rand.Int31n(1000)* time.Millisecond(int32和time.Duration类型不匹配) 有任何想法吗?如何乘以持续时间? 问题答案: 和是不同的类型。您需要将转换为,例如。

  • 我需要创建3个如下所示的表 学生(SID:CHAR(12),SNAME:VARCHAR(50),BDATE:日期,地址:VARCHAR(50),SCITY:VARCHAR(20),年份:CHAR(20),GPA:FLOAT) 公司(CID:CHAR(8),CNAME:VARCHAR(20)) 应用(SID:CHAR(12),CID:CHAR(8)) (粗体属性为主键) 但是我不确定如何设置外键,因

  • 问题内容: 在我的组织中,我们有200多个Microsoft桌面和Web应用程序。我正在尝试为那些应用程序设置持续集成和持续部署(我已经为Java应用程序做过)。我们已经在企业Github,Jenkins,Nexus,XL- Deploy和XL- Release中使用了以下工具。我们还开发了Groovy的框架,该框架由Jenkins调用,并在Jenkins中分配了所有自动创建的工作,并将生成的工件