2013-02-12 3 views
7

私はlibgdxで新しくなりました。私は次の問題があります。私は私のゲームのためにピンチズームをしたい。そのため私はGameStageGestureDetectorListenerクラスを持っています。私はGestureDetector次のコード持ってGameStageGestureDetector in libgdx

OrthographicCamera camera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
this.setCamera(camera); 


GestureDetector gestureDetector = new GestureDetector(20, 0.5f, 2, 0.15f, new GestureDetectorListener()); 
Gdx.input.setInputProcessor(gestureDetector); 

class GestureDetectorListener implements GestureListener { 
    float initialScale = 1; 

    @Override 
    public boolean touchDown(float x, float y, int pointer, int button) { 
     initialScale = camera.zoom; 
     return true; 
    } 

    @Override 
    public boolean tap(float x, float y, int count, int button) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    @Override 
    public boolean longPress(float x, float y) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    @Override 
    public boolean fling(float velocityX, float velocityY, int button) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    @Override 
    public boolean pan(float x, float y, float deltaX, float deltaY) { 
     return true; 
    } 

    @Override 
    public boolean zoom(float initialDistance, float distance) { 
     float ratio = initialDistance/distance; 
     camera.zoom = initialScale * ratio; 
     return true; 
    } 

    @Override 
    public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2, 
      Vector2 pointer1, Vector2 pointer2) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

} 

をまた、私はそれらをドラッグするために、私のステージの俳優のためのInputListenerを設定しています。問題は、InputProcessorGestureDetectorに設定すると、私のアクタのドラッグが機能していないことです。私はカメラとGestureDetectorでピンチズームをしたいが、それはドラッグに影響しません。どうやってやるの?

助けてください!おかげさまで

答えて

8

CodeNoobは正しい道にありますが、私は、あなたが違っを構築したいかもしれないと思います。

あなたはInputMultiplexerは、グローバルGestureListenerとあなたの舞台のリスナーの両方をインストールするために使用することができます。

GestureDetector gd = ... 
Stage myStage = ... 
InputMultiplexer im = new InputMultiplexer(gd, myStage); // Order matters here! 
Gdx.input.setInputProcessor(im); 

他の事あなたの入力リスナーのすべてのbooleanメソッドの戻り値であるに注意します。 「true」を返すものは、イベントを「処理済み」としてマークし、マルチプレクサはそのイベントをピアに渡しません。また、マルチプレクサの入力プロセッサの順序は、(それが潜在的なinputProcessorからのイベントを隠す可能性があるため)差を生み出します。したがって、あなたの例で 'true'を返す自動生成スタブは、一連のイベントを「食べる」でしょう。このハンドラがマルチプレクサの最初のものであれば、それはステージからイベントを隠すでしょう。

+0

ありがとう!あなたが正しいです。 "return true"が問題でした。ドラッグ&ズームは機能しています。しかし、私はズームがステージ全体ではなく、一部のコンテナに影響を与えたいと思っています。私はカメラが使えないと思う。なぜなら、カメラはステージ全体に設定されているからだ。 – Karmar

+0

あなたはそれについてどう思いますか?ステージ全体ではなく、一部のコンテナ用にカメラを設定することはできますか?ありがとう。 – Karmar

+0

カメラを変更すると、モデル空間が画面全体にどのようにマッピングされるかが変わります。そのため、1つのコンテナだけをズームするには適切ではありません。 –

3

あなたは、あなたがInputMultiplexer(myInputMultiplexer.addProcessor())にごGestureDetectorとInputListenerの両方を追加InputMultiplexer InputMultiplexer myInputMultiplexer = new InputMultiplexer()

を作成する必要があります。

と終了時に、あなたはこのようなメインInputProcessorとしてマルチプレクサを設定する必要があります。Gdx.input.setInputProcessor(myInputMultiplexer)

+0

'InputMultiplexer'は、' Stage'の外でリスナーを多重化するために必要なものだと思います。質問者はステージ内に1人のリスナーを持ち、1人のリスナーは外部にいます。 –

+0

ありがとうございました。私はInputMultiplexerでこの問題を解決しました。 – Karmar