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; \ } \ }