android — вылет Cocos2d-x из-за расписания ccLayer-> schedule_selector (…), …);

У меня есть фон разработки Android. Несколько дней назад я начал изучать Cocos2d-x для разработки игр. Я создавал простой экран-заставку и какой-то экран меню, но застрял в какой-то проблеме сбоя приложения. Я хочу, чтобы Splash Scene оставался в течение 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 ++. Есть идеи, где я иду не так?
А также, есть ли способ отладки приложений cocos2d-x с помощью какого-либо отладчика, как у нас в Android / IOS?

1

Решение

Вы можете использовать GDB для отладки.

Для чего вы пишете эти методы getInstance? В большинстве случаев достаточно пары create + init.

Возможно, попробуйте использовать CCDirector :: sharedDirector () -> getScheduler () -> scheduleSelector или просто запустите действие, вызывающее некоторый метод для вашего объекта: http://www.cocos2d-x.org/reference/native-cpp/V3.0alpha0/d3/d32/classcocos2d_1_1_call_func.html . Проще управлять действиями, выполняемыми на ваших объектах, чем иметь дело с планировщиком IMO.

При наличии таких ошибок вы можете попытаться разместить некоторые утверждения, проверяющие, не являются ли объекты мертвыми (проверьте, не являются ли nullptr и retaincount). И, конечно, запустите его с отладчиком, чтобы увидеть, где происходит взрыв. Прямо сейчас я не могу найти ошибки в вашем коде, попробую запустить его дома.

0

Другие решения

Итак, после небольшого расследования:

  • конструктор CCObject должен быть закрытым (читайте как: почти всегда должен быть)
  • в CCObject.h хорошая идея заменить defualt c-like castring на static_cast -> вы избежите многочасовой отладки селекторов
  • ваш код работает для меня под VC12 (но я использовал pushScene вместо replaceScene) -> вы используете основную ветку cocos?
0

Вместо этого…

CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(SplashScreen::endSplash), this , 5, false, 0, 0 );

Попробуй это..

this->scheduleOnce(schedule_selector(SplashScreen::endSplash),delayTime);

где delayTime = 3 или что-нибудь.

0

Используйте это, это будет работать для вас

schedule(SEL_SCHEDULE(&SplashScreen::endSplash), 5);
0
По вопросам рекламы [email protected]