Cocos2d-xの研究ノート(16)タッチイベントとEventTouch dispatchTouchEvent EventListenerTouchを配布します

1. EventTouch

タッチイベントのメンバ変数:列挙EVENTCODE、タッチ貯蔵容器。

リスナーが別のコールバック関数を呼び出すことができるように、異なるタイミングの代わりに別のタッチイベントをEVENTCODE。

    列挙クラスEVENTCODE 
    { 
        始め、
        移動、
        終わった
        CANCELED 
    }。
    静的のconst int型MAX_TOUCHES = 15; 
   EVENTCODE _eventCode; std ::ベクトル<タッチ*> _touches。

クラスに関連ここにタッチ:

タッチクラス

タッチポイントのタイプ(シングルポイント/マルチポイント)を含むタッチ情報パッケージは、座標、座標、ID、3Dタッチ圧を開始します。getメソッドが設定されています。

2. EventListenerTouch

シングル/マルチタッチリスナに聴取者をタッチし、タッチポイントタッチの種類に応じて、イベントリスナーをタッチ。

2.1 EventListenerTouchOneByOne

シングルタッチリスナーのコールバック関数は、唯一のタッチでタッチイベントを処理することができます。

IDの統一:

constのはstd ::文字列EventListenerTouchOneByOne :: LISTENER_ID = "__cc_touch_one_by_one"。

このクラスは4コールバック関数、タッチイベントコード異なるカテゴリに従って:

公共

    STD関数のtypedef :: <BOOL(タッチ*イベント*)> ccTouchBeganCallback; 
    STDのtypedef ::関数<無効(*タッチイベント*)> ccTouchCallback; 

    ccTouchBeganCallback onTouchBegan; //タッチ開始
    ccTouchCallback onTouchMovedを; //タッチモバイル
    ccTouchCallback onTouchEnded; //終了タッチ
    ccTouchCallback onTouchCancelled; //タッチはキャンセル

このクラスは2つのメンバ変数:

プライベート
    STD ::ベクトル<タッチ*> _claimedTouches;タッチ//パラメータ記憶が処理始まったイベントコールバック関数
    ブール_needSwallowは; //イベントが飲み込まとき、真のイベントを停止する他のリスナーに配布し、setSwallowTouches(ブール値)の設定が必要ですデフォルトはfalseです

販売代理店への追加のリスナーでは、最初のリスナーのために()checkAvailableを実行する必要があります。リスナーのシングルタッチcheckAvailableは()、請求onTouchBeganの存在を必要とします。

2.2 EventListenerTouchAllAtOnce

マルチタッチリスナーのコールバック関数は、一度すべてのタッチを、イベントを処理することができます。

IDは以下のとおりです。

constのはstd :: 文字列 EventListenerTouchAllAtOnce :: LISTENER_ID = " __cc_touch_all_at_once "

4コールバック関数:

公共
    typedefでのstd ::機能 < のconstのstd ::ベクトル<タッチ*>&イベント*)> ccTouchesCallback。
    ccTouchesCallback onTouchesBegan; 
    ccTouchesCallback onTouchesMoved; 
    ccTouchesCallback onTouchesEnded; 
    ccTouchesCallback onTouchesCancelled;

請求項4のcheckAvailable()コールバックメソッドが存在することができます。

3. dispatchTouchEvent 

dispatchEventメソッド、イベントTOUCHのパラメータのタイプでは、イベント配信のためdispatchTouchEventを呼び出します。

まず、優先順位のベクトルの2つのタッチリスナーIDのコンテナは、タッチイベントにすべてのタッチを取得した後、コンテナを保存します。

リスナーの2種類がある場合は、trueに設定しisNeedsMutableSet。

そして、シングルタッチリスナーのイベントを配布します

ロジックシングルタッチイベント配信ではなく、リスナー自身_onEvent(単一のポイントよりも、すべてのリスナーは、無名関数を定義して実行し、シングルタッチリスナーをソート渡された順番にタッチイベントに触れることです_onEventは、リスナーのinitに触れ)nullptrを設定します。

次のようにリスナーが実行された各シングルタッチ動作フローのコールバック関数:

簡潔には、タッチイベントコールバックコードに係るタッチコールバックタッチに対応する処理を開始した実行を決定するために、良好なタッチは、処理容器リスナに聴取者が格納されているか、タッチ/タッチ端の後続の移動を実行しますコールバック。タッチコールバック処理のタッチの動きに対応します。エンド対応するコールバック処理のタッチに触れて、コンテナがタッチの開始を削除触れ、触れて、全体の手順は、リスナーからのタッチを終了について説明します。

 

私たちは、コールバック関数が真のリスナーを返したときに、イベントリスナーのフォローアップを配布停止することを知っています。

シングルタッチのリスナーに、2つの状況は、コールバック関数がtrueを返す場合がある:停止タッチイベント/コールバック関数タッチイベントが登録されたリスナーは、フラグがtrueに設定されて飲み込ま+ +処理されます。

コールバック関数がfalseを返すこれらの場合におけるシングルポイント・タッチ・リスナーに:開始ない(対応)に分配終了コールバックメソッド/移動またはタッチイベントに触れていない開始するコールバック関数が処理されていないイベント/リスナーをタッチ開始リスナーは、データをタッチします。

イベントが停止されると、それは現在の分布、分布の終わりを終了します。

マルチタッチリスナーの分布上の次のイベント

論理マルチタッチイベントの分布は、それぞれということであるマルチタッチ必要既にコンテナに格納されているタッチmutableTouchesでは、コンテナは、すべてのリスナーが聴取者ではなく、定義された匿名関数を実行し、マルチタッチリスナーをソート渡さ_onEventが来る(_onEventは、マルチタッチリスナーのinitをnullptr設定しました)。

各シングルタッチのタッチが順番にすべてのリスナーに配布され、マルチタッチは、すべてのリスナーにすべてのタッチを分配することです。

マルチタッチイベントリスナー匿名コールバック関数に配布:タッチイベントコードの判断により、リスナーを所有するコールバック関数を実行することを決めました。イベントが真のリターンを停止すると、それはリスナーがフォローアップイベントを受け取り停止します。

4. 触摸事件分发时的Touch*容器 originalTouches mutableTouches

两个容器开始时都存储了本触摸事件的所有touch。

事件分发到单点触摸监听器,是遍历originalTouches,获取每个touch,再分发touch到监听器。

单点触摸回调函数中,如果一个touch在某个单点触摸监听器中处理完成,且_needSwallow为true,且存在多点触摸监听器,此时要从mutableTouches删除该touch。原因是_needSwallow为true说明本touch处理完后不再继续分发,而mutableTouches是需要分发到多点触摸监听器,故从mutableTouches中删除该touch。mutableTouches中的迭代器自动指向下一位。同时isSwallowed置true,即不用执行++mutableTouchesIter,迭代器已经实现了++操作。

还是上面的情况,如果没有多点触摸监听器,isSwallowed默认false,匿名回调函数返回true,停止本touch分发。接下来执行++mutableTouchesIter,和originalTouches一致。

简而言之,mutableTouches只在有多点触摸监听器的情况下可能发挥它独特的作用(只保存需要接下来多点触发的touch),否则和originalTouches无异,只是存储所有touch而已。

         if (isClaimed && listener->_isRegistered && listener->_needSwallow) //如果事件处理完成,监听器注册状态, 监听器吞没
                {
                    if (isNeedsMutableSet) //单点多点触摸的监听器都有
                    {
                        mutableTouchesIter = mutableTouches.erase(mutableTouchesIter); //删除此触摸点信息
                        isSwallowed = true; //
                    }
                    return true;
                }

       if (!isSwallowed)
             ++mutableTouchesIter;

      //接下来遍历下个touch

おすすめ

転載: www.cnblogs.com/deepcho/p/cocos2dx-eventtouch-dispatchtouchevent-eventlistenertouch.html