0

我正在尝试将 touchDown 和 touchUp 事件从演员对象升级到我的 applicationListener 类。为此,我调用了 fire(event); 在我的演员的 InputListener

this.addListener(new InputListener(){
        public boolean touchDown(InputEvent event, float x, float y, int pointer, int buttons){
            Gdx.app.log("Example", "touch started at (" + x + ", " + y + ")");
            fire(event);
            return true;
        }
        public void touchUp(InputEvent event, float x, float y, int pointer, int buttons){
            Gdx.app.log("Example", "touch ended at (" + x + ", " + y + ")");
        }
});

为了在我的 ApplicationListener 类(包含演员的舞台)中处理事件,我在舞台上添加了一个 InputListener

        Gdx.input.setInputProcessor(stage);
        stage.addListener(new InputListener(){
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int buttons){
                Gdx.app.log("FIRE!!!", "I CAUGHT A FIRED EVENT!");
                event.stop();
                return true;
            }
            public void touchUp(InputEvent event, float x, float y, int pointer, int buttons){
                Gdx.app.log("FIRE!!!", "the fired event even touchupped.");
                }
        });

但是,当我触摸我的演员时,我会收到 StackOverflowError 以及来自多个 InputListener 的大量异常(我假设事件没有正确停止并传播到我场景中的所有演员)。我在这里想念什么?

同样,在触发事件后,我无法再将 event.getTarget() (这是一个 Actor)投射到我的 Actor-Subclass 中,如果我在 ActorSubclass 本身中执行此操作就可以了。这意味着以下代码在 ApplicationListener 中使用时会产生错误,但在 MyActor 类中有效:

MyActor actor = (MyActor)event.getTarget();

由于目标实际上是一个 MyActor 对象,我如何不仅可以作为 Actor 访问它,而且可以作为 MyActor 访问它?

4

2 回答 2

0

正如@chase 所说,您正在递归调用该fire(even)方法,因为您只能设置 1 个 InputProcessor (您的stage),因此始终使用相同的方法接收事件。
您应该改为使用InputMultiplexer

  1. 添加和StageApplicationListenerInputProcessorInputMultiplexer
  2. 通过调用将 设置InputMulitplexer为。InputProcessorGdx.input.setInputProcessor(multiplexer);

然后InputMultiplexer将事件发送给第一个InputProcessor,如果它返回 false,它会将事件发送给下一个。
所以在你的Stage你只需要返回false。
但我不明白如果你不希望它处理输入,为什么要添加你的Stageas a ... 无论如何,在 scene2d 中你不需要添加一个到舞台,因为它已经有一个。也已经有一个和其他有用的方法。 一个有用的链接:Scene2D wiki 文章InputProcessor
InputProcessorActorboolean touchDown(float x, float y, int pointer)

于 2014-03-28T09:53:07.890 回答
0

您不是在每次处理事件时都通过重新触发事件来进行递归调用吗?

为什么不从你的听众那里返回 false 呢?

于 2014-03-28T02:12:25.593 回答