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

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();
};
  1. AppDelegate类继承了Application类,但是是私有继承的,官方说是为了隐藏了些接口防止Director调用
  2. virtual void initGLContextAttrs();
    初始化了openGL上下文属性,因为cocos2dx是基于OpenGL的2D游戏引擎,它的绘制显示画面需要OpenGL库的支持
  3. 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;
    }
  4. virtual void applicationDidEnterBackground();
    当程序进入后台时调用该函数(执行程序退出动画,并停止背景音乐,如果有的话)
  5. virtual void applicationWillEnterForeground();
    当程序进入前台时调用该函数(执行程序启动动画,并播放背景音乐,如果有的话)
  6. 这几个函数的调用次序
    (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);
};
  1. HelloWorld类继承了Layer类,并且是公有继承,说明HelloWrold是一个Layer。
  2. 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;
        }
  3. virtual bool init();
    这是一个虚方法,是从超类Layer中继承下来的,用来初始化我们的类。其初始化的内容主要有:
    超类Layer的init
    在helloWorld场景的右下角添加一个关闭的菜单
    在helloWorld场景的中间添加一个“Hello World”的标签
    在helloWorld场景的中间添加一个“Hello World”图片精灵

  4. void menuCloseCallback(cocos2d::Ref* pSender);
    场景退出时的回调函数
  5. 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; \
        } \
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值