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 と、いくつかの InputListeners から大量の例外が発生します (イベントが適切に停止されておらず、シーン内のすべてのアクターに伝播されていると想定しています)。ここで何が欠けていますか?

また、イベントを発生させた後、event.getTarget() (Actor である) を Actor-Subclass にキャストできなくなりました。次のコードを ApplicationListener で使用するとエラーが発生しますが、MyActor クラスでは機能します。

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

ターゲットは実際には MyActor オブジェクトであるため、アクターとしてだけでなく MyActor としてアクセスするにはどうすればよいですか?

4

2 に答える 2

0

@chase が言ったようにfire(even)、1 つの InputProcessor (あなたのstage) しか設定できないため、常に同じメソッドがイベントを受け取るため、メソッドを再帰的に呼び出しています。
代わりに次を使用する必要がありますInputMultiplexer

  1. StageとあなたのApplicationListenerようInputProcessorInputMultiplexer
  2. を呼び出してInputMulitplexerを として設定します。InputProcessorGdx.input.setInputProcessor(multiplexer);

次にInputMultiplexer、最初のイベントにイベントを渡し、InputProcessorfalse が返された場合は、次のイベントにイベントを送信します。
したがって、あなたStageは false を返すだけです。しかし、入力を処理したくない場合に
、なぜあなたがStageとして追加するのか理解できません... とにかく、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 に答える