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();运行一下,就可以看到刚刚建立的场景了。下一次将会加入一些内容,让场景看起来更加丰富。

posted @ 2011-11-28 23:51  w121640121  阅读(5470)  评论(1编辑  收藏  举报