cocos 2 d-xタッチメッセージ応答

3136 ワード

ワンポイントタッチ:Targeted Touch Delegate方式
1つのレイヤがタッチメッセージを受信するには、次の手順に従います.
1.初期化フェーズでは、このレイヤのプロパティをタッチメッセージを受信するように設定します.たとえばinit()関数に次のように追加します.
m_bIsTouchEnabled = true;またはsetIsTouchEnabled(true);
2,リロード関数virtual void registerWithTouchDispatcher(void);
Standard Touch Delegateがデフォルトであるため、再登録が必要で、関数に次の文を追加します.
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, INT_MIN+1, true);

ここで、2番目のパラメータは優先度であり、優先度の値が低いほど、先に応答します(テストされていません)
3,タッチ応答関数の再ロード
タッチメッセージを受信するには、次の関数を再ロードする必要があります.
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);//  
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);

ここで注意しなければならないことは、最初の関数が実現しなければならないことです.そうしないと、クリックすると異常が放出されます.
マルチタッチ:Standard Touch Delegate方式(CCLayerデフォルトで採用)
この方法をサポートするには、3つのステップが必要です.
1,同Targeted Touch Delegate方式第一歩
2このノードをStandardDelegateに追加し(CCLayerの場合はこのステップを省略)、クリック可能なCCSpriteを実現する例:
onEnter関数に追加
cocos2d::CCTouchDispatcher::sharedDispatcher()->addStandardDelegate(this,0);

3,リロード応答関数
virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
virtual void ccTouchesCancelled(cocos2d::CCSet*pTouches,cocos2d::CCEvent *pEvent);

ここでpTouchesはCCTouchの集合であり,以下の方法で単一接点を得ることができる.
if(!pTouches||!pTouches->count())
{
    return;
}
cocos2d::CCTouch* pTouch = (cocos2d::CCTouch*)(*(pTouches->anyObject()));

すべてのコンタクトを取得するには、このセットを巡回する必要があります.
for(CCSetIterator iterTouch = pTouches->begin(); iterTouch != pTouches->end(); iterTouch++)
{
    CCTouch *pCurTouch =  (cocos2d::CCTouch*)(*iterTouch);
    // do something
}

4 StandardDelegateから削除:
ステップ2でカスタムCCSpriteをStandardDelegateに追加すると、このCCSpriteがクリアされたときに、このCCSpriteが削除されます.onExit関数で呼び出す
cocos2d::CCTouchDispatcher::sharedDispatcher()->removeDelegate(this);

接点位置の取得
CCTouchから接点を得ることができる位置は主に以下の方式がある
1:UIView座標の取得
CCPoint ptTouch = pTouch->locationInView(pTouch->view());

ここで取得したのはデバイスのUIView座標であり,原点は左上隅,Xは右側へ,Yは下へと増加する.
2:ノード座標の取得
CCPoint ptNode = convertTouchToNodeSpace(pTouch);

ノード座標の計算はGL座標と同じであり、そのノードの左下角を原点とし、Xが右に増加し、Yが上に増加する
3、アンカー座標の取得
1つのノードで、すべての変換はアンカーポイントに基づいています.たとえば、平行移動、回転、スケールなどです.関数setAnchorPoint(CCPoint var)を使用できます.アンカーポイントを変更します.cococos 2 d-xのノードのデフォルトのアンカーポイントは中心点であり、setArchorPoint(ccp(0.5,0.5))に等しい.ここで(0,0)は左下、(1,1)は右上を表す.
CCPoint ptNodeAR = convertTouchToNodeSpaceAR(pTouch);

このとき、座標系の原点はそのノードのアンカー位置にあります.Xは右に増加し、左に減少する.Yを上へ、下へ