nirasan's tech blog

趣味や仕事の覚え書きです。Linux, Perl, PHP, Ruby, Javascript, Android, Cocos2d-x, Unity などに興味があります。

Cocos2dxの自分用まとめ

タッチイベントの有効化

初期化

/* CCScene::init で実行 */
// タッチの有効化
setTouchEnabled(true);
// シングルタップの場合
setTouchMode(kCCTouchesOneByOne);
// マルチタップの場合
setTouchMode(kCCTouchesAllAtOnce);

シングルタップ時に呼び出されるイベント

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);
使用例
// タップが開始されたときの処理(無いとエラーになる)
bool GameScene::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)
{
    return true;
}

// タップが終了したときの処理
void GameScene::ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent)
{
    // タップポイント取得
    CCDirector* pDirector = CCDirector::sharedDirector();
    CCPoint touchPoint = pDirector->convertToGL(pTouch->getLocationInView());

    // タップされたかどうか判定する要素
    CCNode* pNode = this->getChildByTag(someTag);
    if (!pNode)
        return;

    // タップポイントが要素の範囲内かどうか判定
    CCRect rect = pNode->boundingBox();
    if (rect.containsPoint(touchPoint))
    {
        // タップされた時の処理
    }
}

マルチタップ時に呼び出されるイベント

virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

画像の表示と削除

/* 画面サイズの取得 */
CCSize size = CCDirector::sharedDirector()->getWinSize();
/* 画像の作成 */
CCSprite* pCard = CCSprite::create("card.png");
/* 表示位置の設定(画面中央に配置) */
pCard->setPosition(ccp(size.width * 0.5, size.height * 0.5));
/* タグの指定 */
int someTag = 1;
pCard->setTag(someTag);
/* 画面への表示 */
this->addChild(pCard);
/* タグで画像要素を取得 */
CCNode* pCard1 = this->getChildByTag(someTag);
/* 画面から消す */
pCard1->removeFromParentAndCleanup(true);

文字の表示

/* 文字列の作成 */
int someNumber = 100;
CCString* numberString = CCString::createWithFormat("number is %d", someNumber);
/* ラベルを作成 */
CCSize size = CCDirector::sharedDirector()->getWinSize();
CCLabelTTF* label = CCLabelTTF::create(numberString->getCString(), "Arial", 24.0);
label->setPosition(ccp(size.width * 0.5, size.height * 0.5));
/* ラベルの表示 */
this->addChild(label);

メニューボタンの作成

ボタンの表示

void GameScene::makeMenuButton()
{
    /* メニューボタンの作成 */
    CCLabelTTF* label = CCLabelTTF::create("Touch me", "Arial", 24.0);
    CCMenuItemLabel* menuItem = CCMenuItemLabel::create(label, this, menu_selector(GameScene::tapSomeButton)); // ラベルとコールバック関数の指定
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    menuItem->setPosition(ccp(size.width * 0.5, size.height * 0.5));

    /* ボタンの所属するメニューの作成 */
    CCMenu* menu = CCMenu::create(menuItem, NULL);
    menu->setPosition(CCPointZero);
    this->addChild(menu);
}

コールバック関数の定義

void GameScene::tapSomeButton(CCNode* node)
{
    // 画面遷移する
    CCScene* gameScene = (CCScene*)GameScene::create();
    CCDirector::sharedDirector()->replaceScene(gameScene);
}

処理の定期実行

/* 1秒毎に処理を実行 */
this->schedule(schedule_selector(GameScene::someFunc));
/* 処理の定期実行を解除 */
this->unschedule(schedule_selector(GameScene::someFunc));

永続データの読み書き

/* 永続データ管理要素の取得 */
CCUserDefault* userDefault = CCUserDefault::sharedUserDefault();
/* データの読み込み */
float score = userDefault->getFloatForKey("scoreKey", 0); //キー名とデフォルト値の指定
/* データの書き込み */
userDefault->setFloatForKey("scoreKey", 100);
userDefault->flush(); //書き込みの実行

乱数の使用

srand((unsigned)time(NULL));
int i;
switch (rand() % 3)
{
    case 0:  i = 0; break;
    case 1:  i = 1; break;
    default: i = 2; break;
}

シーンの再描画*1

    CCDirector::sharedDirector()->replaceScene((CCScene*)GameScene::create());

*1:2013/9/27追記