下面是在cocos2dx的HelloWorld代码基础上做的小修改,直接在AppDelegate.cpp里面初始化场景,并展示出一张背景图片。
AppDelegate.cpp 片段
bool AppDelegate::applicationDidFinishLaunching(){
...
...
CCScene *pScene = CCScene::node();
CCSprite* sprite = CCSprite::spriteWithFile("HelloWorld.png");
CCSize size = CCDirector::sharedDirector()->getWinSize();
sprite->setPosition(ccp(size.width/2,size.height/2));
pScene->addChild(sprite);
pDirector->runWithScene(pScene);
return true;
}
运行正常。于是,我改一下,把场景逻辑放入一个 LoadingScene 类里面去处理。
AppDelegate.cpp 片段
bool AppDelegate::applicationDidFinishLaunching(){
...
...
CCScene *pScene = LoadingScene::node();
pDirector->runWithScene(pScene);
return true;
}
LoadingScene.h
#ifndef __LOADING_SCENE_H__
#define __LOADING_SCENE_H__
#include “cocos2d.h”
using namespace cocos2d;
class LoadingScene : public CCScene
{
public:
LoadingScene();
};
#endif // LOADING_SCENE_H
LoadingScene.cpp
#include "LoadingScene.h"
USING_NS_CC;
LoadingScene::LoadingScene(){
CCScene::CCScene();
CCSprite* pSprite;
pSprite = CCSprite::spriteWithFile("HelloWorld.png");
CCSize size = CCDirector::sharedDirector()->getWinSize();
pSprite->setPosition(ccp(size.width/2,size.height/2));
addChild(pSprite);
}
再执行的时候,就发现启动之后,HelloWorld.png图片会闪一下然后马上消失。
我怀疑是不是我的写法不对,pSprite在启动后某个时间被释放掉了。
于是各种尝试,把加背景图的逻辑放入init()方法,放入onEnter()方法,结果都是一样的现象。
纠结了一阵之后才想到做断点调试,然后发现,我写的构造函数根本没有被执行。下面这行代码根本不会触发LoadingScene的构造函数。
CCScene *pScene = LoadingScene::node();
正确的写法应该是
LoadingScene *pScene = new LoadingScene();
pScene->autorelease();
为什么构造函数没有被调用,开启程序的时候还是会闪现一下背景图片呢?
那是因为每个程序本身就可以设置一个启动画面,而这个HelloWorld程序的启动画面正好就是HelloWorld.png
有些问题最开始让人很困惑,百思不得其解,可是等你弄明白原因之后,就会觉得很荒唐。
真实的原因可能很简单,只是因为某种巧合,现象把你带入了歧途。
问题很弱智,但是我决定还是把它写下来。
Last modified on 2011-12-22