読者です 読者をやめる 読者になる 読者になる

WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

SpriteKitで効果音・BGMを再生する

iOS Objective-C

エンジニアブログ担当の近藤です。
今回はSpriteKitでの効果音とBGMを再生します。

効果音の再生

SpriteKitで効果音を再生するにはSKActionクラスが持っているplaySoundFileNamedメソッドを使用します。

SKAction *action = [SKAction playSoundFileNamed:@"音声ファイル名" waitForCompletion:NO];  

引数の「waitForCompletion:」はActionが終了するタイミングが音声の再生開始時か、音声終了後かの設定をします。
NOの場合は再生開始時、YESの場合は再生終了時となります。

BGMの再生

SpriteKitにはBGMを再生するための機能は備えられておらず、従来からあるAVAudioPlayerを使えばいい様です。

プロジェクト作成

以前の記事を参考にSpriteKitのプロジェクトを作成しましょう。

ソースコード

【MyScene.h】

#import <SpriteKit/SpriteKit.h>  
  
//AVFoundationをインポートします  
#import <AVFoundation/AVFoundation.h>  
  
@interface MyScene : SKScene  
  
//BGM再生用AVAudioPlayer  
@property (nonatomic)AVAudioPlayer* bgm;  
  
@end  

【MyScene.m】

#import "MyScene.h"  
  
SKAction *SEAction;         //SE再生用Action  
SKLabelNode *myLabel;       //ラベル  
int count = 0;              //タップした回数  
  
@implementation MyScene  
-(id)initWithSize:(CGSize)size {  
    if (self = [super initWithSize:size]) {  
        /* Setup your scene here */  
        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];  
        myLabel = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"];  
  
        myLabel.text = @"Hello, World!";  
        myLabel.fontSize = 30;  
        myLabel.position = CGPointMake(CGRectGetMidX(self.frame),  
                                       CGRectGetMidY(self.frame));  
        [self addChild:myLabel];  
  
        //SEを設定  
        SEAction = [SKAction playSoundFileNamed:@"sound.mp3" waitForCompletion:NO];  
  
        //BGMを設定  
        NSError* error;  
        NSURL* URL = [[NSBundle mainBundle]URLForResource:@"bgm"withExtension:@".mp3"];  
        self.bgm = [[AVAudioPlayer alloc]initWithContentsOfURL:URL error:&error];  
        self.bgm.numberOfLoops = -1;  
        [self.bgm prepareToPlay];  
    }  
    return self;  
}  
  
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
    /* Called when a touch begins */  
    for (UITouch *touch in touches) {  
        CGPoint location = [touch locationInNode:self];  
  
        count++;  
        int num = count % 3;  
  
        if(num == 0){  
            [myLabel setText:@"効果音を再生"];  
            [self runAction:SEAction];  
  
        }else if(num == 1){  
            [myLabel setText:@"BGMを再生"];  
            [self.bgm play];  
  
        }else if(num == 2){  
            [myLabel setText:@"BGMを停止"];  
            [self.bgm stop];  
        }  
    }  
}  
  
-(void)update:(CFTimeInterval)currentTime {  
    /* Called before each frame is rendered */  
}  
  
@end  

サンプルプロジェクト

プロジェクトを添付しておきます。
音声ファイルなど準備するのが面倒でしたらご利用ください。
SpriteKitSound

おまけ

今回紹介した音声再生機能があまりにも簡単すぎで記事として寂しいので、音声再生に関連した便利ツールを紹介します。
上記のサンプルプロジェクトで使用した効果音は「as3sfxr」というツールを使用して作成しました。(BGMはGarageBandのプリセットの音楽)
ファミコンっぽい音を作るにはこのツールが手軽に使えてとっても便利なので個人的にアプリを作るときによく使っています。
ちょっとしたゲームの効果音を作るにはぴったりです。

as3sfxr
「GENERATOR」の項目ではジャンプ音や爆発音など、プリセットの音を作ってくれます。
もっと細かく音を調整するには「Manual Settings」の項目で再生スピードやビブラートなどの設定を細かくする事で、オリジナルな効果音も作れます。

ゲームを作るときプログラムを書く事ができても、何かと困るのが音の作成。
フリー素材でぴったりな効果音を探すのも大変だし、作成をお願いできる人も身近にはなかなかいません。
そんなときにこういうツールを駆使して自分で作ってしまえば、自分1人でゲームアプリを完成させられますね。