I am trying to implement a loading screen as follows. (Translating obj-c code from “Learn cocos2d 2 Game Development for iOS” by Steffen Itterheim and Andreas Low). I currently have a title screen and a level one screen. I will point out the line that gives me trouble.
#ifndef _LOADING_SCREEN_H_
#define _LOADING_SCREEN_H_
#include "cocos2d.h"
USING_NS_CC;
typedef enum
{
kInvalidScene = 0,
kTitleScreen,
kLevelOne,
} TargetSceneType;
class LoadingScreen : public CCScene
{
private:
LoadingScreen();
~LoadingScreen();
CCScene * initWithTargetScene(TargetSceneType tst);
void loadScene(float dt);
TargetSceneType targetSceneType;
public:
static CCScene * loadingScreenForTarget(TargetSceneType tst);
};
#endif
#include "Screen\LoadingScreen\LoadingScreen.h"
#include "Screen\TitleScreen\TitleScreen.h"
#include "Screen\LevelOne\LevelOne.h"
LoadingScreen::LoadingScreen()
{
targetSceneType = kInvalidScene;
}
LoadingScreen::~LoadingScreen()
{
}
CCScene * LoadingScreen::initWithTargetScene(TargetSceneType tst)
{
CCScene::init();
targetSceneType = tst;
CCLabelTTF * label = CCLabelTTF::create("Loading...", "font.ttf", 48.0f);
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint visibleOrigin = CCDirector::sharedDirector()->getVisibleOrigin();
float visibleRight = visibleSize.width + visibleOrigin.x;
//float visibleTop = visibleSize.height + visibleOrigin.y;
label->setAnchorPoint( ccp(1.0f, 0.0f) );
label->setPosition(ccp(visibleRight, 0));
addChild(label);
//THE LINE BELOW IS PROBLEMATIC. THE BOOK SAYS TO SET THE DELAY TO 0.0f
//SO THAT loadScene() GETS CALLED ON THE NEXT FRAME. HOWEVER, USING MARMALADE SIMULATOR
//(ON PC) IF THE DELAY IS SET TOO LOW THE NEW SCENE SHOWS UP FOR A SPLIT SECOND
//AND GOES BACK TO THE LOADING SCREEN INDEFINITELY
this->scheduleOnce(schedule_selector(LoadingScreen::loadScene), 1.0f);
return this;
}
void LoadingScreen::loadScene(float dt)
{
CCDirector * dir = CCDirector::sharedDirector();
switch(targetSceneType)
{
case kTitleScreen:
dir->replaceScene( CCTransitionFade::create(0.5f, TitleScreen::scene() ) );
break;
case kLevelOne:
dir->replaceScene( CCTransitionFade::create(0.5f, LevelOne::scene() ) );
break;
default:
CCAssert(0, "Target Scene not supported");
}
}
CCScene * LoadingScreen::loadingScreenForTarget(TargetSceneType tst)
{
LoadingScreen * ls = new LoadingScreen();
ls->autorelease();
return ls->initWithTargetScene(tst);
}
If the delay is set to 1.0f, the scene gets replaced properly and the loading scene gets deleted. The loading scene does not get deleted (~LoadingScreen() does not get called) if the delay is too low. I would like to know why this is happening, because it is supposed to be set to 0.0f according to the book. The original obj-c code can be downloaded for free here:
http://www.apress.com/9781430244165. You can find it under CH05/ScenesAndLayers01. If anyone can help me understand what is happening here, or let me know if I am doing anything wrong in the code above, or give any feedback about implementing a loading screen I would greatly appreciate it. Thank you.