2013年9月5日木曜日

[tips : cocos2d-x 2.1.5] マルチタッチ対応

 cocos2d-xで2点以上のタッチを制御したいな、ということでさっそく実装。とりあえずiOSのみ。

■環境
  • cocos2d-x 2.1.5
  • iOS6.0.1(iPod touch 5G) 
■実装
  • AppController.mmに以下を追加。
    __glView.multipleTouchEnabled = true; // __glView定義直後でOK
  • CCLayer派生クラスで以下のメソッドを定義
    virtual void ccTouchesBegan(cocos2d::CCSet *touches, cocos2d::CCEvent *event);
    virtual void ccTouchesMoved(cocos2d::CCSet *touches, cocos2d::CCEvent *event);
    virtual void ccTouchesEnded(cocos2d::CCSet *touches, cocos2d::CCEvent *event);
  • CCLayer派生クラスのinitに以下の処理を追加
    setTouchEnabled(true);
    setTouchMode(kCCTouchesAllAtOnce);
  • CCLayer派生クラスに定義したメソッドを実装
// 実装の一例

/*!
 *  @brief  タッチ開始デリゲート
 *  @param  [in]  touches ある瞬間にタッチされた情報(allTouchesではない)
 *  @param  [in]  event   未使用
 */
void MyLayer::ccTouchesBegan(CCSet *touches, CCEvent *event)
{
    CC_UNUSED_PARAM(event);

    for (CCSetIterator it = touches->begin(); it != touches->end(); ++it)
    {
        CCTouch *touch  = (CCTouch *)(*it);
        int      id     = touch->getID(); // 0 to (CC_MAX_TOUCHES - 1)
        m_touchFlag[id] = true;                 // タッチ状態に遷移
        m_touchAt  [id] = touch->getLocation(); // 位置を保存
        // 以下、必要な情報を取得し、update内で処理してやると良い
    }
}

/*!
 *  @brief  タッチ移動デリゲート
 *  @param  [in]  touches ある瞬間に移動した情報
 *  @param  [in]  event   未使用
 */
void MyLayer::ccTouchesMoved(CCSet *touches, CCEvent *event)
{
    CC_UNUSED_PARAM(event);

    for (CCSetIterator it = touches->begin(); it != touches->end(); ++it)
    {
        CCTouch *touch = (CCTouch *)(*it);
        int      id    = touch->getID(); // 0 to (CC_MAX_TOUCHES - 1)
        m_touchAt[id]  = touch->getLocation(); // 位置を更新
        m_delta[id]    = touch->getDelta();    // 移動値を取得
        // 以下、必要な情報を取得し、update内で処理してやると良い
    }
}

/*!
 *  @brief  タッチ終了デリゲート
 *  @param  [in]  touches ある瞬間に離された情報
 *  @param  [in]  event   未使用
 */
void MyLayer::ccTouchesEnded(CCSet *touches, CCEvent *event)
{
    CC_UNUSED_PARAM(event);

    for (CCSetIterator it = touches->begin(); it != touches->end(); ++it)
    {
        CCTouch *touch  = (CCTouch *)(*it);
        int      id     = touch->getID(); // 0 to (CC_MAX_TOUCHES - 1)
        m_touchFlag[id] = false;         // タッチ状態を終了
        // 以下、必要があれば情報を初期化する
    }
}
  • ビルドして動作確認
  • あとは実装次第

0 件のコメント:

コメントを投稿