2013-05-25 8 views
7

グループを使用していくつかの画像を保存し、それらをSpriteBatchに描画します。今、どの画像がクリックされたのかを検出したい。このため、タッチダウン時にイベントを取得するためにInputListenerをグループに追加します。入力されたInputEventには、クリックされたActorへの参照を返すメソッド(getTarget)があります。重複する透明な画像を含むグループの入力検出

アクターの透過領域をクリックすると、着信イベントを無視します。そして、背後にアクターがある場合、私はこれを代わりに使用したいと思います。私は次のようなことを考えました:

myGroup.addListener(new InputListener() { 
     @Override 
     public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { 
      Actor targetActor = event.getTarget(); 
      // is the touched pixel transparent: return false 
      // else: use targetActor to handle the event and return true 
     }; 
    }); 

これは正しい方法ですか?私はメソッドの偽を返すと思ったtouchDownはイベントの伝播を継続し、同じ位置の他のアクターのtouchDownイベントも受け取ることができます。しかし、これは誤解であるように思わ...

UPDATE

P.T.sの答えは、右のイベントを得ることの問題を解決します。今、ヒットしたピクセルが透明かどうかを検出する問題があります。私はアクセスするためにImageをPixmapとして必要としているようです。しかし、イメージをPixmapに変換する方法はわかりません。私はこれがパフォーマンスとメモリ使用量の点で良い解決策であるかどうかも疑問です。

+0

ImageからPixmapに移動しません。 PixmapからTexture、Drawable、Imageに移動します。 – NateS

+0

私が提供したソリューションを試しましたか? – ManishSB

答えて

5

Actor.hit()メソッドをオーバーライドしたいと思います。 scene2d Hit Detection wikiを参照してください。

これを行うには、サブクラスImageをサブクラス化し、hit特化をそこに配置します。ような何か:

public Actor hit(float x, float y, boolean touchable) { 
    Actor result = super.hit(x, y, touchable); 
    if (result != null) { // x,y is within bounding box of this Actor 
    // Test if actor is really hit (do nothing) or it was missed (set result = null) 
    } 
    return result; 
} 

私はステージには(あなたがここにfalseを返す場合にのみ、「親」の関係者は、タッチダウンイベントを取得します)この1「の後ろに」俳優をスキップしていますので、あなたがtouchDownリスナーの中に、これを達成することができないと信じて。

関連する問題