为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

如何使用cocos2d来制作一个打地鼠的游戏:第一部分

2012-03-05 20页 pdf 687KB 20阅读

用户头像

is_144099

暂无简介

举报
如何使用cocos2d来制作一个打地鼠的游戏:第一部分 版权属于:子龙山人 首发于:泰然论坛 (译)如何使用 cocos2d 来制作一个打地鼠的游戏:第一部分 整理:Taiyangmobile(泰然论坛管理组) 著作权声明:本文由 子龙山人 翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声 明和作者博客链接,谢谢!首发于泰然论坛 免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用, 切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表 该...
如何使用cocos2d来制作一个打地鼠的游戏:第一部分
版权属于:子龙山人 首发于:泰然论坛 (译)如何使用 cocos2d 来制作一个打地鼠的游戏:第一部分 整理:Taiyangmobile(泰然论坛管理组) 著作权声明:本文由 子龙山人 翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声 明和作者博客链接,谢谢!首发于泰然论坛 免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用, 切勿进行商业传播。同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发 该翻译稿之人无任何关系。谢谢合作! 原文链接地址: http://www.raywenderlich.com/2560/how-to-create-a-mole-whacking-game-with -cocos2d-part-1 教程截图: 在 iOS Programming 101 课程中,我的一个学生提议,让我写一个教程,关于如何使用 cocos2d 来制作一个打地鼠的游戏。 我认为这是一个非常好的主意,原因有三:  目前,我的博客上有许多关于 cocos2d 的教程了,但是,却没有一个教程把制作一个 游戏相关的所有细节都放在一起来开发一个游戏。因此,这个教程应运而生了。  这是一个非常好的机会来介绍一个新的话:如何制作一个游戏,让它同时在 iphone、 ipad 和支持高清(retina)显示的 iphone 上面运行。  当然,最重要的原因是--打地鼠本来就很有趣! 这个教程建立在下列教程的基础之上:  如何使用 cocos2d 来制作一个简单的 iphone 游戏  如何在 cocos2d 里面使用动画和 spritesheet 版权属于:子龙山人 首发于:泰然论坛  在 cocos2d 里面如何使用 Texture Packer 和像素格式来优化 spritesheet  在 cocos2d 里面如何拖拽精灵 如果你还没有阅读上面这些教程,我强烈建议你先读一读。 这是一个两部分的教程。在第一部分中,我们将会创建基本的游戏框架--有一些可爱的地鼠 从洞里面钻出来。我们将会花费大量的时候来讨论如何组织图片资源和坐标计算,以便于你的游 戏能够同时运行在 iPhone3GS、ipad 和高清显示的 iphone(其实是就是 iphone4)上面, 同时还要保证游戏性能! 规划图片资源: 总览 因为,我们想让这个应用能够同时运行在 iphone、retina-display iphone 和 ipad 上面, 所以,我们需要花点时间来仔细考虑一下,如何制作图片,主要是图片的尺寸! 为了理解到底多大的尺寸合适,首先,我们要先讨论下面三个主题:  Retina Display and UIKit  Retina Display and Cocos2D  iPad, iPhone, and Aspect Ratios Retina Display and UIKit 普通的 iphone 和支持高清显示的 iphone 之间的差别就是支持高清显示的 iphone 能够显 示2倍的像素。因此(在 landscape 模式下),普通的 iphone 显示480×320个像素, 而支持高清的 iphone 则可以显示960×640个像素。 “但是,请等一下”,你可能会问,“如果显示2倍数量的像素,那么不会破坏那些已经写好 的假设屏幕大小只有480×320的应用程序吗?” 没错,特别是当你使用 UIKit 编程的时 候,通常都是硬编码 frame 的大小。但是,如果你在 UIKit 里面指定 frame 大小的时候,实际 的单位是点,而不是像素。 版权属于:子龙山人 首发于:泰然论坛 在一个普通的 iphone 上面(不支持 retina display),一个点就等于一个像素。但是, 在支持 retina 的 iphone 上面,一个点等于2个像素。因此,当你指定(10,10),在普 通的 iphone 上面也是(10,10),而在支持 retina 的 iphone 上面,则是(20,20), 因此,那会是同样的相对偏移量。(因为,像素加倍了,相对于图片来说,相对偏移量相等)。 当你使用 apple 的控件或者 Core Graphics,Apple 已经写了一些代码来确保在 Retina 显示的时候没有问题。(因为你写代码指定大小都是 point 为单位) 唯一的需要注意的就是使用图片的时候。比如你在一个 iphone 程序中使用了一张200× 200的图片,如果你什么也不做,那么 retina 显示会把这张图的尺寸放大2倍--那样会很难 看,如下图所示,会模糊。 因此,你所需要做的就是为所有的图片提供两种版本,一种普清的,一种高清的。如果在高 清图片名字后面增加一个@2x 后缀(比如 sample@2x.png),那么不管什么时候,你只要调 用[UIImage imageNamed:...]或者一些更简单的 api,当程序编译到支持高清设备的时候, 就会自动加载后缀为@2x 的图片。 因此,制作一个支持 Retina 显示的 UIKit 程序是非常容易的,只需要为每一张普清图片同 时提供一个高清版本(2倍像素),并且指定为@2x 后缀即可。 那么 cocos2d 里面该如何做呢? 版权属于:子龙山人 首发于:泰然论坛 Retina Display and Cocos2D 告诉你们一个好消息--最新版本的 cocos2d 完全支持 retina 显示,而且使用这个功能只需 要下列1-2-3步:  调用 CCDirector 的函数 enableRetinaDisplay 来开启 retina 显示支持。如果你使用 cocos2d ,那么只需要把 app delegate 里面对这句函数调用的注释去掉即可!  往你的程序中添加2倍大小的精灵图片,但是,这里命名不是增加@2x 后缀,而是使 用-hd(如:sample-hd.png)。当你加载精灵的时候,使用不带-hd 后缀的图片名字, 当 cocos2d 被部署到支持 retina 显示的设备上时,就会自动加载高清的图片。  当你在 cocos2d 里面设置精灵坐标的时候,使用的是点,而不是像素。注意:有些 api 使用的是像素,这些方法中都包含pixel字样,比如position和positionInPixel。InPixels; 因此,你只需要让美工提供给你高清格式的图片就行了,你可以很容易地使用软件把这些高 清图片变得普清图片。比如 TexturePacker 就可以做这样的事。 你可能会奇怪,为什么需要准备两种不同格式的图片--为什么不每次都加载高清的图片,然 后当需要普清图片的时候,用程序来缩放?好吧,因为把纹理(texture)加载到内存里面是非 常消耗内存的操作,如果某个程序被安装在不支持高清显示的设备上面(比如 IPOD2),那么 你就会占用两倍大小的内存,当然是相比于只加载普清的图片的程序。(因为高清图片像素个数 多一倍,所以必须消耗的内存要大。正确的做法就是前面说的,提供两套图片。) 不用担心,你没有必要在 photoshop 里面不停地缩放图片的尺寸。TexturePaker 里面有 一个非常好的功能,可以很容易地通过高清图片得到对应的普清图片,这种方法在后面的教程中 会讲到。 iPad, iPhone, and Aspect Ratio 好,现在处理 iphone 上面的高清和普清显示非常简单了(准备两套图片),但是,iPad 呢?该怎么做呢? 呃,要想编写一个游戏,让它同时能够在 iphone 和 ipad 上面运行似乎是一件非常烦人的 事--因为设备的纵横比(aspect ratio)不一样! iphone 支持 480*320 或者 960*640---因此是 1.5 的纵横比。然后,iPad 是 768*1024 的--纵横比等于 1.33. 这意味着,如果你有一张图片,能够完全覆盖 iPad 的背景(768*1024),如果你也想在 iPhone 里面继续使用它。那恐怕不会匹配那么好。比如,你把它缩小,让宽度等于 iphone 的 宽度(通过乘以 0.9375):你会得到 720*960,因此,还是会有一部分图像不能显示! 版权属于:子龙山人 首发于:泰然论坛 这让事情变得有点恼火了,因为,不只是背景图片的问题,因为纵横比的不同,原先设置节 点使用的坐标就不能够再使用了。 目前有一些方法可以解决这个问题,下面列举了一些我看过的、听过的和使用过的(如果你 们有更好的方法,可以留言):  考虑一个“可玩区域”,这个区域的大小等于 640*960,同时把它放置在 iPad 的屏幕中 间。这会使得游戏区域外面有一些空白--但是,你还可以放置一张位置不动、颜色相同 的背景图片,那么玩家在玩游戏的时候就很难发现了。这样会使你很容易地在不同的设 备之间使用相同的坐标值,并且还可以重用图片资源。这个方法也是我们这个教程里所 使用的方法。  你可以使你的 iPad 的程序的纵横比与 iPhone 的纵横比一样,在 iPad 屏幕的边界留出 42 个像素,把“主要”放置在 685*1024 的范围中。如果,你可以把你的应用中的 内容放置在 684*1024 的“盒子”中,那么你就可以为每一个设备使用缩放图片了。  你可以为 iPhone、iPad 和 Retina display 的 iPhone 提供不同的图片和坐标值。这样 的灵活性是最大的,但是,会产生更大的二进制程序文件,并且不同的设备上面的对象 位置都需要重新计算。 另一个原因,cocos2d 目前对 iPad 的支持并不是很友好。只是可以自动加载后缀为“-hd” 的图片,转换坐标的工作还是得由你来做。 规划图片资源:结论 好,基于上面的讨论,下面是这篇教程的图片资源规划:  图片被设计成一个 960*640 的“可玩区域”大小,在高清的 iphone 上面就是全屏的, 在 iPad 上面就会居中显示。  高清图片可以通过 TexturePacker 转换成普清的,并且生成相应的 spritesheet。  高清的图片将以“-hd”作为后缀,而普清的图片则没有。cocos2d 会根据当前是否支持 高清显示而加载相应的图片。 版权属于:子龙山人 首发于:泰然论坛  背景是一个特例,因为它总是需要全屏。背景将会做成 1024*768 的大小(因为 iPad 屏幕的大小是 1024*768)。当这张图片用作 iPhone 上面的时候,会有一部分图片会 超过屏幕边界,但是,在这个教程中,并没有关系。(后面将会看到,背景颜色很单一)  iPad 版本版本将会包含一些代码,用来加载“-HD”后缀的图片,转换坐标并设置到“可 玩区域”内,使用合适的字体大小等。 首先,下载这篇教程的图片资源,解压,然后看看里面有什么:  在“foreground”文件夹中,前景大小为 1024*768(也就是 iPad 的大小),但是,它 实际上被划分为两个部分:上半部和下半部。因为我们将在这两个部分当中放置三个“地 鼠洞“,这样就会看起来,地鼠真的是从地底下钻出来的。  在”background“文件夹中,iPad 的纵横比是 1.33,所以一半是 512*384.这是因为, 背景实际上是看不到的,只有通过 3 个地鼠洞才可以看到背景。这么小的范围,完全没 有必要加载一张 1024*1024 的图片。相反,我们加载一张小图片,然后放大。  在"sprites”文件夹中,所有的精灵都被设置成可以放到 960*640 的“可玩区域”内。注 意,还有一个地鼠图片,二个地鼠动画(一个笑的动画,一个被打中时的动画)。 好了,有足够的背景信息了--是时候开始动手了!、 Getting Started 打开 XCode,选择“File\New Project...",然后选择“User Templates\cocos2d\cocos2d Application”,再点击”Choose...“。把工程命名为 WhackAMole,单击 Save。 接下来,把你刚刚下载下来的图片资源文件夹全部拷到工程目录下面。它的位置应该是 Classes 文件夹的兄弟,如下图所示: 版权属于:子龙山人 首发于:泰然论坛 接下来,确保你已经安装了 TexturePacker。如果你还不知道怎么使用它,可以查看译者 翻译的另一篇教程。 你可以打开 TexturePacker 工具,并为这个项目创建所有的 sprite sheet。你也可以使用 TexturePacker 的命令行工具,它可以和 XCode 集成,并且处理起来更加高效! 右击 Resources,选择”Add\New File...“,选择 Mac OS X\Other\Shell Script,再点 Next。取名为 PackTextures.sh,然后点 Finish。 然后把 PackTextures.sh 里面的内容替换成下面的代码: #!/bin/sh 版权属于:子龙山人 首发于:泰然论坛 TP="/usr/local/bin/TexturePacker" if [ "${ACTION}" = "clean" ] then echo "cleaning..." rm resources/background* rm resources/foreground* rm resources/sprites* else echo "building..." ${TP} --smart-update \ --format cocos2d \ --data resources/background-hd.plist \ --sheet resources/background-hd.pvr.ccz \ --dither-fs \ --opt RGB565 \ Art/background/*.jpg ${TP} --smart-update \ --format cocos2d \ --data resources/background.plist \ --sheet resources/background.pvr.ccz \ --dither-fs \ --scale 0.5 \ --opt RGB565 \ Art/background/*.jpg ${TP} --smart-update \ --format cocos2d \ --data resources/foreground-hd.plist \ --sheet resources/foreground-hd.pvr.ccz \ --dither-fs-alpha \ --opt RGBA4444 \ Art/foreground/*.jpg ${TP} --smart-update \ --format cocos2d \ --data resources/foreground.plist \ --sheet resources/foreground.pvr.ccz \ --dither-fs-alpha \ --scale 0.5 \ --opt RGBA4444 \ Art/foreground/*.jpg ${TP} --smart-update \ --format cocos2d \ --data resources/sprites-hd.plist \ --sheet resources/sprites-hd.pvr.ccz \ 版权属于:子龙山人 首发于:泰然论坛 --dither-fs-alpha \ --opt RGBA4444 \ Art/sprites/*.jpg ${TP} --smart-update \ --format cocos2d \ --data resources/sprites.plist \ --sheet resources/sprites.pvr.ccz \ --dither-fs-alpha \ --scale 0.5 \ --opt RGBA4444 \ Art/sprites/*.jpg fi exit 0 这个脚本运行 TexturePacker 来为背景图片、前景图片和精灵图片创建相应的精灵表单 (sprite sheet)--同时包含高清的和普清的。 注意,每一个图片都被保存为 pvr.cca 格式,因为,这是一种磁盘占用空间小,并且内存 消耗也少的图片格式。当然,像素格式和抖动选项也被设置了,这是一个折中,综合考虑内存消 耗和图片显示质量。 如果你对 TexturePacker 的这些选项的功能不是很清楚,你可以打开终端(Terminal), 然后输入 TexturePacker -help,那么就会有完整的选项功能列表。 接下来,你需要做一些设置,在你的工程每次编译的时候,可以运行这个 shell 脚本。右键 点击 Targets,选择“Add\New Target...",再选择"External Target”(注意不要选择 Shell Script Target!),然后点击 Next。把这个 Target 命名为 TexturePacker 并点击 Finish。 然后右键点击刚刚建立的这个 Target,修改它的设置,如下图所示: 版权属于:子龙山人 首发于:泰然论坛 最后一步,就是为你的程序设置 target 依赖。双击项目 Target,然后找到 General 标签, 点下面的+号,再从弹出的列表中选择 TexturePacker Target,并点击 Add Target。 版权属于:子龙山人 首发于:泰然论坛 编译你的工程,如果输出结果如下图所示,那么就证明你的配置 OK。(注意,上面的这些 全是针对 XCode3 所设置的,XCode4 大同小异,只是界面不一样了,原理不变) 版权属于:子龙山人 首发于:泰然论坛 接下来,把刚刚生成的精灵表单和相应的属性列表增加到项目中。右击 Resources,选择 “Add\Existing Files...”,然后选择 background,foreground 和 sprites 文件(总共有 12 个 文件),再点 Add.如果做完后,那么看起来会是下图这个样子: 版权属于:子龙山人 首发于:泰然论坛 如果你愿意,你可以双击任何一个.pvr.ccz 文件,打开看看,里面到底有什么。你就会发 现 TexturePacker 有多么方便了! 设置背景 接下来,HelloWorldScene.m文件并找到 init方法。删掉自动生成的那 4行创建一个 label 的代码。同时,用下面的代码替换掉: // Determine names of sprite sheets and plists to load NSString *bgSheet = @"background.pvr.ccz"; NSString *bgPlist = @"background.plist"; NSString *fgSheet = @"foreground.pvr.ccz"; NSString *fgPlist = @"foreground.plist"; NSString *sSheet = @"sprites.pvr.ccz"; 版权属于:子龙山人 首发于:泰然论坛 NSString *sPlist = @"sprites.plist"; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { bgSheet = @"background-hd.pvr.ccz"; bgPlist = @"background-hd.plist"; fgSheet = @"foreground-hd.pvr.ccz"; fgPlist = @"foreground-hd.plist"; sSheet = @"sprites-hd.pvr.ccz"; sPlist = @"sprites-hd.plist"; } // Load background and foreground [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:bgPlist]; [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:fgPlist]; // Add background CGSize winSize = [CCDirector sharedDirector].winSize; CCSprite *dirt = [CCSprite spriteWithSpriteFrameName:@"bg_dirt.jpg"]; dirt.scale = 2.0; dirt.position = ccp(winSize.width/2, winSize.height/2); [self addChild:dirt z:-2]; // Add foreground CCSprite *lower = [CCSprite spriteWithSpriteFrameName:@"grass_lower.jpg"]; lower.anchorPoint = ccp(0.5, 1); lower.position = ccp(winSize.width/2, winSize.height/2); [self addChild:lower z:1]; CCSprite *upper = [CCSprite spriteWithSpriteFrameName:@"grass_upper.jpg"]; upper.anchorPoint = ccp(0.5, 0); upper.position = ccp(winSize.width/2, winSize.height/2); [self addChild:upper z:-1]; // Add more here later... 好,让我们一个一个来讲解,因为,这里面有许多新的东西。 1.决定加载的精灵表单和 plist 文件的名字。这个部分,把 TexturePacker 生 成的精灵表单和 plist 文件,按照某种方式加载进来了。注意,在 iPhone 上面, cocos2d 会自动地加载“-HD”和不带“HD”的版本,具体取决于是否激活 Retina 显 示。然后,在 iPad 上面,它并不会加载"-hd"版本,所以你必须手动告诉它加载, 因此,上面我们判断,如果是 iPad,那么就加载带"-hd"版本的资源。 2.加载背景和前景。接下来就是把背景、前景还有精灵都加载到精灵帧缓冲(sprite frame cache)中,以便后面可以使用。注意,目前精灵并没有加载到 CCSpriteBatchNode 中。 版权属于:子龙山人 首发于:泰然论坛 3.添加背景。背景图片作为当前层的一个孩子被加进去。(Z=-2 的话,就可以使任何对 象都在它上面,除非其它对象的 Z 小于-2)。接下来,把这张图片放大两倍,因为,之前,我 们为了节约内存,只使用了一半大小的图片。之后,再把图片放置到屏幕中间。 4.前加前景。前景是当作两个部分加上去的。这里用了一种非常简单的设置精灵图片坐标点 的方式,通过设置精灵的锚点为图片的中点,或者底部,或者顶部。通过这种方式,假如你要把 一张图片的左下角设置为屏幕的左下角,你只需要先把图片的锚点设置为(0,0),然后设置 position 为 0,0 就好了。非常方便!而且,这个坐标值,在所有的设备上都通用。注意,背景 部分超出屏幕之外了,但是,这并没有关系,因为用户看不到。还要注意的是,图片增加的时候, 使用了不同的 Z 值,最后面的图片使用最小的 Z 值。 编译并运行,你会看到如下的输出。你可以通过模拟器测试,也可以通过真机测试,看看效 果到底如何^^。 如果你尝试在支持高清的设备上运行,你会注意到,图像有模糊,似乎还是使用普清的资源。 版权属于:子龙山人 首发于:泰然论坛 这是因为,我们还有一步没有做完:还需要调用 CCDirector 的 enableRetinaDisplay 方 法能激活高清显示。 为了实现这个目的,打开 WhackAMoleAppDelegate.m,然后在 applicationDidFinishLaunching 方法里面,删除那三句注释: if( ! [director enableRetinaDisplay:YES] ) CCLOG(@"Retina Display Not supported"); 编译并运行,现在,再尝试使用支持高清的设备吧,这时就会加载高清图片资源了。 放置地鼠 对于这个游戏来说,你将会在场景中添加 3 只地鼠--每个洞一个地鼠。地鼠会躲在草的下 面,但是,会突然从某个洞里冒出来,这样你就可以打它了。 首先,让我们为每个洞的下面添加一只地鼠。我们会先让它们在所有的图片上面,这样,可 以确保位置对了,然后通过修改 Z 值,就能够把它们隐藏到草地后面去了。 打开 HelloWorldScene.h,然后增加一个数组来保存当前关卡的地鼠,如下所示: 版权属于:子龙山人 首发于:泰然论坛 // Inside @interface HelloWorld NSMutableArray *moles; 通过保存地鼠的数组,我们可以很容易地遍历每一只地鼠。 接下来,在 init 方法中添加一些代码来放置地鼠(添加位置位于 “Add more here later…” 注释后面),如下所示: // Load sprites CCSpriteBatchNode *spriteNode = [CCSpriteBatchNode batchNodeWithFile:sSheet]; [self addChild:spriteNode z:999]; [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:sPlist]; moles = [[NSMutableArray alloc] init]; CCSprite *mole1 = [CCSprite spriteWithSpriteFrameName:@"mole_1.jpg"]; mole1.position = [self convertPoint:ccp(85, 85)]; [spriteNode addChild:mole1]; [moles addObject:mole1]; CCSprite *mole2 = [CCSprite spriteWithSpriteFrameName:@"mole_1.jpg"]; mole2.position = [self convertPoint:ccp(240, 85)]; [spriteNode addChild:mole2]; [moles addObject:mole2]; CCSprite *mole3 = [CCSprite spriteWithSpriteFrameName:@"mole_1.jpg"]; mole3.position = [self convertPoint:ccp(395, 85)]; [spriteNode addChild:mole3]; [moles addObject:mole3]; 首先,为精灵创建一个 CCSpriteBatchNode,这样就可以更加高效地渲染这三只地鼠了。 (每次只需要一个 OpenGL call),并把 batchNode 当作当前层的一个孩子加进去。注意,Z 值 被临时设置成 999,因此,地鼠就会显示在所有的图片之前,那样我们就可以判断地鼠位置是 否正确。 然后从精灵帧缓冲中加载所有的精灵。接着,为每一个地鼠创建一个精灵,把它们放置在场 景中,同时添加到数组里面。注意,每个地鼠的坐标是在一个 480*320 的“可玩区域”内(iphone 屏幕的大小)。对于 iPad 来说,这些点需要做一些转换,因此,我们定义了一个辅助函数 convertPoint。接下来,在 Init 方法的上面加入下列代码: - (CGPoint)convertPoint:(CGPoint)point { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { return ccp(32 + point.x*2, 64 + point.y*2); } else { return point; } } 这个方法把“可玩区域”内的一个点转换成合适的 iPad 屏幕上面的点。记住: 版权属于:子龙山人 首发于:泰然论坛  我们在 iPad 上面使用的是高清的图像,所有的像素点都要加倍。  我们把 960*640 的区域居中放在 1024*768 的 iPad 屏幕上,因此,左右两边要留下 32 个像素的 margin,上下两边要留下 64 个像素的 margin。 因此, 这个方法只是做了一些简单的数学计算,使得坐标在 iPad 上面不会出问题。 还有一件事---在忘记之前,我们需要做一些内存清理操作,找到 dealloc 方法,添加下列 代码: [moles release]; moles = nil; 编译并运行,你将看到 3 只地鼠放置在正确的位置上了!你因此同时测试一下 iPhone,Retina iPhone 和 iPad,确保每个设备上看起来都没问题。 弹出地鼠 现在,我们确定地鼠的位置没有问题了,接下来,让我们添加一些代码,让他们能够从地下钻 出来吧! 第一件事,把 Z 值,从 999 改成 0,这样的话,地鼠就会在地底下了。 改完之后,在 init 方法的后面添加下面的代码: [self schedule:@selector(tryPopMoles:) interval:0.5]; 如果之前你没有见过这样的用法,你可以调用其它的方法,比如 schedelUpdate。但是, 这个例子中,我们只想让地鼠每隔 0.5 秒钻出一个。 接下来,增加 tryPopMoles 方法: - (void)tryPopMoles:(ccTime)dt { for (CCSprite *mole in moles) { if (arc4random() % 3 == 0) { 版权属于:子龙山人 首发于:泰然论坛 if (mole.numberOfRunningActions == 0) { [self popMole:mole]; } } } } 这个方法会每隔 0.5 秒调用一次,每一次它都会循环判断每一个地鼠,让它有 1/3 的机会 从洞里面钻出来。但是,如果它已经钻出来,也就是运行的 action 的个数不等于 0 的话,那么 也不会再钻了。 最后,实现 popMole:方法: - (void) popMole:(CCSprite *)mole { CCMoveBy *moveUp = [CCMoveBy actionWithDuration:0.2 position:ccp(0, mole.cont entSize.height)]; // 1 CCEaseInOut *easeMoveUp = [CCEaseInOut actionWithAction:moveUp rate:3.0]; / / 2 CCAction *easeMoveDown = [easeMoveUp reverse]; // 3 CCDelayTime *delay = [CCDelayTime actionWithDuration:0.5]; // 4 [mole runAction:[CCSequence actions:easeMoveUp, delay, easeMoveDown, nil]]; / / 5 } 这个代码,使用 cocos2d 的 action 来制作弹出洞的效果,先弹出来,然后暂停半秒,再 钻回去。让我们一行一行地解释:  创建一个 action,让地鼠沿着 Y 轴钻洞来。因为,之前我们放置地鼠的位置是正确的, 所以看起来,就像是从洞下面钻出来一样。  为了使得移动更加真实,上面的 action 用一个 CCEaseInOut action 包装起来了。这 会得钻洞的动作在开始和结束的时候速度比较慢,看起来,就好像地鼠在加速和减速一样。  创建一个 action,使地鼠能够钻回来。这里通过调用 action 的 reverse 方法,能得到 相反的 action.  创建一个 action,在地鼠钻出来以后,能够暂停 1 秒。  现在,action 可以运行了。通过用 CCSequence 把这 3 个 action 包装起来,那样它 们就可以按顺序执行了。 就这么多!编译并运行代码,你将会看到 3 只地鼠交替地钻出洞来,cool 吧? 版权属于:子龙山人 首发于:泰然论坛 何去何从? 本教程完整源代码。 期待这个教程的后续吧,在那个教程里,我们会添加很酷的动画,同时会添加一些游戏逻辑, 使得你可以打地鼠并且得分。当然,还有非常好听的音乐。 译者的话:翻译如果有语法错误还忘指出,最近时间比较紧,校对工作没时间仔细做了,欢 迎大家不吝指出! 著作权声明:本文由 http://www.cnblogs.com/andyque 翻译,欢迎转载分享。请尊重 作者劳动,转载时保留该声明和作者博客链接,谢谢!
/
本文档为【如何使用cocos2d来制作一个打地鼠的游戏:第一部分】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索