Cocos2d-x でカードをひっくり返すアクションを作ってみました。
表のカードと裏のカードの2枚の CCSprite をCCOrbitCamera を使ってカードをめくるようなアクションです。

最初は裏向きのカードを表示



裏のカードが反転を始める

半分を過ぎると表面のカードの反転が始まる

表面のカードが表示されアクション終了

上記のアクションのコードです。

#define FLIP_DURATION 1.0f
#define CARD_FACE_TAG 1
#define CARD_BACK_TAG 2

// 裏面カードを表示して半分までひっくり返すアクション
void Card::flipAction() {
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();

    CCSprite* card = CCSprite::spriteWithFile("card_face.png");
    card->setPosition(ccp(winSize.width/2, winSize.height/2));
    this->addChild(card, CARD_FACE_TAG, CARD_FACE_TAG);
    card->setVisible(false);

    CCSprite* card2 = CCSprite::spriteWithFile("card.png");
    card2->setPosition(card->getPosition());
    this->addChild(card2, CARD_BACK_TAG, CARD_BACK_TAG);

    CCOrbitCamera* camera = CCOrbitCamera::actionWithDuration(FLIP_DURATION/2.0f, 1, 0, 0.0f, 90.0f, 0, 0);
    CCHide* hide = CCHide::action();
    CCCallFunc* func = CCCallFunc::actionWithTarget(this, callfunc_selector(HelloWorld::flipAction2));
    CCActionInterval* action = (CCActionInterval*)CCSequence::actions(camera, hide, func, NULL);
    card2->runAction(action);
}

// 半分までひっくり返ったところで表面のカードのアクション
void Card::flipAction2() {
    CCSprite* card = (CCSprite*)this->getChildByTag(CARD_FACE_TAG);
    CCShow* show = CCShow::action();
    CCOrbitCamera* camera = CCOrbitCamera::actionWithDuration(FLIP_DURATION/2.0f, 1, 0, 270.0f, 90.0f, 0, 0);
    CCActionInterval* action = (CCActionInterval*)CCSequence::actions(show, camera, NULL);
    card->runAction(action);
}

関連する投稿