Java 使用InputProcessor检查保留的密钥

Java 使用InputProcessor检查保留的密钥,java,input,libgdx,Java,Input,Libgdx,我需要用输入处理器检查是否按下了一个键。我在网络上看到了各种各样的解决方案,一旦按下一个键,布尔值就会设置为true,而当它被释放时,布尔值就会设置为false。让我解释一下,这感觉更像是一种黑客攻击,而不是一个好的解决方案 静态方法Gdx.input.isKeyPressed(int-key)和Gdx.input.isKeyJustPressed(int-key)完全执行它们应该执行的操作。但是当我实现输入处理器接口时,我没有得到这个功能。我只得到: public boolean keyDow

我需要用输入处理器检查是否按下了一个键。我在网络上看到了各种各样的解决方案,一旦按下一个键,布尔值就会设置为true,而当它被释放时,布尔值就会设置为false。让我解释一下,这感觉更像是一种黑客攻击,而不是一个好的解决方案

静态方法
Gdx.input.isKeyPressed(int-key)
Gdx.input.isKeyJustPressed(int-key)
完全执行它们应该执行的操作。但是当我实现
输入处理器
接口
时,我没有得到这个功能。我只得到:

public boolean keyDown(int keycode) {
    return false;
}

public boolean keyUp(int keycode) {
    return false;
}
它们只注册一次,基本上是
keyDown==Gdx.input.isKeyJustPressed(int键)
。现在,对于每个我想添加功能的键,我必须在这些方法中创建一个布尔值。然后我需要在其他方法中生成另一组if语句,并在需要时调用它

因此,不是:

public boolean keyDown(int keycode) {
    if (keycode == Keys.Left) //do stuff ;
    //etc...
    return false;
}
我必须这样做:

boolean leftHold = false;

public boolean keyDown(int keycode) {
    if (keycode == Keys.Left) leftHold = true;
    //etc...
    return false;
}

public boolean keyUp(int keycode) {
    if (keycode == Keys.Left) leftHold = false;
    //etc...
    return false;
}

public void ProcessingTheInputWeGetFromTheInputPorcessor() //starting to feel ridiculous...
{
    if (leftHold) //Do stuff ;
    //etc..
}

//And call this method each frame on the object:
controlledObject.ProcessingTheInputWeGetFromTheInputPorcessor();

那么,检测InputProcessor持有的密钥的正确解决方案是什么呢?

如果不使用InputProcessor,则使用InputProcessor立即处理输入,例如

public boolean keyDown(int keyCode) {
    if (keyCode == Keys.Escape) {
        closeGame();
    }
    if (keyCode == Keys.Left) {
        startMovingLeft();
    }
}
如果你想连续地检查循环,你只需要使用静态方法
Gdx.input.isKeyPressed(int键)

public void loop() {
    if (Gdx.input.isKeyPressed(Keys.Left)) {
        moveLeft();
    }
}
但不建议这样做,因为如果在循环之间按该键,可能会错过按键操作,当然也不建议在渲染循环中这样做,因为按键操作的速率取决于帧速率


感谢noone帮助我改进答案。

无论是否按下按钮/键,
输入处理器都不应存储。这正是
Gdx.input.isXXXPressed()所做的。如果出于某种原因您想自己存储,请使用集合来存储当前按下的键码,而不是单个布尔值。不正确。对于一次按键,您可以使用Gdx.input.isKeyJustPressed()。尤其是在循环中,你不应该通过Gdx.input.isKeyPressed来处理特定于游戏性的更新,因为它依赖于帧速率,你可能会错过输入。这正是您应该使用
InputProcessor
(例如,它应该触发
startMovingLeft
stopMovingLeft
等方法。确实如此,但op要求提供一种方法,以检查
ProcessingTheInputProcessor()中的PutWeGet是否按下了键)
方法,我假定它是在循环中调用的,不一定是渲染循环,但也可以是一个单独的逻辑循环。除此之外,我得到了更正。是的,问题本身是“不正确的”。当输入“到达”时,
InputProcessor
本身应该处理输入在从外部调用
ProcessingTheInput
方法之前不要缓冲它。我已经调整了答案以反映您的评论,我相信它现在是正确的。