ブログBlog

中断と再開

投稿日:2014年10月01日

布内です。

cocos2d-xでゲームを作っていると、ゲームの内容によってはポーズ(一時停止)が必要になるとおもいます。

そんな時は、pauseSchedulerAndActions()とresumeSchedulerAndActions()を使うと簡単にできます。

作り方にもよりますがゲームアプリを作成する時は、基本的にupdate()関数を使います。

update()はscheduleUpdate()を使うと1フレーム毎に呼び出されるようになります。

bool HelloWorld::init()
{
if ( !CCLayer::init() )
{
return false;
}
scheduleUpdate();

return true;
}

void HelloWorld::update(float dt)
{
CCSprite* test = (CCSprite*)getChildByTag(kTagTest);

cocos2d::CCSize winSize = CCDirector::sharedDirector()->getWinSize();

if(test!=NULL){

test->runAction(CCMoveBy::create(0, ccp(1,0)));

}

else

{
test = CCSprite::create(“test.png”);

test->setPosition(ccp(0,winSize.height*0.5));

test->setTag(kTagTest);

addChild(test);

}
}

これでフレーム毎に画像が右に移動します。このように移動等の繰り返し行なう処理はここに書く事になります。

できれば上記のような移動処理は関数を作って、その関数をupdate()内で呼び出す方が良いでしょう。

とりあえず、update()は置いといて、pauseSchedulerAndActions()とresumeSchedulerAndActions()に戻ります。

pauseSchedulerAndActions()は中断処理、resumeSchedulerAndActions()は再開処理となります。

void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)

{
if(!stop)

{
this->pauseSchedulerAndActions();

}

else

{

this->resumeSchedulerAndActions();

}

stop = !stop;

}

これで、画面をタップしたらupdate()が停止され画像の移動が止まります、もう一度タップするとupdate()が再開されて移動が再開されます。

因にstopはbool形のメンバ変数とします。

また、別のケースも紹介します。

bool HelloWorld::init()
{
if ( !CCLayer::init() )
{
return false;
}

cocos2d::CCSize winSize = CCDirector::sharedDirector()->getWinSize();

CCSprite* test = CCSprite::create(“test.png”);

test->setPosition(ccp(0,winSize.height*0.5));

test->setTag(kTagTest);

addChild(test);

test->runAction(CCMoveBy::create(10, ccp(winSize.width,0)));

return true;
}

これでも、先ほどと同じように、物体が画面の右に動きます。

void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)

{
CCSprite* test = (CCSprite*)getChildByTag(kTagTest);

if(test!=NULL){

if(!stop)

{

test->pauseSchedulerAndActions();

}

else

{

test->resumeSchedulerAndActions();

}

stop = !stop;

}

}

このように書くと、特定の対象のみを中断(停止)させる事ができます。
動くものが複数あって、全てを止めない時などにつかいます。

PAGE TOP