6

皆さんこんにちは、

私が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()メソッドは、誰かが本当にクリックするつもりで、誤って領域をスワイプした場合にのみ呼び出されます。

しかし、それはまだ良い解決策ではありません。そのようなイベントの制御について誰かがもっと知っていると本当にありがたいです.

ありがとうございました

4

2 に答える 2

4

私は最近、画面上のボタンを押す、ピンチ ズーム、2 本の指でオブジェクトを回転および移動するなど、タッチ コントロールを使用してかなり複雑なアプリケーションを作成しました。私が最終的に行ったのは、アプリケーションを繰り返し改善し、さまざまな組み合わせのタッチ イベントにどのように応答するかを制御するルールを追加することでした。何か問題が発生するたびに、TouchEvents のシーケンスを記録し、ルールを追加して、不適切な動作が処理されるようにしました。

が実行されないようにするブールスイッチを作成することもできますonAreaTouched。たとえば、オブジェクトに触れたい場合にdoNotTouchObjecttrue か false かをチェックする条件を追加するだけです。

私が便利だと思ったもう 1 つの機能は、タッチ モード スイッチャーです。ユーザーが画面に触れたときの動作を完全に変更するいくつかのメソッドを作成しました。外出先で切り替えることができると思いますのでscene.setOnAreaTouchListener(touchListener)、画面をタッチしたまま通話ができるはずです。

タッチ領域の登録解除/登録は非常に高速であるため、何らかのアクションを実行している間に特定のタッチ領域を登録解除することが可能です。アクションが完了したら、それらを再登録します。

上記のすべてを組み合わせて使用​​しましたが、かなりうまく機能しますが、コードをきれいに保つことが不可欠です。そうしないと、新しい機能のデバッグまたは実装が面倒になります。

于 2012-06-28T12:01:46.843 に答える
2
  1. 多分あなたはTouchDetectorを使うことができます。TouchUpイベントを処理する代わりにclickDetectorを使用すると、検出されたクリックイベントのみがスプライトによって処理されます。シーンスクロールにもスクロール検出器を使用します。

  2. SceneTouchListenerBindingとTouchAreaBindingを有効にすると、意図しない進行中のイベントをすべてバイパスするのにも役立ちます。

于 2012-07-02T07:14:43.410 に答える