cocos2d-x 游戏开发系列之一:环境搭建与HelloWorld程序解析
打开工程之后找到 下图的位置。
选中HelloWorld 按右键 选择 设为启动项。 然后就可以按 Ctrl+F5 开始译执行了。
打开 HelloWorld, 把 Classes 和 win32 文件夹也点开。
学过C、C++的 应该都知道程序入口是个 main函数。好了下面就从 main文件开始吧。
先从main.h开始。 这个文件里面没有什么,只是导入了几个头文件而已,不管它。
接着看 main.cpp。 这里面只有一个函数。 那就是我们的的程序入口 APIENTRY _tWinMain()函数。
前两条语句不用管它。它们的作用我已经注释了。第三条语句是创建一个 AppDelegate的实例,后面会介绍这个类。第四条语句是这里的关键。它才是我们游戏的真正入口。它为我们开启了一个线程并且执行。至于执行了些什么,后面会介绍,因为它涉及到CCApplication类,其实主要是跟AppDelegate这个类有很大关联。你们也可以打开cocos2d-x的安装目录\cocos2d-1.0.1-x-0.12.0\cocos2dx\platform\win32 文件夹研究CCApplication_win32.cpp文件吧。这就是开源的好处啊。。
好了下面来介绍 AppDelegate。 这个类是继承自CCApplication的。 APIENTRY _tWinMain()函数的最后一条语句也是跟CCApplication类相关的。我们先来学习一下CCApplication类吧。
Application的主要功能有下面几个:
1)initInstance() 初始化程序,构建运行窗口;
2)applicationDidFinishLaunching() 程序初始化完毕通知;
3)applicationDidEnterBackground() 程序被切换到后台通知;
4)applicationWillEnterForeground() 程序切换到前台通知;
5)setOrientation(Orientation orientation) 设置屏幕窗口原点:设备是水平的还是垂直的,在左边还是在右边(或者顶端还是底部)
6)run() 程序运行(进行消息循环处理)
7)getCurrentLanguage() 取得当前语言配置
8)sharedApplication() 所有对Application的访问都通过CCApplication::sharedApplication()提供
其中1到4都是纯虚函数,也就是接口声明,继承后是需要实现的。注意一下第8点。在看看main.cpp中的最后那条语句。理解为什么那样写了吧。
回到 AppDelegate类。这个类也就是实现前面4个虚函数(不同的平台实现这几个函数可能会稍微有些不同哦)。 下面把给了一些中文注释。大家可以参考一下。
注意一下上面AppDelegate::applicationDidFinishLaunching() 这个函数里面有这么一条语句:
CCScene *pScene = HelloWorld::scene();
它是用来创建场景的,场景(CCScene)的概念相当于关卡的概念,一个游戏中可以有很多个场景,但在任何时候只有一个是处于激活状态。而这个创建的场景是来自HelloWorld类中的scene();函数。 好了下面我们来分析一下HelloWorld类。
HelloWorld类在HelloWorldScene.h中有定义。 它是继承自CCLayer类这个类一般称作:层。CCLayer类的一些资料请移步cocos2d-x官网:http://cn.cocos2d-x.org/document/index/class?url=d9/d66/classcocos2d_1_1_c_c_layer.html 这里面有介绍。先看 HelloWorld::scene()这个函数吧:
函数中的第一条语句是 CCScene *scene = CCScene::node(); 它就是调用CCScene::node()创建一个场景。这个函数是这样的:
第二条语句是 HelloWorld *layer = HelloWorld::node(); 就是调用HelloWorld的父类CCLayer的node()函数,创建一个层。这个函数源码如下所示:
第三条语句就是把创建好的层layer添加到场景scene中。 最后一句就是返回这个场景啦。
LAYER_NODE_FUNC(CMyFirstScene); 这个宏在引擎内部(CCLayer.h)被定义。主要是为自己建的层增加一个node()函数,node()函数的作用是new一个实例,并将它加入autorelease,也就是所有由node()函数得来的指针,都不需要手动的释放(除非自己想要)。
接下来看看 HelloWorld::init()函数。 在init中 你需要初始化你的实例。也就是一些游戏对象。比如菜单、主角这些的。这个函数大概分为三部分。
第一部分就是执行父类的 init()函数。 第二部分就是添加一个退出按钮。第三部分是添加了一个Label和一个Sprite。 Label用来显示文字,Sprite用来显示一张图片。具体的看下面的注释。
第一部分:
第二部分:
第三部分:
注意一下 addChild() 这个函数。给它传两个参数的时候 this->addChild(pMenu, 1); this->addChild(pLabel, 1); this->addChild(pSprite, 0); 这三个语句都是上面那个函数中的。第一个产生不需要多说明。关键是第二个参数。第二个参数代表什么呢? 其实这个参数决定了绘制的先后顺序。 数字越小就越先绘制,也就是说绘制在最底下。后绘制的会遮盖掉先绘制的,也就是说后绘制的叠加在先绘制的上面。
忘了说了 addChild()这个函数来自CCNode类。 它们之间的关系是 CCNode类是 CCLayer的父类,而CCLayer是HelloWorld的父类。 通俗点讲:HelloWorld是CCNode的孙子。想了解CCScene, CCLayer, CCSprite, CCNode这几个类的关系,请移步 porsche880828的专栏 的博客:http://blog.csdn.net/porsche880828/article/details/6971876
好了,HelloWorld工程就解析到这了。下面稍微总结一下: