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