在本文中,你将编写专属于你的第一个完整的游戏。它不会为你赢得什么奖项,但从中可以学到cocos2d基本要素的使用方法。我会逐步进行介绍,你还能学到一些Xcode的使用方法。
这个游戏是著名的“Doodle Jump”游戏的“倒版”,它被贴切地命名为“DoodleDrop”。玩家通过旋转屏幕尽可能躲避落下的障碍物。游戏的最终版本如图4-1所示,你可以在此提前了解一下将在本章创造的作品。
图 4-1 “DoodleDrop”游戏的最终版本
4.1 按部就班地创建项目
现在就打开Xcode,我将逐步引导你创建你的第一个cocos2d游戏。在Xcode中,选择File | New Project…,然后选择cocos2d Application模板,如图4-2所示。Xcode会要求你为新项目输入一个名称,这里输入DoodleDrop。如果需要,请把它存储到一个合适的位置。由于Xcode会自动创建一个名为DoodleDrop的子文件夹,因此不必多此一举。
图 4-2 通过cocos2d Application模板创建项目
此时Xcode的项目视图应如图4-3所示。取决于你所用的cocos2d和Xcode版本,可能还会有更多的文件,或者组的名字可能会有区别。 我已展开Classes和Resources组,它们分别用来添加源代码和游戏资源文件。任何非源代码文件都被当做资源,无论是图像文件、声音文件、文本文件还是plist文件。分组并不是必需的,但如果坚持对同类文件进行分组,那么这将为理清项目带来很大便利。
图4-3 开始创建游戏!当前的DoodleDrop项目基于cocos2d的HelloWorld项目模板。确保将相应的后续文件添加到了Classes和Resources组中,以保持游戏项目的井然有序
接下来要面临一个抉择:是先从已经创建好的HelloWorldScene(没准在后面会重命名它)开始工作呢,还是要通过额外的步骤创建你自己的场景并替代HelloWorldScene呢?我选择后者,因为最终你还是得加上新的场景,不如借着这个过程摸清门路。 请确认Classes组已被选中,然后选择菜单File | New File…,或者右击Classes文件夹,从弹出菜单中选择Add | New File…,打开New File对话框,如图4-4所示。由于cocos2d为最重要的节点提供了类模板,不加以利用难免可惜。在cocos2d的User Templates中,选择CCNode class并单击Next,确认它已设置成CCLayer的子类。然后再次单击Next,这会打开如图4-5所示的保存文件对话框。
图4-4 添加新的CCNode派生类的最好做法就是利用cocos2d提供的类模板。 在此建立新场景时,我们让CCNode类作为CCLayer的子类
图4-4 添加新的CCNode派生类的最好做法就是利用cocos2d提供的类模板。 在此建立新场景时,我们让CCNode类作为CCLayer的子类图4-5 命名新场景并确认已将其添加到合适的Target中
我更倾向以通常的方式,按类的功能来命名类。这里我们使用GameScene.m。DoodleDrop的游戏进程将在这个场景中展开,所以这个名字听上去还算合适。记住一定要选中DoodleDrop复选框。如果使用的是Xcode 3,还必须选中Also create“GameScene.h”(同时创建“GameScene.h”)复选框。Targets用于指定Xcode中创建不同版本可执行文件的方式。例如,游戏的iPad版本通常创建为单独的Target。在此情况下,我们只有一个Target,然而一旦创建好iPad的一个Target,就要确保某些情况不会发生,比如iPad的高分辨率图像不会意外加入到iPhone或iPod Touch Target中。
注意: 不检查Add to targets复选框组会导致各种各样的问题,从编译错误到“文件未找到”错误,或是因为文件没有被添加到需要该文件的Target而导致的游戏程序崩溃。抑或是文件添加到根本不需要此文件的Target而造成空间浪费,例如在普通的iPhone或iPod Touch中加入iPad和iPhone 4的高分辨率图像。
此时此刻,我们的GameScene类还是一片空白。我们要做的第一件事就是为它添加“+(id) scene”方法,从而将它设置为场景。这里添加的代码与第3章中讲过的没有本质差别,只是层的类名更改了一下。任何类中几乎都需要“– (id) init”和“– (void) dealloc”方法,所以很有必要现在就加上它们。我是个很谨慎的程序员,所以我决定加上第3章中介绍过的日志记录语句。编辑后的结果分别为程序清单4-1中的GameScene.h和程序清单4-2中的GameScene.m。
程序清单4-1 加入Scene方法的GameScene.h
#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface GameScene : CCLayer
{
}
+(id) scene;
@end
程序清单4-2 加入Scene方法和标准方法(包括日志记录语句)的GameScene.m
#import "GameScene.h"
@implementation GameScene
+(id) scene
{
CCScene *scene = [CCScene node];
CCLayer* layer = [GameScene node];
[scene addChild:layer];
return scene;
}
-(id) init
{
if ((self = [super init]))
{
CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
}
return self;
}
-(void) dealloc
{
CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
// never forget to call
[super dealloc] [super dealloc];
}
@end
现在你可以安全地删除HelloWorldScene类了。当被询问时,选中Also Move to Trash选项,将文件同时从Xcode项目和硬盘中删除。同时选中这两个文件,然后选择Edit | Delete或从右击菜单中选择Delete。删除了HelloWorldScene类之后,必须修改DoodleDropApp- Delegate.m,将任何使用HelloWorldScene的地方改为使用GameScene。程序清单4-3标出了对#import与runWithScene语句所做的必要修改。将设备方向改成了Portrait模式,因为我们的游戏最适合在此模式下运行。
程序清单4-3 修改DoodleDropAppDelegate.m文件,使用GameScene类而不是Hello- WorldScene类
// replace the line #import “HelloWorldScene.h” with this one: #import "GameScene.h" - (void) applicationDidFinishLaunching:(UIApplication*)application
{
…
// Sets Portrait mode
[director setDeviceOrientation:kCCDeviceOrientationPortrait];
…
// replace HelloWorld with GameScene
[[CCDirector sharedDirector] runWithScene: [GameScene scene]];
}
编译并运行,你会看到一个空白场景。你成功了!如果出现任何问题,请将该项目与随书附带的DoodleDrop01项目进行对比。
注意: 从cocos2d 0.99.5版本开始,cocos2d Xcode项目模板中增加了一个名为GameConfig.h的文件。如果用某个cocos2d Xcode项目模板创建了一个新项目,但是发现Portrait模式不能工作,可能是因为游戏被默认设为自动旋转。如果在GameConfig.h中看到语句: #define GAME_AUTOROTATION kGameAutorotationUIViewController 需要把它改为以下这行语句以禁用自动旋转: #define GAME_AUTOROTATION kGameAutorotationNone
本文摘自:iOS 5 cocos2d 游戏开发实战(第2版)
书 号: |
9787302303039 |
出 版 社: |
清华大学出版社 |
定 价: |
59.80元 |
出 版 日 期: |
2012-10-01 |
作 者: |
(美)伊特海姆(德)勒夫 |
译 者: |
同济大学苹果俱乐部 |
系 列书 名: |
清图程序设计系列 |
开 本: |
16 开 |
页 数: |
456 |
印 刷 时 间: |
2012-10-15 |
字 数: |
694千字 |
版 次: |
2 |
包 装: |
平装 |
印 次: |
1 |
样章试读: