2016-09-14 6 views
1

私のLibGDXゲームでは、クリック可能なアクターのラスターがあります。プレイヤーがスワイプして、がスワイプを停止している俳優をにしてもらいたいです。LibGDX touchDown touchUp on other actors

私はGestureListenerを必要としません。唯一必要なことは、別のアクタで生成されたtouchDownのtouchUpイベントです。たとえば、ロックを解除するためにパターンをスワイプするAndroidsのログイン画面について考えてみましょう。ただし、最後のドット/俳優のイベントが必要です。

私はtouchDown/touchUpを使用しようとしましたが、イベントは常にtouchDownが発生したアクタで発生します。

すばらしい解決策は、スワイプでヒットしたすべてのアクタのイベントを取得してから、グローバルtouchUpイベントを取得することです。これは比較的アクセス可能な方法で可能ですか?まったく新しいInputListenerを書くことなく?

答えて

1

リスナーのtouchUp()には、クリック可能なすべてのアクタの親WidgetGroupにhitと電話をかけて、指が離されたときに指がどれかを確認します。アクターをグループに追加するので、ウィジェットをステージに直接追加するのではなく、ステージをグループに追加する必要があります。そして、ActorのXとYはその親に対して相対的であることに注意してください。

final WidgetGroup parent = new WidgetGroup(); 

InputListener inputListener = new InputListener(){ 
    private final Vector2 tmp = new Vector2(); 

    public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { 
     return true; 
    } 

    public void touchUp (InputEvent event, float x, float y, int pointer, int button) { 
     event.getTargetActor().localToParentCoordinates(tmp.set(x, y)); 
     Actor releaseOverActor = parent.hit(tmp.x, tmp.y, true); 
     if (releaseOverActor != null){ 
      //doSomethingTo(releaseOverActor); 
     } 
    } 
} 

for (Actor clickable : clickableActors){ 
    parent.add(clickable); 
    clickable.addListener(inputListener); 
} 

上記は少し簡略化されています。たとえば、ポインタ0が使用されている場合にのみ、真の1つを返すことができます。touchDown

+0

Works!このプロセスでスワップされたアクターにイベントを送信する方法はありますか?また、 'event.getTargetActor()。localToParentCoordinates(tmp.set(x、y));'は 'final Vector2 pos = event.getTarget()。localToParentCoordinates(new Vector2(x、y));'になります。私がグローバル変数を使用しなかったという事実は、メソッド名が異なります)。あなたが使っているlibGDXのバージョンがわからないのですが、私は1.9.3です。 – kwantuM

+0

私はたぶん 'touchDragged'をオーバーライドしてヒットメソッドを呼び出すことができます...しかし、私は非常に最適化されていないと思うので、スパムはVector2オブジェクトを作成し、それらを投影し、タッチが移動されるたびに。 – kwantuM

+0

私はgetTargetActorでタイプミスをしましたが、なぜ不要に割り当てたり、割り当てを解除したりしたいですか?私のやり方では、touchDraggedでそれを使用しても、スパムはありませんが、俳優の上に乗っている間に俳優の色を変えたいのでなければ、その目的はわかりません。 – Tenfour04

関連する問題