您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x V3.4 项目模板分析

2015-03-20 17:28 169 查看

0. 分析之前

首先新建一个project,项目会自动的使用cocos2dx的项目模板。

在模板中有2个类:

AppDelegate // Cocos2d 应用程序代理类
HelloWorld  // Cocos2d 示例类


对应着有4个文件:

AppDelegate.h, AppDelegate.cpp
HelloWorldScene.h, HelloWorldScene.cpp


1. AppDelegate类

要分析AppDelegate类我们首先从它的头文件开始看

class  AppDelegate : private cocos2d::Application
{
public:
AppDelegate();
virtual ~AppDelegate();

// 初始化OpenGL的上下文环境
virtual void initGLContextAttrs();

// 当程序启动结束时调用该函数(游戏的初始化地方,主要实现Director和Scene的初始化)
virtual bool applicationDidFinishLaunching();

// 当程序进入后台时调用该函数(执行程序退出动画,并停止背景音乐,如果有的话)
virtual void applicationDidEnterBackground();

// 当程序进入前台时调用该函数(执行程序启动动画,并播放背景音乐,如果有的话)
virtual void applicationWillEnterForeground();
};


AppDelegate类继承了Application类,但是是私有继承的,官方说是为了隐藏了些接口防止Director调用

virtual void initGLContextAttrs();


初始化了openGL上下文属性,因为cocos2dx是基于OpenGL的2D游戏引擎,它的绘制显示画面需要OpenGL库的支持

virtual bool applicationDidFinishLaunching();


这个函数直面翻译是,当App完成了启动时要做的事情,在里面实现了Director和Scene的初始化。

游戏的初始化便在这个函数中,主要分为三个步骤:

- Step1:初始化导演类

- Step2:创建游戏场景

- Step3:用导演类运行游戏场景

bool AppDelegate::applicationDidFinishLaunching() {
// Step1:初始化导演类.这是单例模式,每次使用只能用getInstance()
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::create("My Game");
director->setOpenGLView(glview);
}

// 显示初始屏幕左下方的FPS帧率
director->setDisplayStats(true);

// 设置帧率,如果你不设置则默认是1.0/60
director->setAnimationInterval(1.0 / 60);

// Step2:创建我们的示例场景HelloWrold
auto scene = HelloWorld::createScene();

// Step3:运行游戏场景(director是总控制器)
director->runWithScene(scene);

return true;
}


virtual void applicationDidEnterBackground();


当程序进入后台时调用该函数(执行程序退出动画,并停止背景音乐,如果有的话)

virtual void applicationWillEnterForeground();


当程序进入前台时调用该函数(执行程序启动动画,并播放背景音乐,如果有的话)

这几个函数的调用次序

(1) 程序代理构造函数,AppDelegate()

(2) 初始化OpenGL上下文,initGLContextAttrs()

(3) 启动并初始化Director和Scene,applicationDidFinishLaunching()

(4) 若有有前后台切换则,调用applicationDidEnterBackground()/applicationWillEnterForeground()

(5) 退出程序调用析构函数,~AppDelegate()

2. HelloWorld类

同上,我们也先从HelloWorld的头文件开始分析。

class HelloWorld : public cocos2d::Layer
{
public:
// 创建一个Scene类并返回类指针
static cocos2d::Scene* createScene();

// 初始化helloWorld实例层中的具体内容
virtual bool init();

// 场景退出时的回调函数
void menuCloseCallback(cocos2d::Ref* pSender);

// 自动实现static create()方法的宏
CREATE_FUNC(HelloWorld);
};


HelloWorld类继承了Layer类,并且是公有继承,说明HelloWrold是一个Layer。

static cocos2d::Scene* createScene();


创建一个场景scene,并创建一个HelloWorld的层Layer,然后将HelloWorld层添加到scene场景中并返回

Scene* HelloWorld::createScene()
{
// 创建一个scene,它是一个自动释放的对象(注:使用create创建的对象都是自动释放的)
auto scene = Scene::create();

// 创建一个我们实例HellpWorld层,它是一个自动释放的对象
auto layer = HelloWorld::create();

// 将HelloWorld作为一个子层加入scene中
scene->addChild(layer);

// 返回这个场景
return scene;
}


virtual bool init();


这是一个虚方法,是从超类Layer中继承下来的,用来初始化我们的类。其初始化的内容主要有:

超类Layer的init

在helloWorld场景的右下角添加一个关闭的菜单

在helloWorld场景的中间添加一个“Hello World”的标签

在helloWorld场景的中间添加一个“Hello World”图片精灵

void menuCloseCallback(cocos2d::Ref* pSender);


场景退出时的回调函数

CREATE_FUNC(HelloWorld);


利用CREATE_FNUC(TYPE)宏实现了自动创建函数,这里使用了Cocoa设计模式中的二段构建模式

从这里我们可以知道,为什么这类中没有create函数,而createScene函数中却调用了create()。

/**
* define a create function for a specific type, such as Layer
* @param \__TYPE__  class type to add create(), such as Layer
*/

#define CREATE_FUNC(__TYPE__) \

static __TYPE__* create() \
{ \
__TYPE__ *pRet = new(std::nothrow) __TYPE__(); \
if (pRet && pRet->init()) \
{ \
pRet->autorelease(); \
return pRet; \
} \
else \
{ \
delete pRet; \
pRet = NULL; \
return NULL; \
} \
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: