如何用Cocos2d来开发简单的IPhone游戏教程
这一周接触到Cocos2D开发,在它的官网上看到Ray Wenderlic写的关于cocos2d开发的文章,感觉写的挺好,翻译了一下。
原文链接地址大家可以在上面看到作者的更多内容
初次翻译文章,望各位关照,想说的话在作者的文章里边也有表述,就直接开始吧
游戏截图
?
例子下载: Cocos2DSimpleGame.zip (776 K) 下载次数:348
????? Cocos2D是iPhone开发中一个非常有用的库,它可以让你在创建自己的iPhone游戏时节省很多的时间。它具有很多的功能,比如sprite(精灵)扶持,非常酷的图形效果,动画效果,物理库,音频引擎等等。
????? 我是一个Cocos2D开发的新手,尽管有很多有用的教程来介绍如何开始利用Cocos2D开发,但我不能找到一个教程是我期待的那样,它可以创建一个简单但功能丰富的游戏,这个游戏具有动画,碰撞还有音频,不需要其它更多的高级功能。我最终自己完成了一个简单的例子,并且在我自己的经验下写了这篇教程以便于它对于其它的新手会有用。
???? 这篇教程将带你从头到尾的来了解用Cocos2D来创建一个简单的iPhone游戏的过程。你可以一步步的按教程来,也可能跳过直接从文章的最后来下载例子工程。当然,里边会有ninjas(忍者)
。
下载与安装Cocos2D
??? 你可以从 the Cocos2D Google Code page 下载Cocos2D,现在的最新版本是0.99.0-final(这也是这篇教程使用的)。?
?
??? 在你下载完代码后,你应该安装有用的工程模板。打开Terminal window(终端窗口),找到下载的Cocos2D所在的目录,输入下面的命令:./install_template.sh。
如果你的XCode不是安装在默认的目录下面(比如说你的机器上面可能安装了多个版本的SDK),你可以在安装脚本里边手工的添加一个参数。(译者注,我没试过,试过的大大可以给指明一下,17楼写明了, 谢谢17楼的提示)
Hello, Cocos2D
????? 让我们开始来用刚刚安装的Cocos2D工程模板来建立并运行一个简单的Hello World 工程。启动XCode ,选中 cocos2d-0.99.0 Applications模板创建一个新的Cocos2D工程,给工程命名为“Cocos2DSimpleGame
?
”.?
?
继续编译并运行该工程。如果一切正常,你将看到下图:
???? Cocos2D被组织到”scenes”(场景)的概念中,有点类似于游戏中的”levels”(等级)或是”screens”(屏幕).比如你需要有一个场景来为游戏初始化菜单,一个场景为游戏的主要动作,一个场景为游戏结束。?
?
?
???? 在场景里边,你要有许多的图层(就像Photoshop里边的一样),图层可能包含多个(nodes)结点,比如sprites(精灵),labels(标签),menus(菜单)及其它。当然结点也包含其它的结点(比如,一个精灵可以有一个子精灵)。
???? 在这个例子工程中,你可以看到有一个场景-HelloWorldScene,我们也将在它里边开始实现我们的游戏。继续打开源文件,你会看到在init这个方法中,它加入了一个label来在场景中显示”Hello World”。我们将要放入一个精灵来代替它。
?
添加一个精灵
???? 在添加精灵之前,我们需要即将用到的图片。你可以自己创建,或者是用Ray Wenderlich妻子为这个工程专门绘制的图片:
a player Image
a Projectile Image
a Target Image
???? 当你得到这些图片后,把它们直接拖到XCode里边的resources文件夹里边去,一定要选中"Copy items into destination group’s folder (if needed)”。?
??? 既然我们已经有了自己的图片,我们就要找出应该在哪来放置玩家。请注意,在Cocos2D里边屏幕的左下角是坐标原点(0,0),x和y值向右上角递增。因为工程是在横向模式,这意味着右上角的坐标值是(480, 320)。
???? 还需要注意的是在默认状态下当我们为一个物体设置position属性时,position属性是和我们添加的精灵的中心点关联起来的。因此如果我们想把玩家精灵放置在屏幕水平方向的左边,垂直方向的中间:
position的X坐标,要设置成[player sprite's width]/2.
Position的Y坐标,要设置成[window height]/2
下面这张图可以帮助我们更好的理解
???? 让我们试一下吧!打开Classes文件夹选中HelloWorldScene.m,用下面的代码来代替init方法:
?
???? 你现在可以编译并运行这个工程,你的精灵应该会正确显示,但背景默认是黑色的。对这个作品来说,白色背景会更好。在Cocos2D中,把一个图层的的背景颜色更改成为一个自定义颜色的简单方法是利用CCColoredLayer这个类。来尝试一下吧。选中HelloWorldScene.h并且改变HelloWorld接口省明像下面的那样:
移动目标
???? 下面我们需要在场景中添加一些目标让忍者去打击。为了让事情变的更有趣一些,我们要让这些目标移动起来-要不然没什么挑战性。我们在稍稍偏屏幕右边的地方创建一些目标,并为它们建立动作来让它们向左移动。
在init方法之前添加下面的方法:
射击子弹
????? 在这时,忍者希望有一些动作-让们添加射击吧!我们有很多的方法来实现射击,但在这个游戏中我们要在用户点击屏幕时来进行射击,从玩家射出的子弹将按照点击的方向前进。
????? 我想用一个CCMoveTo动作去保持事情还在初级层面上,但为了实现这个,我们必须做一些数学。这是因为CCMoveTo要求我们必须为子弹目的地,但我们不能只使用触摸点,因为接触点仅仅代表相对于玩家的射击方向。事实上,我们希望保持子弹通过触摸点,直到移出屏幕。
用一张图来解释这个事情:
?
因此,大家可以看到,我们利用起点到触摸点的X和Y方向的偏移创造了个小三角形。我们只需要以同样的比例大三角形 - 我们知道我们需要一个离开屏幕的结束点。
?
好了,上代码。首先,我们必须使我们的层可以支持触摸。添加下面一行到您的init方法:?
?
?
????? 在第一部分,我们选择一个触摸点来使用,先得到在当前视图中的位置,然后调用convertToGL来把坐标转化到当前的布局。这点很重要,因为我们现在是横向模式。
???? 接下来我们加载子弹精灵并像往常一样设置初始坐标。然后,我们确定我们希望子弹移动的位置,按照前面描述的算法,使用玩家和触摸点之间的联系来作为指导载体。
???? 请注意,该算法并不理想。我们正在迫使子弹继续前进直到在X方向上离开屏幕-即使首先在Y方向上已经离开了屏幕!有不同的方法来解决这个,包括检查离开屏幕的最小长度,让游戏的逻辑回调核查离开屏幕的子弹和消除回调,而不是使用回调方法,等等。但这个初级教程,我们将保持原样。
????? 我们最需要做的就是确定为运动时间。我们希望,子弹会于一个恒定的速率按照射击方向前进,所以我们再次做一些数学。我们可以找出利用勾股定理来算出移动的距离。记得在几何学里边,这是规则,指出了一个直角三角形的斜边长度等于两直角边的平方的和的开方。
???? 一旦我们有了距离,我们只是除以速度,以获得所需的时间。这是因为速度=距离/时间,或换句话说 时间=距离/速度。
??? 剩下的事情就是设置动作,就想给目标设置动作一样。编译并运行,现在你的忍者可以向前来的一大群目标开火了 !
碰撞检测
???? 所以现在我们已经让shurikens满天飞了-但我们的忍者真正想要做的是放倒一些目标。因此,让我们加入一些代码,以检测当我们的子弹和目标的相交。
???? 要做到这一点,我们首先要在目前的场景中更好的跟踪目标和子弹。把以下的代码添加到你的HelloWorldScene类声明中:?
background-music-aac.caf.zip (252 K) 下载次数:52
或是 awesome pew-pew sound effect pew-pew-lei.caf.zip (40 K) 下载次数:42 ,或者制作你自己的。
然后:?????? 添加下面的代码到你的HelloWorldScene.m文件的头部:
?
???? 在你的init方法,像下面的代码所示启动背景音乐:?
?
再用下面的代码来代替GameOverScene.m中的内容?
????? 请注意,这里有两个不同的对象:一个场景(scene)和一个图层(layer)。场景可以包含多个图层,尽管在这个例子是它只有一个。图层里边只在屏幕中心放了一个标签,并安排了一个3秒中的过渡,然后返回到HelloWorld场景中。?
????? 最后,让我们添加一些非常基本的游戏逻辑。首先,让我们跟踪玩家破坏的目标。添加一个成员变量到您的HelloWorldScene.h中 HelloWorld类如下:?
GameOverScene *gameOverScene = [GameOverScene node]; [gameOverScene.layer.label setString:@"You Lose :["]; [[CCDirector sharedDirector] replaceScene:gameOverScene];?
继续编译并运行该项目,这样你有了羸和输的判断条件并会在适当的时候看到游戏结束的场景。?
1 楼 wangzy_boy 2010-06-17 刚接触cocos2d,受用了,非常及时,感谢楼主的分享。
另外有个问题想请问楼主,我在上面这个程序中,如何能实现游戏的暂停,cocos2d中有提供缺省的方法吗? 2 楼 xiaozhao-521 2010-06-18 [CCDirector sharedDirector] 有相应的方法 3 楼 lam 2010-11-03 太棒了,感謝 4 楼 lam 2010-11-03 -(void)addTarget 这个方法里,rect:CGRectMak少了一个e