【问题标题】:libGDX - Using different InputProcessors for different screens?libGDX - 为不同的屏幕使用不同的 InputProcessor?
【发布时间】:2016-10-12 19:50:44
【问题描述】:

我不明白 InputProcessor 应该如何工作。

我有多个 Screens 用于游戏。我创建了一个MyInputProcessorclass implements InputProcessor。在我的MenuState classGdx.input.setInputProcessor 到一个类的实例。

  1. 首先,我应该如何访问和设置在MainMenu class in MyInputProcessor 中定义的变量?例如,如果我希望 touchDown 方法更改变量。

  2. 如果我切换Screens,是否必须创建一个新的InputProcessor class 来检查其他触摸事件?我显然不希望它继续检查用于MainMenu class 的东西。我应该如何使用它?

  3. 我是否应该为每个Screen 创建一个全新的InputProcessor

我觉得这一切都非常令人困惑。非常感谢您的帮助。

【问题讨论】:

  • 输入通常与每个屏幕紧密耦合,因此常见的模式是让每个屏幕实现 InputProcessor,然后在屏幕的 show() 方法中调用 Gdx.input.setInputProcessor(this)。基本上,是的,您需要定义如何处理每个屏幕上的输入。使用 Stages 是您现在可以选择忽略的另一种可能性。 Stage 还实现了 InputProcessor。通常,人们将 Stages 用于 UI 事物(按钮、输入)。
  • 非常感谢您的澄清。 InputProcessor 把我搞糊涂了。

标签: java android libgdx


【解决方案1】:

是的,通常您为每个 Screen 创建一个 InputProcessor,或者为每个需要处理输入的对象创建一个更好的方法。此对象可以是Screen,但也可以是Player
因此,每个需要获得任何输入通知的对象都应该实现 InputProcessor 并处理相关输入。
还要确保将您的InputProcessor 设置为当前活动的(使用Gdx.input.setInputProcessor)。
例如,Screens 可以在show 方法中将自己设置为当前的InputProcessor(并最终在hide 中注销自己)。 如果您想一次使用多个InputProcessors(例如在GameScreen 中,Player 使用“w,a,s,d”控制,但您想在“上显示PauseMenu Esc"),只需使用 InputMultiplexer 并在该多路复用器上注册每个 InputProcessor
如果您使用InputMultiplexer,请务必注意InputProcessor-methods 的返回值:
- 返回true,如果处理器处理了事件(例如在Players InputProcessor,当“w”、“a”、“s”或“d”被按下时)。 - 返回false,当您没有处理事件时(例如在Players InputProcessor,当按下“Esc”时)。
InputMulitplexer 将通过所有InputProcessors 并将事件发送给他们,其中一个返回true。所有其他人都不会收到有关该事件的通知。
另请注意,Stage 是一个InputProcessor,它将事件分发给它的Actors。因此,如果您想处理 Actors 中的输入,请确保将 Stage 设置为当前的 InputProcessor

【讨论】:

  • 非常感谢您的帮助。您是否建议在使用一键式手柄制作基本手机游戏时使用阶段
  • 不小心发了上面的评论。继续“一”:触摸游戏?还是矫枉过正?我没有这方面的经验,我应该有吗?
  • 好吧,Stage 有一些优点,但也有一些缺点。它适用于任何 UI(如菜单)和小型游戏。 Stage 已经支持在Actors 上的点击/触摸,而如果没有Stage,您将不得不自己搜索被触摸的对象。另一方面,Stage 变成了almost impossible using an MVC-pattern,这对于大型游戏来说非常重要。所以我肯定会为 UI 使用Stage,并考虑将它用于较小的游戏。但是看看它在 Libgdx wiki 上的文档!
  • 我一定会的。谢谢!
  • 如果你想使用Stage,你应该阅读documentation。不需要其他经验,你总是在没有经验的情况下开始新事物:) 但是你应该从小处着手,也许在开始实际游戏之前尝试创建菜单?
【解决方案2】:

您是否使用Stage 作为您的InputProcessor? 如果是,我假设您对每个屏幕都有单独的 Stage 实例。

您应该将Actors 添加到舞台并让他们处理输入。 如果你想组合更多的输入处理器,你可以这样做:

InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(yourCustomInputProcessor);
multiplexer.addProcessor(stage)
Gdx.input.setInputProcessor(multiplexer);

编辑 不要在主屏幕的构造函数中调用Gdx.input.setInputProcessor,而是在它出现的那一刻调用。

【讨论】:

  • 感谢您的回答。尽管我完全迷失了,但我将不得不阅读这一点。现在我只有一个实现InputProcessor 的类,当我更改屏幕检查是否有事情发生时,我创建了一个实例。我不使用阶段,因为我以前从未遇到过它们。
  • Stages 非常好,你只需创建你喜欢的任何Actor,然后在屏幕的draw 方法中调用stage.update()stage.draw()stage.update() 将在它包含的每个 Actor 上调用方法 act()。因此,当您创建扩展 Actor 时,您需要覆盖这两个方法。
  • 感谢您的帮助。我会更多地了解舞台和演员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
相关资源
最近更新 更多