使用COCOS2D和BOX2D制作《JETPACK JOYRIDE》PART-4

本文由游戏帮翻译,泰然授权转载,转载请联系原文作者!

作者:Bogdan Vladu

clip_image002

上次在第3部分中,我们已经几乎要完成整个游戏。我们完全执行了玩家和其他游戏元素间的碰撞,使玩家可以死亡和获得分数。我们还让玩家飞行,添加了许多精妙的音效和动画。(请点击此处阅读本系列第1、2、3部

但是,我们仍然需要对游戏进行些许改进。其一,我们需要有个跟踪得分的方法。其二,我们可能还需要在游戏中添加些许可爱且可以移动的兔子,这些兔子可以奖励更多的分数。

我们的游戏看起来很棒,但是在下文中,我将向你展示通过添加背景层次来产生窗外的场景永无止尽的幻觉。我们会让背景层次移动,这样窗户外的场景就不会一成不变。

而且,如果我们让某些激光器旋转,难道不会让游戏变得更加有趣吗?阅读下面的文章,完成这款游戏的制作!

开始:旋转激光器

现在,我们从第3部分已完成的项目开始。你也可以直接下载项目当前版本。

我们要做的首件事情是让我们的激光器旋转。我们不能让这款游戏太简单!所以,在LevelHelper中打开项目,确保你打开的是最新版本的关卡。

首个步骤是选择确定标签来确定一个新的标签。将其命名为“ROTATING_LASERS”

clip_image004

rotatingLasersTags(from raywenderlich)

当我们通过代码执行旋转时,我们将使用这个新标签来指代旋转的激光器(游戏邦注:并非所有的激光器都会设置成旋转)。

现在,在关卡中选择几个激光器。确保你选择的激光器有旋转的空间。将ROTATING_LASERS标签分配给这些激光器。

clip_image006

rotLasersTag(from raywenderlich)

完成激光器标签分配后,保存关卡,打开你的Xcode项目。导向HelloWorldScene.h并在类定义中添加下列代码:

NSArray* rotatingLasers;

然后,在HelloWorldScene.mmretrieveRequiredObjects方法末端添加下列代码:

rotatingLasers = [lh spritesWithTag:ROTATING_LASERS];
[rotatingLasers retain];

这个代码涉及到的是所有带有ROTATING_LASERS标签的精灵。因为这种方法返回的阵是自动释放的,所以我们需要将其保留下来。为了不遗忘释放这个保留阵,转向dealloc函数,在LevelHelperLoader对象释放前添加下列代码:

[rotatingLasers release];

现在,我们已经抓住了我们想要的激光器,让我们来使它们开始旋转!进入tick方法,在末端编写下列代码:

for(LHSprite* laser in rotatingLasers)
{ 

[laser transformRotation:[laser rotation]+1]; 

}

如果你现在运行游戏,所旋转的激光器就会旋转,但是当玩家与它接触时并不会死亡。这是因为我们还未给ROTATING_LASERS标签注册碰撞事件。要实现这个目标,在setupCollisionHandling方法中添加下列代码:

[lh registerPreCollisionCallbackBetweenTagA:PLAYER andTagB:ROTATING_LASERS idListener:self selListener:@selector(mouseLaserCollision:)];

现在运行游戏,激光器会旋转,而且会同非旋转激光器一样杀死玩家。祝贺你,你刚刚又让游戏的难度层次获得提升。但是,你可能需要对游戏进行更多次的试玩,确保在修改后玩家仍然可以通过该关卡!

移动的兔子

奔跑和跃过沉睡的猫和狗并躲避旋转的激光器,这些内容都很有趣,但是我们要在游戏中添加其他奖励成分,让其变得更加复杂。我想到了,我们可以添加兔子。玩家可以通过杀死可爱无助的兔子来获得分数。

打开SpriteHelper,选择文件\新建。然后打开取景器,导向ArtPack文件夹(游戏邦注:如果没有的话可以从第1部分教程中下载),选择兔子图片并将它们拖动到SpriteHelper窗口中。然后点击打包精灵按钮。

clip_image008

packBunnies(from raywenderlich)

现在,选择列表中所有的精灵,激活物理资产菜单中的传感器选项。应当注意的是,我们的额外奖励成分钱币也是传感器。

clip_image010

bunnyIsSensor(from raywenderlich)

接下来,使用兔子框架创建以下两个动画:

动画名称:BunnyRun;速度:0.400;游戏开启时开始:是;永远循环:是;框架:bunny_1, bunny2

clip_image012

bunnyRunAnim(from raywenderlich)

动画名称:BunnyDie;速度:0.400;游戏开启时开始:是;永远循环:是;框架:bunny__die_1, bunny_die_2

clip_image014

bunnyDieAnim(from raywenderlich)

创建完动画后,将场景保存在Xcode项目的图片文件夹中。

clip_image016

saveBunny(from raywenderlich)

回到LevelHelper,我们可以在动画版块中看到兔子动画。选择BunnyRun动画,将其拖到关卡中。

clip_image018

dragBunnyInLevel(from raywenderlich)

现在,我们的关卡中有个兔子,但是不可见,因为我们需要令其随视差移动。

要将兔子添加到视差中,选择视差标签,选择我们的视差,添加兔子精灵。将移动比率的X成分设为1,这样兔子就能够以与关卡相同的速度移动。

clip_image020

bunnyToParrallax(from raywenderlich)

如果我们在场景测试器中运行关卡,我们看不到兔子。这是因为,我们还需要在兔子图片上设置批Z坐标。

导向图片版块,将兔子图片的批Z值设为3。这样做便会使兔子位于除玩家外的所有内容上。

clip_image022

bunnyBatchZ(from raywenderlich)

场景测试器中再次运行关卡,我们会看到兔子随视差移动,但是兔子的位置似乎总是保持不变。我们想要让兔子从右向左和从左向右移动。要实现这个目标,我们必须让它在一条路径上移动。

导向“Bezier”版块,点击新建来创建描绘兔子路径的新Bezier

clip_image024

createBezier(from raywenderlich)

点击关卡视图画出兔子的路径,点击结束按钮确认完成Bezier设置。

clip_image026

finishBezier(from raywenderlich)

现在,在Bezier资产中选择路径选项,告诉LevelHelperBezier视为路径。

注:

1、默认情况下,Bezier是一条简单的线。你可以在资产菜单中取消选定线性来让它们成为真正的Bezier

2、点击编辑按钮并拖动点,你可以通过这种方式来编辑Bezier

3、在编辑Bezier时,按住COMMAND同时点击贝塞尔线可以创建新的点。

4、在编辑Bezier时,按住ALT同时点击点可以移除线上的点。

clip_image028

bezierPath(from raywenderlich)

现在,我们已经确定了路径,但是兔子精灵不知道它应当在这条路径上移动。我们可以通过设置让它明白这一点。

选择兔子,然后在通用资产版块中,点击路径

clip_image030

clickPath(from raywenderlich)

标签: Jetpack Joyride, cocos2d教程

?>