月別アーカイブ: 2015年4月

[Cocos2d-x 3.x]Cocos2d-xでタイマーを実現したいとき、scheduleではうまくいかなかったのでその代わりとなる方法

Cocos2d-xで0.1秒で処理を繰り返したいとき、ほとんどの人がscheduleを使うと思います。自分もそうでした。
具体的にはしたのようなコードです。

void HelloWorld::countTime(float frame){
        _count+=0.1;
        printf("///count=%f///",_count);
}

しかし、これを実行してみると、実際の時間とは少しずれていました。

iPhoneタイマーとこの処理を同時スタート
iPhone 10秒→schedule 13秒
iPhone 20秒→schedule 25秒

と少しずつずれていました。
これが自分にとって、とても致命的でした。
そして、試行錯誤した結果、無事正確な時間を刻むタイマーを作ることができました。
下がそのコードです。

this->runAction(RepeatForever::create(Sequence::create(DelayTime::create(0.1),CallFunc::create([this](){
        _count+=0.1;
        printf("///count=%f///",_count);
}),NULL)));

以前の記事で紹介した応用です。
是非、皆さんも試してみてください。

[Cocos2d-x 3.x]scheduleOnce以外で処理を遅延させる方法

私はいつも処理を遅延させたい場合、scheduleを使っていました。
多くの方もそうではないかと思います。
このschedule、大変便利ではありますが、これをするのにいちいち関数を作らなければならないというデメリットがあります。
単純にインクリメントしたいだけとかの場合、いちいち関数を作るのはばからしくなります。そんなときのためにこの方法を記述します。

this->runAction(Sequence::create(DelayTime::create(3.0f),CallFunc::create([this](){
    //ここに処理
    }), NULL));

これだけです。
これで、scheduleと同じことができます。
この画期的な方法は以下のサイトを参照させていただきました。
http://qiita.com/keroxp/items/ba15b1ab485b1b11eceb
ありがとうございます。

[Cocos2d-x 3.x]Menuなどのボタンを押した(触れた)直後にアクションを起こす方法

Menuなどでボタンを実装すると、ボタンを押して離したときにアクションが行なわれるようになっています。
しかし、それではダメな場合が多々あると思います。(リズムゲームなど)
今回はMenuなどのボタンを押した(触れた)直後にアクションを起こす方法を紹介したいと思います。

まず、Cocos2d-x自体のCCMenuItem.hを開いてください。
そして、

public:
   void setTouchMenuCallback( const std::function<void(cocos2d::Ref*)> &callback );
 
 
protected:
    std::function<void(Ref*)>  m_callback;

このコードを追加してください。

次にCCMenuItem.cppを開いてください。

void MenuItem::setTouchMenuCallback(const std::function<void (cocos2d::Ref *)> &callback)
{
    m_callback = callback;
}
 
 
void MenuItem::selected()
{
    //コールバックに連絡、selectedメソッドはすでに存在するので、これだけ追加
    if (m_callback) m_callback(this);
    
    _selected = true;
}

同じく、このコードを追加してください。

そして、それらのコードが書き終わったあとに、

    auto pSprite = Sprite::create("black.png");
    pSprite->setOpacity(0);
    auto pBtnItem = MenuItemSprite::create(pSprite, pSprite,nullptr);
    //ここから
    pBtnItem->setTouchMenuCallback([this](Ref *sender){
     //ボタンに触れた時の処理を記載する        
    });
    //ここまで
    auto pMenu = Menu::create(pBtnItem, NULL);
    pMenu->setPosition(Point(200, 200));
    this->addChild(pMenu);

これで、setTouchMenuCallback内に処理を記述すればアクションが起こるようになります。

今回の記事は、
http://albatrus.com/main/cocos2d/6753
を参考にさせていただきました。
ありがとうございます。