cocos2d-x总结(二)第一个场景(scene)
cocos2d-x的模板里已经建立好了一个HelloWord其中classes文件夹用于保存本地的C++代码;Resource为资源的根目录,也就是在程序需要加载资源的地方,只要是放在此目录下的文件,都可以只用文件名就能加载到程序中,无需添加额外的路径信息;win32或者ios文件夹主要保存与平台相关的东西。要建立自己的场景只需要将HelloWorldScene.h和HelloWorldScene.cpp文件删除,然后再更改一下AppDelegate.cpp文件里的内容。
AppDelegate
AppDelegate.cpp文件主要进行了游戏的全局初始化。在AppDelegate::initInstance()函数中,根据平台的不同,分别进行不同窗口的创建。在WIN32平台下,初始化函数如下
#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) // Initialize OpenGLView instance, that release by CCDirector when application terminate. // The HelloWorld is designed as HVGA. CCEGLView * pMainWnd = new CCEGLView(); CC_BREAK_IF(! pMainWnd || ! pMainWnd->Create(TEXT("MyTest"), 320, 480));#endif // CC_PLATFORM_WIN32
可以看出,WIN32平台下,初始化了一个320*480的窗口,更改此数值就可以更改窗口的尺寸。而在IOS平台下,此窗口的建立则根据UIViewController所建立的窗口来初始化窗口尺寸,IOS平台下默认窗口大小为适应设备尺寸的。接下来是程序的入口函数AppDelegate::applicationDidFinishLaunching()。程序的全局初始化工作可以在此函数中定义。里边涉及到的第一个cocos2d组件就是CCDirector.
CCDirector
顾名思义,这个是游戏的“总导演”,主要负责获取全局的CEGL视窗,设置显示参数,切换场景等。在AppDelegate::applicationDidFinishLaunching()中,的最后一句
// create a scene. it's an autorelease object CCScene *pScene = HelloWorld::scene(); // run pDirector->runWithScene(pScene);
为进入到默认的HelloWorldScene.h文件中声明的场景。如建立自得场景,只需要将此替换掉就OK了
建立自己的场景
下面开始建立自己的场景。取名为MyFirstScene
MyFirstScene.h文件:
#ifndef MYFIRSTSCENE_H #define MYFIRSTSCENE_H #include "cocos2d.h" class CMyFirstScene : public cocos2d::CCLayer { public: // 初始化 virtual bool init(); // 进入场景 virtual void onEnter(); // 显示此场景 static void Show(); // 节点函数 LAYER_NODE_FUNC(CMyFirstScene);}; #endif
MyfirstScene.cpp文件:
#include "MyFirstScene.h" using namespace cocos2d; bool CMyFirstScene::init() { if(!CCLayer::init()) { return false; } // do something return true; } void CMyFirstScene::onEnter() { // do something CCLayer::onEnter(); } void CMyFirstScene::Show() { // 建立场景和层 cocos2d::CCScene *pNewScene = cocos2d::CCScene::node(); CMyFirstScene *pLayer = CMyFirstScene::node(); pNewScene->addChild(pLayer); // 切换场景 cocos2d::CCScene *pCurScene = cocos2d::CCDirector::sharedDirector()->getRunningScene(); if(NULL == pCurScene) { cocos2d::CCDirector::sharedDirector()->runWithScene(pNewScene); } else { cocos2d::CCDirector::sharedDirector()->replaceScene(pNewScene); } }
场景类继承与CCLayer,层相当于一个大容器,可以承载许多东西。场景里就是通过这个层将所有的东西显示出来。
这个类里重载了两个函数,一个是init函数,当这个场景被创建的时候,就会调用此函数,因此初始化工作就可以在这个函数内完成。第二个函数是onEnter,它与init的区别是,当这个场景被显示的时候才会被调用,因此可以进行一些类似于精灵位置等初始化的工作。
头文件里还有一个奇怪的东西LAYER_NODE_FUNC(CMyFirstScene); 这个宏在引擎内部(CCLayer.h)被定义。主要是为自己建的层增加一个node()函数,node()函数的作用是new一个实例,并将它加入autorelease,也就是所有由node()函数得来的指针,都不需要手动的释放(除非自己想要)。
最后一个函数是定义的静态的Show函数,这个函数可以方便的在多个场景之间进行切换。在任何时候想切换的某一个场景的时候,只需要调用该类的Show函数就可以解决了。这个函数先生成了一个场景(CCScene)和一个层(CCLayer),然后将这个层加入的场景中。接着判断前端是否有场景正在显示,如果没有,则直接显示该场景,否则进行切换。
运行
最后打开AppDelegate.cpp文件,将#include "HelloWorldScene.h" 替换为 #include "MyFirstScene.h",将AppDelegate::applicationDidFinishLaunching()最后两句删除,改为CMyFirstScene::Show();运行一下,就可以看到刚刚建立的场景了。下一次将会加入一些内容,让场景看起来更加丰富。