怎么样使用 Cocos2d-x 快速开发游戏,方法很简单,你可以看看其自带的例程,或者从网上搜索教程,运行起第一个 Scene HelloWorldScene,然后在 HelloWorldScene 里面写相关逻辑代码,添加我们的层、精灵等 ~ 我们并不一定需要知道 Cocos2d-x 是如何运行或者在各种平台之上运行,也不用知道 Cocos2d-x 的游戏是如何运行起来的,它又是如何渲染界面的 ~~~
我们只用知道 Cocos2d-x 的程序是由 AppDelegate 的方法 applicationDidFinishLaunching 开始,在其中做些必要的初始化,并创建运行第一个 CCScene 即可,正如我们第一次使用各种编程语言写 Hello World! 的程序一样,如 Python 打印:
print(‘Hello World!’)
我们可以不用关心其是怎么实现的,我们只要知道这样就能打印一句话就够了,这就是 封装所带来的好处 。
Cocos2d-x 自带的例程已经足够丰富,但是有些问题并不是看看例子,调用其方法就能明白的事情,在这里一叶遇到了如下问题:
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 "../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 ] = '\0';
std :: stringresourcePath =fullpath;
resourcePath =resourcePath.substr ( 0,resourcePath.find_last_of "/" );
resourcePath += "/../../../Resources/";
// create the application instance
AppDelegate app;
CCApplication ::sharedApplication ->setResourceRootPath (resourcePath.c_str );
CCEGLView *eglView =CCEGLView );
eglView ->setFrameSize 720,480 );
// eglView->setFrameSize(480,320);
returnCCApplication ->run }
在这里我们看见了程序的真正入口,包含一个 main 函数,从此进入,执行 cocos2d-x 程序。
我们看到 main 就知道其是入口函数,那么没有 main 函数就没有入口了吗?显然不是,以 Android 平台启动 cocos2d-x 程序为例。我们找到 Android 平台与上面 等价 的入口点,proj.android/jni/hellocpp/main.cpp:
#include "AppDelegate.h"
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#include <android/log.h>
#define LOG_TAG "main"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
using namespace cocos2d;
extern "C"
{
jint JNI_OnLoad (JavaVM *vm,144)">void *reserved {
JniHelper ::setJavaVM (vm );
returnJNI_VERSION_1_4;
voidJava_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit (JNIEnv *env,jobject thiz,jint w,jint h {
if !CCDirector ->getOpenGLView )
{
CCEGLView *view );
view (w,h );
AppDelegate *pAppDelegate =new AppDelegate );
CCApplication );
}
else
{
ccDrawInit );
ccGLInvalidateStateCache );
CCShaderCache ::sharedShaderCache ->reloadDefaultShaders );
CCTextureCache ::reloadAllTextures );
CCNotificationCenter ::sharedNotificationCenter ->postNotification (EVNET_COME_TO_FOREGROUND,144)">NULL );
CCDirector ->setGLDefaultValues }
}