皆さんこんにちは、
私がAndEngineで開発しているゲームでは、たくさんのスプライトが走り回っています。TouchArea
これで、スプライトがタッチされたときにスプライトに関するいくつかの情報が表示されるため、すべてのスプライトがシーンに登録されました。シーン自体にはOnSceneTouchListener
、カメラの移動とズームに使用する があります。
私の問題は、ユーザーがカメラを動かすたびに(ディスプレイのどこかに触れて指を動かすことによって)OnAreaTouched()
、移動が終了すると(指が持ち上げられる)、誤って指の下にあるスプライトのメソッドが呼び出されることです。 . トリガー イベントをevent.getAction()==UP
(実際に呼ばれる touchAreas が混乱する前に) 制限しましたが、これでは十分ではありません。ユーザーがカメラをズームまたは移動している場合、スプライトの touchAreas をアクティブにしないでください。
OnAreaTouched
-event と -event を区別する方法はありますOnSceneTouched
か? どちらが最初に呼び出され、もう一方を抑制することができますか?
これは私のOnSceneTouched()
方法です(簡略化):
public boolean onSceneTouchEvent(Scene scene, final TouchEvent event) {
boolean isZooming = event.getMotionEvent().getPointerCount() >= 2;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// REMEMBER FIRST TOUCHPOINT, TO KNOW IN WHICH DIRECTION TO MOVE
this.touchPoint = new Point(event.getMotionEvent().getX(), event.getMotionEvent().getY());
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
if (isZooming) {
// DO SOME ZOOM STUFF
} else {
// DO SOME MOVEMENT STUFF
}
return true;
}
OK、実際にはこれはあまり興味深いことではありませんが、ご覧 true
のとおり、タッチ イベントが処理されたことを示すシグナルを常に返します。それでもOnAreaTouched()
呼び出される
これはOnAreaTouched()
スプライトの典型的なメソッドです:
public boolean onAreaTouched(final TouchEvent touchEvent, float touchAreaLocalX, float touchAreaLocalY) {
if (touchEvent.getAction() == TouchEvent.ACTION_UP) {
// DISPLAY INFORMATION ABOUT THE SPRITE
return true;
}
return false;
}
ほら、特別なことは何もありません。OnAreaTouch
したがって、イベントを使用する必要があるときにイベントを抑制する方法を見つけるために、誰かがここで私を助けてくれることを願っていますOnSceneTouch
。多分私はどうにかevent.getAction()==UP
してOnSceneTouched()
-Method でキャッチできますか??
問題を十分に理解していただけると幸いです (申し訳ありませんが、私には簡単ではありません : )。どんな助けでも大歓迎です、そしてあなたの時間をありがとう!
よろしく
クリストフ
編集:
どういうわけかイベントにタグを付けるというMahdeToの提案を試した後、次のことがわかりました。
TouchEvent
メソッドをトリガーするものは、メソッドをトリガーOnSceneTouchEvent()
するものと同じではありませんOnAreaTouched()
。OnAreaTouched()
より 20 ミリ秒遅れて呼び出されるOnSceneTouchEvent()
- イベントの呼び出し
OnAreaTouched()
は、ユーザーが指をディスプレイに置いたときに実際に開始され (指を動かしてOnSceneTouchEvent()
複数回呼び出されるよりも)、指を離すと最初のイベントが停止して処理されます。(時間を測ってみました)
そこで、タッチ イベントの持続時間を測定するソリューションを考え出しました。イベントが 200 ミリ秒より長い場合、ユーザーは単純にクリックするのではなく、移動またはズームしたかったと思います(これらのアクションには通常より時間がかかるため)。そのため、このOnAreaTouched()
メソッドは、誰かが本当にクリックするつもりで、誤って領域をスワイプした場合にのみ呼び出されます。
しかし、それはまだ良い解決策ではありません。そのようなイベントの制御について誰かがもっと知っていると本当にありがたいです.
ありがとうございました