即将完成
你马上就要完成这个简单的游戏了。只要再添加一些音效(哪种游戏也不能没有声音啊!)和一些简单的游戏逻辑即可。
Sprite Kit没有像Cocos2D一样提供声音引擎,但值得庆幸的是它可以通过动作这种简便的方式来实现。并且你可以通过同样很简单的AVFoundation类库来播放背景音乐。
你的项目里已经有一些我做的背景音乐(很酷哦)和一个给力的piu~piu~音效了。它们是从这个教程的资源包里添加的。你只要播放就好了!
为了实现这些,将下面的代码添加到Viewcontroller.m文件里:
@import AVFoundation; |
这里使用了iOS的新特性,通过使用新的@import 关键字,你可以更简单、更高效地引入头文件(还有类库)。想要进一步了解它,请阅读我们在iOS 7 by Tutorials里的第10章——Objective-C 和
下一步,添加一个新的属性和一个私有声明:
@interface ViewController () @property (nonatomic) AVAudioPlayer * backgroundMusicPlayer; @end |
将如下代码添加到 [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
[self runAction:[SKAction playSoundFileNamed:@"pew-pew-lei.caf" waitForCompletion:NO]]; |
了解?你可以仅仅用一行代码来播放一个声音!
让我们来创建一个新的scene来展现游戏输赢的结果。在新建界面中按
然后用下面的代码替换GameOverScene.h中原有的代码:
#import <SpriteKit/SpriteKit.h> @interface GameOverScene : SKScene -(id)initWithSize:(CGSize)size won:(BOOL)won; @end |
这里你引入了Sprite Kit的头文件并且声明了一个特殊的初始化方法,这个初始化方法除了需要传入size大小外还要传入用户的游戏结果(布尔值,表示输赢)。
然后用以下代码替换
#import "GameOverScene.h" #import "MyScene.h" @implementation GameOverScene -(id)initWithSize:(CGSize)size won:(BOOL)won { if (self = [super initWithSize:size]) { |
这是上述代码的解释:
- 将背景颜色设置为白色,与主要的scene(MyScene)相同。
- 根据传入的输赢参数,设置弹出的消息字符串“You Won”或者 “You Lose”。
- 这部分代码表示在Sprite Kit下如何把文本标签显示到屏幕上。和你看到的一样,相当简单,只需要选择字体然后设置一些参数即可。
- 最后,创建并且运行一个系列类型动作,它包含两个子动作。为了让你更好的理解,我把它们都写在了一起(而没有采用以不同变量分开表示不同aciton的方式)。这里第一个action仅仅是等待3秒钟,然后会执行runBlock中的第二个action来做一些马上会执行的操作。
- 这里实现的是在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 flipHorizontalWithDurati |
这里创建了一个新的“失败action”用来展示游戏结束的场景,当怪物移动到屏幕边缘时游戏就结束了。看看你是否理解了这里的代码,如果没有就翻看之前block的解释吧(指GameOverScene中的系列action)。
还有一个很常见的问题:为什么你要在actionMoveDone 动作之前运行loseAction动作?如果你不知道为什么,那就手动改变两者的顺序试试吧。
Solution Inside: Why is Lose Action First? | Show |
---|---|
现在你应该相应也了解了赢得游戏的情形,不要对玩家太残忍哦!:] 像MyScene.m的私有声明中添加一个新的属性:
@property (nonatomic) int monstersDestroyed; |
然后把下面的代码添加到
self.monstersDestroyed++; if (self.monstersDestroyed > 30) { SKTransition *reveal = [SKTransition flipHorizontalWithDurati |
编译运行之,游戏会在对应的情况下展示输赢场景了
源代码地址:http://cdn2.raywenderlich.com/downloads/SpriteKitSimpleGame2.zip
原文作者:Ray Wenderlich on September 30, 2013