2014年11月29日土曜日

TouchAreaBindingとは

Sceneには
public void setTouchAreaBindingOnActionDownEnabled(final boolean pTouchAreaBindingOnActionDownEnabled)

public void setTouchAreaBindingOnActionMoveEnabled(final boolean pTouchAreaBindingOnActionMoveEnabled)
というメソッドがあります。

ソースには
Enable or disable the binding of TouchAreas to PointerIDs (fingers).
という説明があります。訳すと
「タッチ領域のポインタID(指)への束縛を有効化、無効化する」 という感じでしょうか。
いまいちよく分からないので調べてみました。

タッチ領域の束縛とは

通常、タッチ領域(SpriteとかRectangleとか)に指を触れ、領域外までドラッグするとその領域のイベントは実行されなくなります。
しかし、タッチ領域がポインタIDに束縛されると、指をドラッグしてタッチ領域の外に出ても、指を離すまで、その領域のタッチイベントが実行され続けます。
これがタッチ領域の束縛です。

そして、この束縛が領域のタッチ時に行われるようにするのが
setTouchAreaBindingOnActionDownEnabled(true)
で、束縛が、領域外から指をドラッグして領域内に入った時に行われるようにするのが
setTouchAreaBindingOnActionMoveEnabled(true)
というわけです。
タッチ領域の束縛



使い所

AndengineExamplesで見てみると
  • MultiTouchExample
  • PinchZoomExample
  • TouchDragExample
で使われているようです。
マルチタッチでは、異なる場所でのタッチを区別するためにタッチ領域の束縛が必要なようです。
また、Spriteとかをドラッグで動かしたい場合、指を素早く動かしても追従できるように束縛を使っているようです。
他には
  • ButtonSpriteExample
という例でも使われているようです。ソースはあるのですが、サンプル一覧の項目に無いため実行できない状態です。時間があるときに試したいと思います。

使い方

タッチ時の束縛を行う場合
準備として、setTouchAreaBindingOnActionDownEnabled(true)
をセットします。
その後、onAreaTouched()がTouchEvent.ACTION_DOWNの状態でtrueを返せば束縛が開始されます。

領域内に入った時の束縛を行う場合
準備として、setTouchAreaBindingOnActionMoveEnabled(true)
をセットします。
その後、onAreaTouched()がTouchEvent.ACTION_MOVEの状態でtrueを返せば束縛が開始されます。

束縛の解除
指を離した(TouchEvent.ACTION_UP)状態で束縛が解除されます。

バグ?

上のような説明をしてから言うのもアレですが上手く束縛できない例があります。
上手く行く例
  • setTouchAreaBindingOnActionDownEnabled(true)
  • setTouchAreaBindingOnActionMoveEnabled(true)  

  • setTouchAreaBindingOnActionDownEnabled(true)
  • setTouchAreaBindingOnActionMoveEnabled(false)

上手く行かない例
  • setTouchAreaBindingOnActionDownEnabled(false)
  • setTouchAreaBindingOnActionMoveEnabled(true)
この例だと束縛が行われず、領域外ではイベントが起きなくなります。

ソースを見ると、DownもMoveも束縛自体はできているのですが、束縛された領域のイベントを実行する条件が「mTouchAreaBindingOnActionDownEnabledがtrueにセットされていること」になっています。
https://github.com/nicolasgramlich/AndEngine/blob/GLES2-AnchorCenter/src/org/andengine/entity/scene/Scene.java#L312
(2014/11/29時点)
上のリンクの312行目です。
これを
if(this.mTouchAreaBindingOnActionDownEnabled) {

if(this.mTouchAreaBindingOnActionDownEnabled || this.mTouchAreaBindingOnActionMoveEnabled) {
に変更すると上手く行くと思います。未確認。

0 件のコメント:

コメントを投稿