菜鸟问题

下面是在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

有些问题最开始让人很困惑,百思不得其解,可是等你弄明白原因之后,就会觉得很荒唐。
真实的原因可能很简单,只是因为某种巧合,现象把你带入了歧途。

问题很弱智,但是我决定还是把它写下来。

Comments