【Cocos2d-x】タッチを有効にする

【Cocos2d-x】タッチを有効にする

ボタンのアクションについては以前やりましたが、今回はボタンではない部分でもタッチしたら処理が走るようにします。

シングルタップの時、
.hに下記を記述。

    virtual bool onTouchBegan(Touch *pTouch, Event *pEvent);
    virtual void onTouchMoved(Touch *pTouch, Event *pEvent);
    virtual void onTouchEnded(Touch *pTouch, Event *pEvent);

画面をタップした時に呼び出される処理を.cppに記述。

bool HelloWorld::onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent) {
    Vec2 location = pTouch->getLocation();
    log("onTouchBegan:(%f, %f)", location.x, location.y);
    return true;
}

void HelloWorld::onTouchMoved(cocos2d::Touch *pTouch, cocos2d::Event *pEvent) {
    Vec2 location = pTouch->getLocation();
    log("onTouchMoved:(%f, %f)", location.x, location.y);
}

void HelloWorld::onTouchEnded(cocos2d::Touch *pTouch, cocos2d::Event *pEvent) {
    Vec2 location = pTouch->getLocation();
    log("onTouchEnded:(%f, %f)", location.x, location.y);
}

初期化メソッド内等でイベントリスナーに登録

    auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
    listener->onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);
    listener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded, this);
    this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

タップやドラッグのテストしてみるとこのようなログが表示されます。
beginner9-1

 

複数タップ(マルチタップ)の時は、
AppController.mmにマルチタップ有効の記述を追加。

    [eaglView setMultipleTouchEnabled:YES];
    virtual void onTouchesBegan(const std::vector<Touch*>& touches, Event *event);
    virtual void onTouchesMoved(const std::vector<Touch*>& touches, Event *event);
    virtual void onTouchesEnded(const std::vector<Touch*>& touches, Event *event);
void HelloWorld::onTouchesBegan(const std::vector<Touch *> &touches, cocos2d::Event *unused_event) {
    for (int i = 0; i < (int)touches.size(); i ++) {
        Touch* touch = touches.at(i);
        Vec2 location = touch->getLocation();
        log("onTouchBegan_%d:(%f, %f)", i, location.x, location.y);
    }
}

void HelloWorld::onTouchesMoved(const std::vector<Touch *> &touches, cocos2d::Event *event) {
    for (int i = 0; i < (int)touches.size(); i ++) {
        Touch* touch = touches.at(i);
        Vec2 location = touch->getLocation();
        log("onTouchMoved_%d:(%f, %f)", i, location.x, location.y);
    }
}

void HelloWorld::onTouchesEnded(const std::vector<Touch *> &touches, cocos2d::Event *event) {
    for (int i = 0; i < (int)touches.size(); i ++) {
        Touch* touch = touches.at(i);
        Vec2 location = touch->getLocation();
        log("onTouchEnded_%d:(%f, %f)", i, location.x, location.y);
    }
}
    auto listener = EventListenerTouchAllAtOnce::create();
    listener->onTouchesBegan = CC_CALLBACK_2(HelloWorld::onTouchesBegan, this);
    listener->onTouchesMoved = CC_CALLBACK_2(HelloWorld::onTouchesMoved, this);
    listener->onTouchesEnded = CC_CALLBACK_2(HelloWorld::onTouchesEnded, this);
    this->getEventDispatcher()->addEventListenerWithFixedPriority(listener, 100);

これで実行してみてください。
なお、シミュレータでマルチタッチをする場合は、altキーを押すと可能です。
altキーを押しながらドラッグすると、このようなログが表示されるはずです。
beginner9-2

今回は以上です。

 

  • このエントリーをはてなブックマークに追加
  • Pocket

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

CAPTCHA