Sprite Kit 入门学习(二)

即将完成

你马上就要完成这个简单的游戏了。只要再添加一些音效(哪种游戏也不能没有声音啊!)和一些简单的游戏逻辑即可。
Sprite Kit没有像Cocos2D一样提供声音引擎,但值得庆幸的是它可以通过动作这种简便的方式来实现。并且你可以通过同样很简单的AVFoundation类库来播放背景音乐。
你的项目里已经有一些我做的背景音乐(很酷哦)和一个给力的piu~piu~音效了。它们是从这个教程的资源包里添加的。你只要播放就好了!
为了实现这些,将下面的代码添加到Viewcontroller.m文件里:

 @import AVFoundation;

这里使用了iOS的新特性,通过使用新的@import 关键字,你可以更简单、更高效地引入头文件(还有类库)。想要进一步了解它,请阅读我们在iOS 7 by Tutorials里的第10章——Objective-C 和 iOS基础类库有什么新玩意。
下一步,添加一个新的属性和一个私有声明:

 @interface ViewController () @property (nonatomic) AVAudioPlayer * backgroundMusicPlayer; @end 

将如下代码添加到 viewWillLayoutSubviews方法中,添加到 [super viewWillLayoutSubviews]的后面:

 NSError *error; NSURL * backgroundMusicURL = [[NSBundle mainBundle] URLForResource:@"background-music-aac" withExtension:@"caf"]; self.backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error]; self.backgroundMusicPlayer.numberOfLoops = -1; [self.backgroundMusicPlayer prepareToPlay]; [self.backgroundMusicPlayer play];

This is some simple code to start the background music playing with endless loops.
As for the sound effect, switch back to MyScene.m and add this line to the top of touchesEnded:withEvent::

 [self runAction:[SKAction playSoundFileNamed:@"pew-pew-lei.caf" waitForCompletion:NO]];

了解?你可以仅仅用一行代码来播放一个声音!
让我们来创建一个新的scene来展现游戏输赢的结果。在新建界面中按 iOSCocoa TouchObjective-C class的方式从模版创建新类,将之命名为GameOverScene,使其继承自  SKScene ,然后单击下一步(Next)而后创建(Create)。
然后用下面的代码替换GameOverScene.h中原有的代码:

 #import <SpriteKit/SpriteKit.h> @interface GameOverScene : SKScene -(id)initWithSize:(CGSize)size won:(BOOL)won; @end 

这里你引入了Sprite Kit的头文件并且声明了一个特殊的初始化方法,这个初始化方法除了需要传入size大小外还要传入用户的游戏结果(布尔值,表示输赢)。
然后用以下代码替换 GameOverLayer.m中的原有代码:

 #import "GameOverScene.h" #import "MyScene.h" @implementation GameOverScene -(id)initWithSize:(CGSize)size won:(BOOL)won { if (self = [super initWithSize:size]) {   // 1 self.backgroundColor = [SKColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];   // 2 NSString * message; if (won) { message = @"You Won!"; } else { message = @"You Lose :["; }   // 3 SKLabelNode *label = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"]; label.text = message; label.fontSize = 40; label.fontColor = [SKColor blackColor]; label.position = CGPointMake(self.size.width/2, self.size.height/2); [self addChild:label];   // 4 [self runAction: [SKAction sequence:@[ [SKAction waitForDuration:3.0], [SKAction runBlock:^{ // 5 SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5]; SKScene *         = [[MyScene alloc] initWithSize:self.size]; [self.view presentScene:myScene transition: reveal]; }] ]] ];   } return self; } @end 

这是上述代码的解释:

  1. 将背景颜色设置为白色,与主要的scene(MyScene)相同。
  2. 根据传入的输赢参数,设置弹出的消息字符串“You Won”或者 “You Lose”。
  3. 这部分代码表示在Sprite Kit下如何把文本标签显示到屏幕上。和你看到的一样,相当简单,只需要选择字体然后设置一些参数即可。
  4. 最后,创建并且运行一个系列类型动作,它包含两个子动作。为了让你更好的理解,我把它们都写在了一起(而没有采用以不同变量分开表示不同aciton的方式)。这里第一个action仅仅是等待3秒钟,然后会执行runBlock中的第二个action来做一些马上会执行的操作。
  5. 这里实现的是在Sprite Kit下如何转场(从现有场景转到新的场景)。首先你可以从多种转场特效动画中挑选一个自己喜欢的用来展示,这里选了一个0.5秒的翻转特效。然后创建即将要被显示的scene,使用self.view的presentScene:transition: 方法进行转场即可。

到现在为止一切顺利,你只要在游戏结束时用你的主场景(MyScene)来加载游戏结束的场景(GameOverScene)就好了。
为了实现这个功能,首先要把新的scene引入到MyScene.m文件中:

 #import "GameOverScene.h" 

然后在addMonster方法中用下面的action替换最后一行的action:

 SKAction * loseAction = [SKAction runBlock:^{ SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5]; SKScene * gameOverScene = [[GameOverScene alloc] initWithSize:self.size won:NO]; [self.view presentScene:gameOverScene transition: reveal]; }]; [monster runAction:[SKAction sequence:@[actionMove, loseAction, actionMoveDone]]];

这里创建了一个新的“失败action”用来展示游戏结束的场景,当怪物移动到屏幕边缘时游戏就结束了。看看你是否理解了这里的代码,如果没有就翻看之前block的解释吧(指GameOverScene中的系列action)。
还有一个很常见的问题:为什么你要在actionMoveDone 动作之前运行loseAction动作?如果你不知道为什么,那就手动改变两者的顺序试试吧。

Solution Inside: Why is Lose Action First? Show
 
   
 

现在你应该相应也了解了赢得游戏的情形,不要对玩家太残忍哦!:] 像MyScene.m的私有声明中添加一个新的属性:

 

 @property (nonatomic) int monstersDestroyed;

然后把下面的代码添加到 projectile:didCollideWithMonster: 方法底部:

 self.monstersDestroyed++; if (self.monstersDestroyed &gt; 30) { SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5]; SKScene * gameOverScene = [[GameOverScene alloc] initWithSize:self.size won:YES]; [self.view presentScene:gameOverScene transition: reveal]; } 

编译运行之,游戏会在对应的情况下展示输赢场景了

源代码地址:http://cdn2.raywenderlich.com/downloads/SpriteKitSimpleGame2.zip

 

原文作者:Ray Wenderlich on September 30, 2013

 来自于:http://www.raywenderlich.com/zh-hans/51919/sprite-kit-入门教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值