cocos2d学习笔记
第一章 简介
1.1选择iphone版cocos2d的理由
目前有两种集成在cocos2d里的物理引擎:Chipmunk和Box2D。这两种物理引擎仅仅在编写它们的语言上有一些细微的差别:Chipmunk是用C编写而成的,而Box2D是用C++编写而成的,但它们的功能几乎完全一样。
cocos2d把底层的OpenGL ES代码封装的特别好。大多数图形都是用简单的精灵类(CCSprite)来显示的,而精灵对象又是根据图像文件创建的。也就是说,一个精灵对象就是一个具有缩放、翻转和着色能力的纹理,只要简单地对精灵对象相应的Objective-C属性稍作修改就可以完成这些效果。
第二章 入门
2.1 准备工作
2.1.1 系统要求
自2010年6月iphone SDK4发布以来,iOS 开发就必须在Mac OS X10.6及其以上版本中进行。
2.1.2 注册称为iOS开发者
2.1.3 证书和授权文件
2.14 下载并安装iPhone SDK
2.1.5 下载并安装cocos2d
1.安装cocos2d Xcode项目模板
终端输入
sudo /cocos2d所在根目录名称/install-templates.sh
2.2 HelloWorld应用程序
2.2.1 HelloWorld文件在项目中的位置
2.2.2 资源
Resources组中的Default.png文件是在iOS加载程序时显示的图像,而Icon.png文件是应用程序的图标。fps_images.png文件是cocos2d用来显示帧率的,是不允许删除或修改的。
Info.plist文件包含了一些与应用程序相关的配置信息,仅在即将发布应用程序时才需要修改该文件。
2.2.3 其他资源
实际上,每个iOS应用程序都是用NSAutoreleasePool来帮助管理内存。简单来说,通过向对象发送自动释放消息,就不必再为何时向它们发送释放消息而烦恼了。自动释放池保证所有被自动释放的对象最终都会从内存中释放。
HelloWorld_prefix.pch是一个用于加快编译速度的工具。只有永远不会变化或很少发生变化的头文件才能被添加到前缀头文件中。这样做可以使框架的代码提前被编译,并对所有类可见。但是,如果添加到前缀头文件中的头文件发生了变化,那么所有代码会被重新编译,这也是为什么只能向前缀头文件中添加不变的头文件的原因。
2.2.4 类
每个iOS应用程序都有一个实现UIApplicationDelegate协议的AppDelegate类。
AppDelegate类通过在特定时间点从iOS接收消息来追踪应用程序的状态变化。
当iOS终止一个应用程序时,它会将应用程序占用的所有内存清理干净,从而加快应用程序的关闭速度。这也是为什么AppDelegate的dealloc方法中的代码从不运行的原因。此外,手动调用dealloc方法是一个很不好的习惯。如果需要在应用程序终止前运行一些代码,可以将这些代码添加到applicationWillTerminate方法中。如果你的目标系统是iOS4或更高版本,就应将代码添加到applicationDidEnterBackground方法中。
设备方向
[[CCDirector sharedDirector]] setDeviceOrientation:
CCDeviceOrientationLandscapeLeft];
下面列出了设备支持的所有方向:
1)CCDeviceOrientationPortrait
2)CCDeviceOrientationPortraitUpsideDown
3)CCDeviceOrientationLandscapeLeft
4)CCDeviceOrientationLandscapeRight
动作间隔
[[CCDirector sharedDirector] setAnimationInterval:1.0/60];
动作间隔决定了cocos2d刷新屏幕的频率,它关乎游戏可以获得的最大帧率。但动作间隔并不等同于每秒刷新多少帧。相反,它表示的是cocos2d刷新一帧所需要的时间。在上面的代码中,动作间隔的参数为1.0/60,这就是cocos2d对屏幕进行连续两次刷新之间的时间间隔。
很多情况下,最好把帧率设置为30fps。这对复杂游戏很有帮助,因为这样做可以避免由于帧率无法达到60fps,而在游戏过程中发生30fps到60fps间的大幅波动。在这种情况下,最好把帧率设为可能达到的最低帧率,因为较低但是稳定的帧率可以保证游戏的流畅运行,而平均帧率较高但是帧率可能发生大幅波动的游戏会降低玩家的用户体验。
注意:在iOS设备上不能以高于60fps的帧率进行渲染,因为设备的屏幕刷新率被锁定为最高60fps。如果强迫cocos2d以高于60fps的帧率进行渲染,那么在最好情况下,cocos2d会以60fps的帧率进行渲染;而在最坏情况下,它的帧率反而会下降。所以,如果想让cocos2d以最快速度进行渲染,应把动作间隔参数设为1.0/60。
显示帧率
[[CCDirector sharedDirector] setDisplayFPS:YSE];
启动帧率显示功能以后,在屏幕的左下角会出现一个小小的数字,这就是应用程序的帧率,或者硕士每秒刷新的帧数。
注意:如果需要调整显示帧率的反应速度,可以在ccConfig.h文件中修改CC_DIRECTOR_FPS_INTERVAL代码行。该文件位于cocos2d Sources/cocos2d中。该值默认为0.1,即在默认情况下,表示帧率的数字会在每秒被刷新10次。如果增大该值,那么小数字就会被刷新得更慢,虽然这个变化不明显,但还是存在的。
所有节点的基类都是CCNode,它包含一个位置属性,但没有视觉上的显示。它是其他所有节点的父类,包括最基本的CCScene类和CCLayer类。
CCScene类是一个抽象概念,它仅用于根据对象的像素坐标把对象放置到场景中正确的位置。所以,CCScene节点通常是整个cocos2d场景体系的根节点。
CCLayer类本身几乎没有什么功能,但它可用于接收触摸和加速计输入。它常被用作CCScene的第一个子节点,因为每个游戏都至少使用触摸输入的功能。
2.3 cocos2d中的内存管理问题
CCArray与iPhone SDK的NSMutableArray类似,但效率比NSMutableArray更高。CCArray、NSMutableArray,还有iPhone SDK中的任何其他集合都会自动地向每一个添加进来的对象发送retain消息,也会对每个要删除的对象发送release消息。所以,这样生成的对象可以一直存在,并保持有效且可访问状态。但是,当它们从集合中删除以后,对象也会被自动释放。
Objective-C的内存管理始终遵循着这两条规则:
1)如果你拥有(通过alloc、copy或retain得到)一个对象,就必须在用完之后释放它。
2)如果你已经向一个对象发送了自动释放消息,就不该再release它。
2.4改变世界
2.5 你还应该知道的
2.5.1 iOS设备
当你在iOS设备上进行开发时,需要考虑到设备之间的差异。
2.5.2 关于内存的使用
当前的iOS设备配有128MB、256MB或512MB的RAM。
表2-2设备上配备的内存并非都能使用
配备的内存 |
可用内存 |
内存警告阈值 |
128MB |
35~40 MB |
20 MB~25 MB |
256MB |
120 MB~150 MB |
80 MB~90 MB |
512MB |
340 MB~370 MB |
260 MB~300 MB |
cocos2d可以通过调用一些purge方法来帮助释放掉一些内存。通过在AppDelegate的applicationDidReceiveMemoryWarning方法中调用purgeCachedData方法,cocos2d会尝试释放掉一些不用的内存。
开发时用的设备性能越弱越好,这样可以帮助你尽早找到性能和内存过低的问题。
2.5.3 模拟器
模拟器的缺点:
1)不能评估性能
2)不能评估内存使用量
3)无法使用iOS设备的所有功能
4)运行时的表现可能不一样
2.5.4 关于日志
默认情况下,cocos2d项目会有两个构建配置:调试(Debug)和发布(Release)。它们之间的主要区别是:只有在调试时,某些函数,比如CCLOG才会编译并被游戏代码使用。这是影响调试和发布两个构建配置运行性能的最主要因素。
注意:
CCLOG宏对苹果的NSLog方法进行了封装,所以CCLOG只在调试构建时才被编译,在发布构建时被删除。建议在使用NSLog的地方用CCLOG代替,因为日志只是给开发者自己看的。NSLog会让发布的游戏运行很慢,因为它即使在发布构建里也会运行。