2018正版葡京赌侠诗iphone 游戏编程入门1

打算攻读iphone游戏编程,看到iteye有篇好之章,所有就迁移过来了。著作写的不错。

 原文链接:http://o0o0o0o.iteye.com/blog/649331

 英文原稿链接:http://www.raywenderlich.com/352/how-to-make-a-simple-iphone-game-with-cocos2d-tutorial

 

立时同一完善接触到Cocos2D支付,在她的官网上看到Ray
Wenderlic写的有关cocos2d付出之稿子,感觉写的慌好,翻译了一下。
原文链接地址世家好在面看到作者的双重多内容

头翻译随笔,望各位关照,想说之话语在笔者的篇章里也起公布,就直开吧

游戏截图
 
2018正版葡京赌侠诗 1
事例下载: 2018正版葡京赌侠诗 2
Cocos2DSimpleGame.zip

(776 K) 下充斥次数:348

     
Cocos2D凡vivo开发中一个可怜管用的仓库,它可为您于开立和谐之金立游戏时省去成千上万之岁月。它抱有众多底效应,比如sprite(精灵)扶持,非凡丰硕的图样效果,动画效果,物理库,音频引擎等等。

     
我是一个Cocos2D开之初手,即使有许多使得的科目来介绍如何开端拔取Cocos2D付出,但自己无法找到一个学科是本身愿意的那么,它好成立一个简
单但效用丰硕的游艺,那么些娱乐所有动画,碰撞还有音频,不需要另更多的高等级功效。我最终自己形成了一个概括的事例,并且于本人好之经验下写了当下首教程以
便于它对于另外的初手会有因而。

    
那首教程将拉动您锲而不舍的来打听用Cocos2D来创建一个粗略的vivo游戏的进程。你可以一步步的仍学科来,也说不定逾了从来由著作的最终来下充斥例子工程。当然,里边会出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

 

”. 
 
2018正版葡京赌侠诗 3
累编译并运行该工程。假诺一切正常,你将视下图:

2018正版葡京赌侠诗 4

    
Cocos2D深受公司到”scenes”(场景)的概念被,有硌类似于戏被的”levels”(等级)或是”screens”(屏幕).比如你要有一个情状来吗游戏开首化菜单,一个情景吧游乐的第一动作,一个光景也玩了。 

 

 

    
在气象里,你如果生许多的图层(就如Photoshop里边的同样),图层可能含有四个(nodes)结点,比如sprites(精灵),labels(标签),menus(菜单)及另。当然结点也富含其他的结点(比如,一个机智可以发一个子精灵)。

    
在这么些事例工程被,你可看到出一个气象-HelloWorldScene,我们啊用当其其中起头兑现我们的一日游。继续打开源文件,你会面相在init这单方法被,它参预了一个label来以景被显示”Hello
World”。大家且放入一个灵活来顶替它。
 
添加一个敏感

     在加上敏感在此之前,我们要将以的图纸。你得协调创办,或者是用Ray
Wenderlich妻子为夫工程专门绘制的图样:
a player Image
2018正版葡京赌侠诗 5
a Projectile Image
2018正版葡京赌侠诗 6
a Target Image
2018正版葡京赌侠诗 7

    
当您抱这个图片后,把它一贯拖到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
脚那张图可以扶助大家再好之知情

2018正版葡京赌侠诗 8

    
让我们尝试一下咔嚓!打开Classes文件夹选中HelloWorldScene.m,用脚的代码来代替init方法:

Cpp代码  2018正版葡京赌侠诗 9

  1. -(id) init{   
  2.     if( (self=[super init] )) {  
  3.    
  4.         CGSize winSize = [[CCDirector sharedDirector] winSize];   
  5.         CCSprite *player = [CCSprite spriteWithFile:@”Player.png”   
  6.         rect:CGRectMake(0, 0, 27, 40)];   
  7.         player.position = ccp(player.contentSize.width/2,   
  8.                                           winSize.height/2);   
  9.        [self addChild:player];   
  10.   
  11.   }   
  12.        return self;   
  13. }   

 

     你本足编译并运行是工程,你的机智应该会对突显,但背景默认是红色的。对斯小说来说,白色背景会重好。在Cocos2D中,把一个图层的之背景颜色改变成一个自定义颜色之粗略方法是动CCColoredLayer这些类似。来品尝一下咔嚓。选中HelloWorldScene.h并且改变HelloWorld接口省明像上面的这样:

Cpp代码  2018正版葡京赌侠诗 10

  1. @interface HelloWorld : CCColorLayer   

 
  
然后入选HelloWorldScene.m并针对性init方法开展一个一线的修改来把背景观改呢白。

 

Cpp代码  2018正版葡京赌侠诗 11

  1. if( (self=[super initWithColor:ccc4(255,255,255,255)] ))   

 
     
继续编译并运行工程,你会晤视而的玩家精灵在白之背景上。噢,大家的忍者已经准备表演了。    
2018正版葡京赌侠诗 12

移动目的

    
下面我们需要在观中上加有目标被忍者去打击。为了吃工作变的还好玩一些,大家设被这多少个目标活动起来-要不然没什么挑衅性。我们于有点小偏屏幕左侧的地点创立有对象,并也它们创造动作来吃它向左移动。

每当init方法以前增长下边的法门:

Cpp代码  2018正版葡京赌侠诗 13

  1. -(void)addTarget {   
  2.   
  3. CCSprite *target = [CCSprite spriteWithFile:@”Target.png”rect:CGRectMak(0, 0, 27, 40)];   
  4.   
  5. // Determine where to spawn the target along the Y axis   
  6. CGSize winSize = [[CCDirector sharedDirector] winSize];   
  7.   
  8. int minY = target.contentSize.height/2;   
  9. int maxY = winSize.height – target.contentSize.height/2;   
  10. int rangeY = maxY – minY;   
  11. int actualY = (arc4random() % rangeY) + minY;   
  12.   
  13. // Create the target slightly off-screen along the right edge,   
  14. // and along a random position along the Y axis as calculated above  
  15.    
  16. target.position = ccp(winSize.width + (target.contentSize.width/2), actualY);   
  17.   
  18. [self addChild:target];   
  19.   
  20. // Determine speed of the target   
  21. int minDuration = 2.0;   
  22. int maxDuration = 4.0;   
  23. int rangeDuration = maxDuration – minDuration;   
  24. int actualDuration = (arc4random() % rangeDuration) + minDuration;   
  25.   
  26. // Create the actions   
  27. id actionMove = [CCMoveTo actionWithDuration:actualDuration position:ccp(-target.contentSize.width/2, actualY)];   
  28.   
  29. id actionMoveDone = [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)];   
  30.   
  31. [target runAction:[CCSequence actions:actionMove,actionMoveDone, nil]];   
  32.   
  33. }   

 

    
在此间我坐同一种详细的计来表明事情以便为事情更易懂。第一片段大家相应知道时早就探讨了:大家做一些简练的总括,以确定我们设创造对象,设置对象的地点,并将其以补充加玩家精灵的一模一样方法充足到景被失去。

    
这里边的初因素是加上动作。Cocos2D提供了好多充足便利坐的逯得以就此来创设动画的走,如运动,跳跃的行,褪色的行,动画动作与重新多。在此处我们也目的下了三件动作。

     
•CCMoveTo:大家下CCMoveTo动作来点物体屏幕左侧。请留心,我们可以指定运动应选拔的持续时间,在这里,我们应用2-4秒的任意速度。

      •CCCallFuncN:
该CCCallFuncN函数允许我们指定一个回调至我们的靶子出现平常,执行操作。

      我们在指定一个回调称为”spriteMoveFinished”大家尚从未写吗

      •CCSequence:
该CCSequence动作让咱创建同多元的动作,一涂鸦一个。那样,大家得以先实施CCMoveTo动作,一旦好实施CCCallFuncN动作。

   
下边,添加前大家曾经当CCCallFuncN动作受到早已提过的回调函数。你能够以addTarget函数前边添加:

 

 

Cpp代码  2018正版葡京赌侠诗 14

  1. -(void)spriteMoveFinished:(id)sender {   
  2.   
  3.       CCSprite *sprite = (CCSprite *)sender;   
  4.       [self removeChild:sprite cleanup:YES];   
  5.   
  6. }  

  

     
该函数的目的是由面貌中移除精灵,一旦该精灵离开屏幕。这同样点很重大,这样我们不会面趁着年华之推迟,有数以十万计的废精灵在情景之外而内存泄漏。请留心,
还爆发任何(更好)的艺术来化解那题目像具有可重复使用Coca Cola的数组,但那一个初级教程,大家正在选择简易的法子。

     
最终一宗业务在我们运行程序前。我们要实际调用的法来创制目的!为了吃工作再度暴发趣点,大家吃对象就年华的延持续大量底出现。我们得于Cocos2D中通过部署一个回调函数的年限调用来好这任务。每1秒执行同一不成。因而,在init函数重回从前调用上面的函数调用。

 

Cpp代码  2018正版葡京赌侠诗 15

  1. [self schedule:@selector(gameLogic:) interval:1.0];   

 

前日诸如下这样简单的实现者回调函数:

 

Cpp代码  2018正版葡京赌侠诗 16

  1. -(void)gameLogic:(ccTime)dt {   
  2.      [self addTarget];   
  3. }   

  

 

 
     
就是这般!所以,现在,如若你编译并运行该种,现在公应有看到目的愉快地当屏幕上走:

2018正版葡京赌侠诗 17

射击子弹

     
在此时,忍者希望暴发一对动作-让们丰裕射击吧!我们来广大底办法来落实射击,但以斯戏被我们若以用户点击屏幕时来举办射击,从玩家射来的枪弹将照点击的来头前进。

     
我怀想就此一个CCMoveTo动作去维持工作还在初级层面上,但以促成这个,我们须召开有数学。这是为CCMoveTo要求我们要为子弹目的地,但
我们不可知仅仅以触摸点,因为接触点仅仅意味着相对于玩家的放方向。事实上,我们想维持子弹通过触摸点,直到移出屏幕。
从而同样张图来表达是事情:
 
2018正版葡京赌侠诗 18

于是,我们可视,我们用起源到触摸点的X和Y方向的撼动成立了只小三角形。我们只有待为同样的百分比非凡三角形

  • 咱清楚我们用一个离屏幕的为止点。
     
    吓了,上代码。首先,我们务必要我们的叠能够支撑触摸。添加底下一行到您的init方法:

 

 

Cpp代码  2018正版葡京赌侠诗 19

  1. self.isTouchEnabled = YES;   

 

     
因为大家早已为图层补助触摸,现在大家得以收触摸事件的回调。因而,让我们贯彻ccTouchesEnded方法,只要用户完成了点该格局就会调用,具体如下:

 

 

Cpp代码  2018正版葡京赌侠诗 20

  1. – (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {   
  2.   
  3. // Choose one of the touches to work with   
  4. UITouch *touch = [touches anyObject];   
  5. CGPoint location = [touch locationInView:[touch view]];   
  6. location = [[CCDirector sharedDirector] convertToGL:location];   
  7.   
  8. // Set up initial location of projectile   
  9. CGSize winSize = [[CCDirector sharedDirector] winSize];   
  10. CCSprite *projectile = [CCSprite spriteWithFile:@”Projectile.png” rect:CGRectMake(0, 0, 20, 20)];   
  11. projectile.position = ccp(20, winSize.height/2);   
  12.   
  13. // Determine offset of location to projectile   
  14. int offX = location.x – projectile.position.x;   
  15. int offY = location.y – projectile.position.y;   
  16.   
  17. // Bail out if we are shooting down or backwards   
  18. if (offX <= 0) return;   
  19.   
  20. // Ok to add now – we’ve double checked position   
  21. [self addChild:projectile];   
  22.   
  23. // Determine where we wish to shoot the projectile to   
  24. int realX = winSize.width + (projectile.contentSize.width/2);   
  25. float ratio = (float) offY / (float) offX;   
  26. int realY = (realX * ratio) + projectile.position.y;   
  27. CGPoint realDest = ccp(realX, realY);   
  28.   
  29. // Determine the length of how far we’re shooting   
  30. int offRealX = realX – projectile.position.x;   
  31. int offRealY = realY – projectile.position.y;   
  32. float length = sqrtf((offRealX*offRealX)+(offRealY*offRealY));   
  33. float velocity = 480/1; // 480pixels/1sec   
  34. float realMoveDuration = length/velocity;   
  35.   
  36. // Move projectile to actual endpoint   
  37. [projectile runAction:[CCSequence actions:   
  38. [CCMoveTo actionWithDuration:realMoveDuration position:realDest],   
  39. [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)], nil]];   
  40.   
  41. }   

 

      在首先有,大家摘一个触摸点来用,先得到在时下视图中之职位,然后调用convertToGL来管坐标转化到近来之布局。这一点很重大,因为大家现在是横向情势。

     接下来我们加载子弹精灵并像往常同一装起始坐标。然后,大家规定大家想子弹移动的职位,按照后边描述的算法,使用玩家和触摸点之间的联系来作指引载体。

    
请注意,该算法并无完美。我们正在迫使子弹继续进步直到在X方向上离开屏幕-尽管首先以Y方向上就去了屏幕!有两样之艺术来解决是,包括检查离开屏
幕的无限小长,让戏之逻辑回调核查离开屏幕的枪弹和免回调,而不是用回调方法,等等。但以此初级教程,大家以保障原样。

     
我们最为要开的便是规定为活动时间。我们目的在于,子弹会于一个稳住的速率依照放方向发展,所以我们又开一些数学。大家得寻找有以勾股定理来算有活动的离开。记得在几乎何法中,这是平整,提议了一个直角三角形的边长度等两直角边的平方的以及底开方。

    
一旦我们有矣去,我们只是除以速度,以取得所待的大运。这是坐快=距离/时间,或换句话说
时间=距离/速度。

   
剩下的政工就是安动作,就想给目的设置动作一样。编译并运行,现在你的忍者可以望前来的平等良过多目的开火了

2018正版葡京赌侠诗 21
碰撞检测

    
所以现在我们曾经让shurikens满天飞了-但我们的忍者真正想倘诺举行的是放倒一些对象。由此,让咱投入一些代码,以检测当大家的子弹及目的的交接。

    
要就那或多或少,我们先是要在时之气象中更好之跟踪目的和子弹。把以下的代码添加到您的HelloWorldScene类讲明遭:

 

Cpp代码  2018正版葡京赌侠诗 22

  1. NSMutableArray *_targets;   
  2. NSMutableArray *_projectiles;   

 
当init方法被先导化这简单个数组:

 

 

Cpp代码  2018正版葡京赌侠诗 23

  1. _targets = [[NSMutableArray alloc] init];   
  2. _projectiles = [[NSMutableArray alloc] init];   

 
咱俩呢当考虑,在您的dealloc方法中清理内存:

 

Cpp代码  2018正版葡京赌侠诗 24

  1. [ _targets release];   
  2. _targets = nil;   
  3. [ _projectiles release];   
  4. _projectiles = nil;   

 
      现在,修改你的addTarget方法,添加新目标到对象数组中连让其装一个标记以便在之后采纳:

Cpp代码  2018正版葡京赌侠诗 25

  1. target.tag = 1;   
  2. [ _targets addObject:target];   

 
    

    
还要修改你的ccTouchesEnded方法,把新子弹添加到子弹数组中被它装一个标志以便在后头拔取:

 

Cpp代码  2018正版葡京赌侠诗 26

  1. projectile.tag = 2;   
  2. [_projectiles addObject:projectile];  

 

    
最终,修改你的spriteMoveFinished方法,遵照标记的两样在方便的数组中移除精灵: 

Java代码  2018正版葡京赌侠诗 27

  1. if (sprite.tag == 1) {   
  2.           // target   
  3.           [_targets removeObject:sprite];   
  4.   
  5. } else  if (sprite.tag == 2) {   
  6.           // projectile   
  7.           [_projectiles removeObject:sprite];   
  8. }  

 

 

 
     
编译并运行该档为管一切正常。在此时段该无什么彰着的不同,但近日我们发号子,我们要实现碰撞检测。

今日在HelloWorldScene类中补充加下面的法:

Cpp代码  2018正版葡京赌侠诗 28

  1. – (void)update:(ccTime)dt {   
  2.       NSMutableArray *projectilesToDelete = [[NSMutableArray alloc] init];   
  3.   
  4. for (CCSprite *projectile in _projectiles) {   
  5.   
  6.        CGRect projectileRect = CGRectMake( projectile.position.x -(projectile.contentSize.width/2), projectile.position.y – (projectile.contentSize.height/2), projectile.contentSize.width, projectile.contentSize.height);   
  7.   
  8. NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init];   
  9.   
  10. for (CCSprite *target in _targets) {   
  11.   
  12.     CGRect targetRect = CGRectMake( target.position.x -(target.contentSize.width/2), target.position.y – (target.contentSize.height/2), target.contentSize.width, target.contentSize.height);   
  13.   
  14. if (CGRectIntersectsRect(projectileRect, targetRect)) {   
  15.   
  16.         [targetsToDelete addObject:target];   
  17.   
  18. }  
  19.    
  20. }   
  21.   
  22. for (CCSprite *target in targetsToDelete) {   
  23.         [_targets removeObject:target];   
  24.         [self removeChild:target cleanup:YES];   
  25. }   
  26.   
  27. if (targetsToDelete.count > 0) {   
  28.        [projectilesToDelete addObject:projectile];  
  29. }   
  30.   
  31. [targetsToDelete release];   
  32.   
  33. }   
  34.   
  35.   
  36. for (CCSprite *projectile in projectilesToDelete) {   
  37.           [_projectiles removeObject:projectile];   
  38.           [self removeChild:projectile cleanup:YES];  
  39. }   
  40.   
  41. [projectilesToDelete release];   
  42.   
  43. }   

 

 

    以上应该很明亮了。我们只是通过子弹及目的往往组,遵照她的边际框创立相应的矩形,并应用CGRectIntersectsRect方法来检查交叉。

    如果发现发,我们由景以及数组中拿其移除。请留意,大家是拿这么些目的上加到一个toDelete数组中,因为若切莫可以于一个方迭代的数组中去一个指标。同样,有重多之顶级情势来兑现这种工作,但自己使用了此大概的不二法门

     
在公准备而运行前你只是需要开一样码事-通过丰硕下的代码到init方法吃失安排方面的章程尽可能多的运作

   

Cpp代码  2018正版葡京赌侠诗 29

  1. [self schedule:@selector(update:)];   

 
给它编译并运行,现在当您的枪弹和对象碰撞时其就谋面磨灭!

最后的点染

     
我们蛮类似拥有一个卓有功效之(但相当简单)的戏了。我们一味需要添加一些响声效果和音乐(因为啥类型的游玩没有音乐之!)和一部分简约的游艺逻辑。

     假如你一贯关心自己之blog series on audio programming for the
HTCblog
series on audio programming for the
iPhone
,关于Nokia的均等文山会海音频编程博客,你会异常洋洋得意地领悟,对于Cocos2D开发者来说,在玩乐被贯彻主题的动静效果是何其的略。

 

第一步:

     
 拖动一些背景音乐和一个开声音效果至你的resources文件夹着。随意使用
cool background music I made 2018正版葡京赌侠诗 30
background-music-aac.caf.zip

(252 K) 下充斥次数:52
或是 awesome pew-pew sound effect 2018正版葡京赌侠诗 31
pew-pew-lei.caf.zip

(40 K) 下充斥次数:42 ,或者做而自己之。

然后:

       添加脚的代码到你的HelloWorldScene.m文件的脑部:

Cpp代码  2018正版葡京赌侠诗 32

  1. #import “SimpleAudioEngine.h”   

 
     在公的init方法,像下的代码所示启动背景音乐:

 

Cpp代码  2018正版葡京赌侠诗 33

  1. [[SimpleAudioEngine sharedEngine]playBackgroundMusic:@”background-music-aac.caf”];   

 
0.99-final update:(关于0.99-final更新):

       看起以0.99-final版本中生一个细微bug,背景音乐只好播放三遍于(而她仍应当循环)-要么是其的错要么就是我整错了。对于一个变通方法,请参考本文结尾的见解。
有关  0.99-final版本中发出一个微bug,

于 CDAudioManager.m
的第72行在以下代码,  能够缓解背景音乐只好播放一欠好(而其仍应有循环)

 
- (void)setNumberOfLoops:(NSInteger)theNumberOfLoops 
{
    numberOfLoops = theNumberOfLoops;
    audioSourcePlayer.numberOfLoops = theNumberOfLoops;
}
 

在你的ccTouchesEnded方法吃播放下边的音响效果:

Cpp代码  2018正版葡京赌侠诗 34

  1. [[SimpleAudioEngine sharedEngine] playEffect:@”pew-pew-lei.caf”];   

 
     
现在,让咱创设一个新的景观,将作我们的“你赢了”,或“你输”的指令。点击Classes文件夹,进入File\New
File,并选择Objective-C
class,并规定了NSObject类被入选。单击Next,然后输入GameOverScene作为文件称,并确保“Also
create GameOverScene.h”被入选。

下一场用底的代码来代表GameOverScene.h中之情节:

Cpp代码  2018正版葡京赌侠诗 35

  1. #import “cocos2d.h”   
  2.   
  3. @interface GameOverLayer : CCColorLayer {   
  4.   
  5.     CCLabel *_label;   
  6.   
  7. }   
  8. @property (nonatomic, retain) CCLabel *label;   
  9.   
  10. @end   
  11.   
  12.   
  13. @interface GameOverScene : CCScene {   
  14.     GameOverLayer *_layer;   
  15. }   
  16. @property (nonatomic, retain) GameOverLayer *layer;   
  17. @end   

 
更就此脚的代码来取代GameOverScene.m中的内容

Cpp代码  2018正版葡京赌侠诗 36

  1. #import “GameOverScene.h”   
  2. #import “HelloWorldScene.h”   
  3.   
  4. @implementation GameOverScene   
  5. @synthesize layer = _layer;   
  6.   
  7. – (id)init {   
  8.   
  9. if ((self = [super init])) {   
  10. self.layer = [GameOverLayer node];   
  11. [self addChild:_layer];   
  12.   
  13. }   
  14. return self;   
  15.   
  16. }   
  17.   
  18. – (void)dealloc {   
  19.       [ _layer release];   
  20.         _layer = nil;   
  21.       [super dealloc];   
  22. }   
  23.   
  24. @end   
  25.   
  26. @implementation GameOverLayer   
  27.   
  28. @synthesize label = _label;   
  29.   
  30. -(id) init {   
  31.   
  32. if( (self=[super initWithColor:ccc4(255,255,255,255)] )) {   
  33.   
  34. CGSize winSize = [[CCDirector sharedDirector] winSize];   
  35. self.label = [CCLabel labelWithString:@”” fontName:@”Arial” fontSize:32];   
  36. _label.color = ccc3(0,0,0);   
  37. _label.position = ccp(winSize.width/2, winSize.height/2);   
  38. [self addChild:_label];   
  39.   
  40. [self runAction:[CCSequence actions: [CCDelayTime actionWithDuration:3], [CCCallFunc actionWithTarget:self selector:@selector(gameOverDone)], nil]];   
  41.   
  42. }   
  43.     return self;   
  44.   
  45. }   
  46.   
  47. – (void)gameOverDone {   
  48.   
  49. [[CCDirector sharedDirector] replaceScene:[HelloWorld scene]];   
  50.   
  51. }   
  52.   
  53. – (void)dealloc {   
  54.           [_label release];   
  55.            _label = nil;   
  56.           [super dealloc];   
  57. }   
  58.   
  59. @end   

 

      请留意,这里有星星点点只不等的目标:一个景(scene)和一个图层(layer)。场景可以涵盖多单图层,尽管在斯例子是她就发一个。图层里边只当屏幕主题放了一个标签,并布置了一个3秒中的接入,然后再次回到到HelloWorld场景中。

 
     
最终,让我们抬高一些雅基本的戏逻辑。首先,让咱跟玩家破坏的目的。添加一个分子变量到公的HelloWorldScene.h中
HelloWorld类如下:

 

Cpp代码  2018正版葡京赌侠诗 37

  1. int _projectilesDestroyed;    

于HelloWorldScene.m中,添加GameOverScene类的阐明:

 

Cpp代码  2018正版葡京赌侠诗 38

  1. #import “GameOverScene.h”  

  

    
在update方法中removeChile:target:前面的targetsToDelete循环中益计数并检查获胜条件

Cpp代码  2018正版葡京赌侠诗 39

  1. _projectilesDestroyed++;   
  2.   
  3. if (_projectilesDestroyed > 30) {   
  4.   
  5. GameOverScene *gameOverScene = [GameOverScene node];   
  6. [gameOverScene.layer.label setString:@”You Win!”];   
  7. [[CCDirector sharedDirector] replaceScene:gameOverScene];   
  8.   
  9. }   

 

 

    
最后咱们如此来确定,尽管单纯发一个对象过去了,你尽管败了。修改spriteMoveFinished方法,在removeChild:sprite:方法的末端的tag
== 1标准化里添加下边的代码:

 

Java代码  2018正版葡京赌侠诗 40

  1. GameOverScene *gameOverScene = [GameOverScene node];   
  2. [gameOverScene.layer.label setString:@”You Lose :[“];   
  3. [[CCDirector sharedDirector] replaceScene:gameOverScene];   

 

承编译并运行该档,这样你发出矣羸和失败的论断标准并会师当方便的下看看娱乐了之景。

 

相关文章