cocos2d-x 引擎分析:程序是如何开始运行与结束的?
怎么样使用 Cocos2d-x 快速开发游戏,方法很简单,你可以看看其自带的例程,或者从网上搜索教程,运行起第一个 Scene HelloWorldScene,然后在 HelloWorldScene 里面写相关逻辑代码,添加我们的层、精灵等 ~ 我们并不一定需要知道 Cocos2d-x 是如何运行或者在各种平台之上运行,也不用知道 Cocos2d-x 的游戏是如何运行起来的,它又是如何渲染界面的 ~~~ 我们只用知道 Cocos2d-x 的程序是由 AppDelegate 的方法 applicationDidFinishLaunching 开始,在其中做些必要的初始化,并创建运行第一个 CCScene 即可,正如我们第一次使用各种编程语言写 Hello World! 的程序一样,如 Python 打印:
我们可以不用关心其是怎么实现的,我们只要知道这样就能打印一句话就够了,这就是 封装所带来的好处 。 Cocos2d-x 自带的例程已经足够丰富,但是有些问题并不是看看例子,调用其方法就能明白的事情,在这里一叶遇到了如下问题:
// AppDelegate.cpp 文件
AppDelegate ::AppDelegate ( ) { CCLog ( "AppDelegate()" ); // AppDelegate 构造函数打印 } AppDelegate ::~AppDelegate "AppDelegate().~()" // AppDelegate 析构函数打印 } // 程序入口 bool AppDelegate ::applicationDidFinishLaunching { // initialize director CCDirector *pDirector =CCDirector ::sharedDirector ); pDirector ->setOpenGLView (CCEGLView ::sharedOpenGLView ) ); // 初始化,资源适配,屏幕适配,运行第一个场景等代码 ... ... ... return true; } voidAppDelegate ::applicationDidEnterBackground { CCDirector ->pause ); ::applicationWillEnterForeground ->resume } 此时我并不知道程序运行时,何时调用 AppDelegate 的构造函数,析构函数和程序入口函数,我们只要知道,程序在这里调用了其构造函数,然后进入入口函数执行其过程,最后再调用其析构函数即可。然而事与愿违,在实际执行的过程中,发现程序只调用其构造函数和入口函数,而直到程序结束运行,都 没有调用其析构函数。要验证此说法很简单,只要如上在析构函数中调用打印日志便可验证。 发生这样的情况,让我 在构造函数创建[资源],并且在析构函数中释放[资源] 的想法不能完成!!! 我们知道它是从哪里开始运行,但却不知道它在哪里结束!疑问,唯有疑问! 两个入口程序入口的概念是相对的,AppDelegate 作为跨平台程序入口,在这之上做了另一层的封装,封装了不同平台的不同实现,比如我们通常认为一个程序是由 main 函数开始运行,那我们就去找寻,我们看到了在 proj.linux 目录下存在 main.cpp 文件,这就是我们要看的内容,如下:
#include "main.h"
#include "../Classes/AppDelegate.h" #include "cocos2d.h" #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string> USING_NS_CC; // 500 is enough? #define MAXPATHLEN 500 intmain ( intargc,char **argv // get application path intlength; charfullpath [MAXPATHLEN ]; length =readlink "/proc/self/exe",fullpath,144)">sizeof (fullpath ); fullpath [length ] = ' |