深入理解Cocos2d的HelloWorld项目
如果开发者不仅仅想看到太空货船在屏幕上飞行,还想知道这一切是怎样实现的,不如来一起探究一下HelloWorld项目的每一行代码。
场景和节点
要想理解helloworld这个项目,首先我们要学习理解场景,层和节点的概念。
Cocos2d游戏是由不同的场景(CCScenes)构成的,而导演(CCDirector)负责来运行和切换各个场景。Cocos2d的Director在任何一个时间点上只能运行一个场景。
如图所示,CCDirector先是运行主菜单场景,然后切换到游戏画面场景。
![](https://img-my.csdn.net/uploads/201209/29/1348887220_1874.png)
所有节点的基类都是CCNode类。它包含了位置信息,但是没有显示信息。它是 所有其他节点类的父类,包括两个最基本的类:CCScene和CCLayer。
CCScene是一个抽象的概念,它的功能是根据像素坐标把物体放置在场景里相应的地方。所以任何cocos2d场景都会用一个CCScene作为父对象。
CCLayer类本身并不做什么,它的功能是允许触摸和加速计的输入。因为大多数游戏会接受基本的触摸输入,所以CCLayer通常是第一个被加入CCScene的类。
cocos2d的每个场景都包含一个或多个层,彼此叠加.比如在太空人维京这个游戏中,底层是游戏的背景,而上面则是运动的游戏角色。
举例来说,刚进入游戏的时候你会看到一个初始菜单,接下来会进入游戏的主画面战斗,然后很快会因为种种原因看到game over这个经典永恒的画面。 而在不同的场景之中,可能会有很多的层(就像photoshop的图层一样,对photoshop白痴的朋友可以找几块透明玻璃放在桌子上,每块玻璃上用颜料涂上不同的东西,就会明白图层究竟是神马。每个层里面又包含了很多nodes(比如精灵,标签,菜单,等等)。每个nodes里面也可能有其它的nodes(比如一个精灵的里面可以存在一个子精灵)。
请记住,当你添加SpaceCargoShip的时候,要先创建一个新的精灵对象,然后把添加成该层的子节点。
现在让我们来看看具体的代码是如何一步步执行的吧。
译注:原文有些地方解释的不够清晰透彻,译者结合了其它两本教程的内容(分别是知易系列教程和Learn iPhone and iPad cocos2d Game Development(作者Steffen Itterheim,译者杨栋),在这里做了补充和完善。毕竟,我们的目的不是翻译这本书,而是为了教人学会用cocos2d开发游戏。也向两位译者表示感谢。
Step 1.主程序入口main.m:
万物皆有起始,程序的运行也是。
毫无疑问,任何一个xcode开发的应用或游戏都是从main.m开始执行的。
神马,你找不到这个文件?看下图,在左侧supporting files里面就是它。
#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
}
这个文件的内容对于任何苹果应用或游戏是永恒的,也就是说,你无需更改其中的任何一个字母,但是你得知道,不管你的项目有多大,这里是宇宙的中心,起点。
简单点说,主函数创建了一个NSAutoreleasePool(自动释放池),然后调用 UIApplicationMain启动程序,程序使用AppDelegate类来执行 UIApplicationDelegate的协议(protocol)。上述代码中使用了一个NSAutoreleasePool来帮助你管理内存。说的简单一点就是通过使用autorelease(自动释放)信息,你不再需要担心忘记发送释放信息。 Autorelease pool(自动释放池)可以确保内存中的自动释放对象最终会被释 放。
如果这块你看不懂,建议去看看iphone开发,甚至objective-c开发的基础教程。
一句话,程序启动了,马上要调用AppDelegate类。好吧,我们知道下一个文件该看哪里了。
在此之前先看看supporting files里面的另一个文件,Prefix.pch,这个头文件的作用是给编译过程加速。你应该把不常变化的框架(Frameworks)头文件添加到前缀头文件(prefix header)中。这样 的话,在编译的时候,框架的代码会被预先编译,所有的类都将可以使用这些 头文件。不幸的是,这样做也有一个缺点:如果前缀头文件里其中一个头文件 发生了变化,你的所有代码将会重新编译。这就是为什么你应该只添加那些极少或者从来都不变化的头文件到前缀头文件中。cocos2d.h头文件可以被添加到前缀头 文件中,因为它很少改变。不过,只有复杂一些的项目才会感受到编译速度的变化。不过,即使只为了不再需要在其他源代码里写 #import “cocos2d.h”, 也是值得一开始就在前缀头文件里写进 cocos2d.h 的。
作为一个懒人,无疑我会遵从这种做法。
如果你想了解更多关于如何使用前缀头文件减少编译时间的知识,可以参考苹
果开发者文档:
http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/XcodeBuildSystem/800Reducing_Build_Times/bs_speed_up_build.html