LIBGDX:InputAdapter的keyDown、keyUp等方法返回值的含义是什么?

4

我在处理多个使用keyDown/keyUp的独立InputAdapters时遇到了问题。

Gdx.input.setInputProcessor(new InputMultiplexer(keyboardController1, keyboardController2, keyboardController3));

只有第一个在行中工作,其他的不起作用; 在这种情况下是keyboardController1。 我猜测这与keyDown()方法末尾的return true;有关。 我试图阅读文档、教程、帖子等等,但我仍然无法很好地掌握返回值的含义和作用,也不知道应该将其设置为哪个布尔值。 我的问题是: keyDown/keyUp(以及诸如此类)的布尔返回值意味着什么?

3个回答

6
您返回的布尔值应该是:
  1. 如果此 InputProcessorInputAdapter 处理了输入,则为 true。
  2. 如果未处理输入,则为 false。
想象一下游戏,两个玩家在同一台电脑上玩(例如分屏)。一个玩家用 "WASD" 控制,第二个玩家用 "箭头键" 控制。因此,第一个玩家的 InputProcessor 仅处理 "WASD" 键,第二个玩家的 InputProcessor 仅处理 "箭头键"。如果按下的键是 "W、A、S 或 D",则第一个 InputProcessor 处理它,您不需要将其交给第二个。因此,您返回 true。如果按下的键是 "箭头键" 中的一个,则第一个 InputProcessor 不会处理它,因此您返回 false。
复用器得到此返回值并说:
  1. 返回值为 true,输入已处理,请将其丢弃。
  2. 返回值为 false,未处理输入,请将其传递给下一个处理器。
希望您明白我在说什么 :P
编辑:方法 keyDown(int keyCode)keyUp(int keyCode) 和其他方法都有 int keyCode,告诉您按下了哪个键。通常您使用 switch 来知道按下了哪个键。此 switch 如下所示:
switch(keyCode) {
case Keys.W:
     // Handle the event for "W" key pressed
case Keys.A:
     // Handle the event for "A" key pressed
// Other cases
default:
     return false;
}
return true;

对于您在评论中提出的另一个问题:如果1个玩家由W、A、S、D控制,则他不需要处理其他键的输入。因此,如果他没有处理输入,则返回false;否则返回true。 第二个玩家由箭头键控制,因此他不需要处理其他键,如W、A、S或D键。 如果您有多个必须处理相同的键,则必须返回false,以便将事件传递给每个。

谢谢你的回答。在我看来,你的回答有些出入。如果两个玩家都需要处理他们的输入,但处理流程不相同,为什么WASD应该返回true,而箭头键返回false呢?此外,你所说的事件是指keyDown()一般,还是"W" keyDown()是一个事件,"A" keyDown()是另一个事件? - coffeenet
keyDown 是一个事件。你可以通过它获取 int keyCode。通常使用 switch 语句来检查 keycode。但是等等,我会在我的答案中更新这些内容。 - Robert P
谢谢您的快速回复!期待更新 :) - coffeenet
很好的解释!我现在明白了。谢谢Springrbau!:) - coffeenet
没问题。我很高兴能帮助你。如果您有其他问题,请随时问(: - Robert P

2

如果你在游戏中有多个输入处理器,并且希望在一个处理器处理完条件后,它不应该去到其他处理器,则返回true;

否则,如果你希望它也能够去到其他处理器,则应该返回false。

考虑一个情况,在此情况下,你有两个输入处理器,并且两者均拥有按键按下事件。如果你的条件是仅有一个处理器执行,则从两个按键按下事件中都返回true,否则返回false。


非常感谢您提供的详尽答案。我会测试一下,并稍后再与您联系。 - coffeenet

1

您链接的文档如下所述:

返回:输入是否被处理

返回 true 意味着该处理程序已处理事件,并且不会触发任何在其后的处理程序。

如果您希望其他处理器也能接收事件并让它们进行处理,则第一个处理程序需要 return false


谢谢你的回答。你所说的“其他处理器在排队”是什么意思?此外,如果我有五个输入处理程序都需要处理事件,前四个应该返回false,而最后一个第五个应该返回true,对吗?把它们全部设置为false有什么危害吗? - coffeenet
在编程中,“other processors in line” 意味着输入多路复用器中当前处理器之后的其他处理器。如果将它们全部设置为 false,则 libgdx 将通过不执行任何操作来“处理”它。 - noone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接