LibGDX InputMultiplexer失效求助:直接设置Stage可正常处理输入
解决LibGDX InputMultiplexer仅添加Stage时失效的问题
看起来你遇到的问题有点奇怪——毕竟只把Stage放进Multiplexer,理论上应该和直接把Stage设为输入处理器效果一致。不过我可以帮你排查几个常见的坑:
1. 确保Multiplexer被正确保留引用
很多时候这个问题是因为Multiplexer是局部变量,方法执行完后被GC回收了。比如你如果在create()里这么写:
public void create() { Stage stage = new Stage(); InputMultiplexer multiplexer = new InputMultiplexer(stage); Gdx.input.setInputProcessor(multiplexer); }
方法结束后,multiplexer变量就被销毁了,虽然Gdx.input理论上会持有引用,但保险起见,把它改成类的成员变量:
public class PlanetClicker extends ApplicationAdapter { private Stage stage; private InputMultiplexer inputMultiplexer; @Override public void create() { stage = new Stage(); inputMultiplexer = new InputMultiplexer(stage); Gdx.input.setInputProcessor(inputMultiplexer); // 其他初始化逻辑... } }
2. 检查是否意外覆盖了InputProcessor
看看你的代码里有没有在render()、resize()或者其他方法中,又调用了Gdx.input.setInputProcessor(stage)或者其他处理器?这种情况会直接覆盖掉之前设置的Multiplexer,导致它失效。
3. 尝试手动添加处理器而非构造函数
虽然InputMultiplexer的构造函数会自动调用addProcessor(),但有时候手动添加能避免一些奇怪的初始化问题:
inputMultiplexer = new InputMultiplexer(); inputMultiplexer.addProcessor(stage); Gdx.input.setInputProcessor(inputMultiplexer);
4. 确认后续添加自定义处理器时的返回值
既然你说要处理两个输入,之后肯定要加自己的InputProcessor。别忘了:Multiplexer会按添加顺序传递事件,只要某个处理器返回true,事件就会被拦截,不会传给后面的处理器。所以你的自定义处理器里,所有不需要拦截的方法都要返回false,比如:
public class CustomInputProcessor implements InputProcessor { @Override public boolean keyDown(int keycode) { // 处理你的按键逻辑,比如返回键退出 if (keycode == Input.Keys.BACK) { Gdx.app.exit(); return true; // 这个事件我处理了,不用传给Stage } return false; // 其他按键事件传给Stage } // 其他方法(keyUp、touchDown等)都返回false,除非你要拦截 @Override public boolean keyUp(int keycode) { return false; } @Override public boolean keyTyped(char character) { return false; } @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { return false; } @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { return false; } @Override public boolean touchCancelled(int screenX, int screenY, int pointer, int button) { return false; } @Override public boolean touchDragged(int screenX, int screenY, int pointer) { return false; } @Override public boolean mouseMoved(int screenX, int screenY) { return false; } @Override public boolean scrolled(float amountX, float amountY) { return false; } }
然后把它加到Multiplexer里,顺序根据你的需求来:
inputMultiplexer.addProcessor(new CustomInputProcessor()); inputMultiplexer.addProcessor(stage); // 如果你希望Stage先处理事件,就把Stage放在前面
5. 排查版本或环境问题
如果以上都不行,试试更新LibGDX到最新稳定版,有时候旧版本的Multiplexer可能存在小bug。另外,检查你的项目配置,比如有没有混淆导致Multiplexer的方法被优化掉?不过这种情况比较少见。
内容的提问来源于stack exchange,提问作者Joseph Keane
相关产品推荐
相关产品推荐

