私は Android 開発のバックグラウンドを持っています。数日前、ゲーム開発のために Cocos2d-x を学び始めました。シンプルなスプラッシュ スクリーンといくつかのメニュー スクリーンを作成していましたが、いくつかのアプリ クラッシュの問題で行き詰まりました。スプラッシュ シーンを 3 秒間保持し、その後 MenuScene をロードするようにします。そこで、スケジュール方式でシーンを差し替えてみました。しかし、スケジュールされたタスクを実行するとクラッシュします。これが私の単純なクラスです。
Splash.h クラス:
#ifndef SPLASHSCREEN_H_
#define SPLASHSCREEN_H_
#include <layers_scenes_transitions_nodes/CCLayer.h>
#include <cocos2d.h>
/**
* Splash Screen for the game
*
*/
USING_NS_CC;
class SplashScreen: public cocos2d::CCLayer {
public:
SplashScreen();
virtual ~SplashScreen();
virtual bool init();
static cocos2d::CCScene* newInstance();
void endSplash(float dt);
// implement the "static node()" method manually
CREATE_FUNC(SplashScreen);
};
#endif
SplashScreen.cpp:
#define COCOS2D_DEBUG 1
#include "SplashScreen.h"
#include "GeneralMenuScreen.h"
USING_NS_CC;
SplashScreen::SplashScreen() {
// TODO Auto-generated constructor stub
}
SplashScreen::~SplashScreen() {
// TODO Auto-generated destructor stub
}
bool SplashScreen::init() {
if(! CCLayer::init() ) {
return false;
}
CCSize windowSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
CCSprite* background = CCSprite::create("background.png");
background->setPosition(ccp(origin.x + windowSize.width/2, origin.y + windowSize.height/2));
this->addChild(background);
CCLabelTTF* loadingText = CCLabelTTF::create("Loading...", "Arial", 36);
loadingText->setAnchorPoint(ccp(0,0));
loadingText->setPosition(ccp(origin.x + windowSize.width/2 - loadingText->getContentSize().width/2, origin.y + windowSize.height/2 - loadingText->getContentSize().height/2));
this->addChild(loadingText);
/* this->schedule(schedule_selector(SplashScreen::endSplash), 5.0); */
CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(SplashScreen::endSplash), this , 5, false, 0, 0 );
/* CCTimer* ccTimer = CCTimer::timerWithTarget(this, schedule_selector(SplashScreen::endSplash), 5.0f);
ccTimer->update(1.0); */
/* CCDelayTime* startDelay = CCDelayTime::create(5.0);
CCCallFunc *showHearts = CCCallFunc::create(this, callfunc_selector(SplashScreen::endSplash));
CCSequence* seq = CCSequence::create(startDelay, showHearts);
background->runAction(seq);*/
return true;
}
CCScene* SplashScreen::newInstance() {
// 'scene' is an autorelease object
CCScene* scene = CCScene::create();
// 'layer' is an autorelease object
SplashScreen* splashScreen = SplashScreen::create();
scene->addChild(splashScreen);
return scene;
}
void SplashScreen::endSplash(float dt) {
//CCLOG("FilePath = %f", dt);
CCScene* menuScreen = GeneralMenuScreen::newInstance();
CCDirector::sharedDirector()->replaceScene(menuScreen);
}
GeneralMenuScreen.cpp:
#include "GeneralMenuScreen.h"
USING_NS_CC;
GeneralMenuScreen::GeneralMenuScreen() {
}
GeneralMenuScreen::~GeneralMenuScreen() {
}
CCScene* GeneralMenuScreen::newInstance() {
CCScene* scene = CCScene::create();
GeneralMenuScreen* layer = GeneralMenuScreen::create();
scene->addChild(layer);
return scene;
}
bool GeneralMenuScreen::init() {
if( ! CCLayer::init()) {
return false;
}
CCSize windowSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
CCSprite* background = CCSprite::create("background.png");
background->setPosition(ccp(origin.x + windowSize.width/2, origin.y + windowSize.height/2));
this->addChild(background);
int margin = 10;
CCLabelTTF* playLabel = CCLabelTTF::create("PLAY", "Arial", 36);
CCMenuItemLabel* menuPlay = CCMenuItemLabel::create(playLabel);
menuPlay->setPosition(origin.x + windowSize.width/2 - menuPlay->getContentSize().width/2, origin.y + windowSize.height/2 + menuPlay->getContentSize().height + margin/2 );
CCMenu* menu = CCMenu::create(menuPlay);
menu->setPosition(CCPointZero);
this->addChild(menu);
return true;
}
スプラッシュ スクリーンが実行されますが、3 秒後に endSplash メソッドが呼び出されず、アプリがクラッシュします。私は C/C++ でプログラミングしたことがありません。私が間違っているところはありますか?また、android/ios にあるようなデバッガーを使用して cocos2d-x アプリをデバッグする方法はありますか?