我们以Helloworld工程为例,如图所示:
<span style="font-size:14px;">bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
CCDirector* pDirector = CCDirector::sharedDirector();
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
pDirector->setOpenGLView(pEGLView);
// turn on display FPS
pDirector->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0 / 60);
// create a scene. it's an autorelease object
//CCScene *pScene = HelloWorld::scene();
CCScene* pScene = AnchorPoint::scene();
// run
pDirector->runWithScene(pScene);
return true;
}</span>
1,CCDirector
游戏的一开始,初始化CCDirector,代码中,设置fps, 设置层(pScene), 最后runWithScene,运行场景。在游戏中,比如设置关卡等等,未进入游戏地图或者场景之前的之前的设置。
代码中,CCScene *pScene = HelloWorld::scene();这里的先将Helloworld理解为一个层, HelloWorld::scene()中创建了scene,然后返回CCScene类型的指针,将该指针交给导演,导演第一次运行这个scene,所以用runWithScene,HelloWorld是怎样变成一个层的?
//helloWorldScene.h
class HelloWorld : public cocos2d::CCLayer
{
public:
virtual bool init();
<span style="background-color: rgb(255, 204, 204);"> static cocos2d::CCScene* scene();</span>
void menuCloseCallback(CCObject* pSender);
CREATE_FUNC(HelloWorld);
};
static cocos2d::CCScene* scene();
//HelloWorld.cpp
CCScene* HelloWorld::scene()
{
// 'scene' is an autorelease object
CCScene *scene = CCScene::create();
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
}
2,CCSene
<span style="font-family:Microsoft YaHei;font-size:14px;"></span>
首先,HelloWorld是继承与CCLayer,所以它具备层的属性,HelloWorld的本质也就是一个层,在.cpp中写了scene的创建,scene是由SSCene中的create创建的,因为Helloworld已经是层了,所以直接调用HelloWorld中的create,创建层,scene->addChild(layer); 将这个创建好的层加到这个scene中, 并且返回scene,也就是我们在AppDelegate中使用到的scene。
在.h中的CREATE_FUNC(HelloWorld);这是一个宏定义的函数。其中,new了一个HelloWorld的内存,用该指针纸箱CCLayer中的init(), 之前已经讲过,HelloWorld继承了CCLayer,(子类指针指向父类方法)主要完成HelloWorld对象的构造和初始化;
3,CCLayer
场景中有不同的层,在游戏中,我们可以将精灵(主角,障碍,背景等)加到不同的层中。CCLayer是被加载到CCSene中的。
在Helloworld::init()中,直接使用CCLayer::init()(其实在创建HelloWorld时,我们已经完成CCLayer的init了吧), 层创建成功后,借助CCDirector获取屏幕的大小,创建精灵, 设置精灵位置等;
4,CCSprite
精灵就是游戏中所具备元素,比如主角,怪物,障碍等, 精灵是被加到层上的,CCSprite是被加载到CCScene中的。
一个导演同一时间只能运行一个场景, 一个场景当中, 可以同时加载多个层,一个层同时可以加载多个精灵,并且层中也可以加载层。