SpriteKitでポーズの実装(前編)

TriShootでは、こんな感じで実装しましたよ、っていうお話。

さっそく、ポーズ周りで動作が気持ち悪いので、
修正してApple様に申請を出しました、こんばんは。

まず、簡易実装ならこちらをどうぞ。

で、前提条件はこんな感じ。

  • シューティングゲームである
  • 特定の条件でポーズする
  • ユーザーの操作でポーズする
  • ユーザーの操作でポーズを解除する

シューティングゲームならではの話は後回し。
特定の条件ですが、applicationWillResignActiveが呼ばれたら、
ポーズに入るようにしました。
気をつけなければならないことは、ポーズ中でもこの関数が呼ばれるので、
ポーズ中にポーズの要求があってもアプリが落ちないようにします。
ユーザーの操作でポーズしたり、ポーズを解除するのは、
画面上にラベルを配置して、そこがタッチされたら解除します。

これはシューティングゲームならではですが、
ポーズ解除のための操作をした後に、
少しだけ間を置いてから解除するようにしました。
理由は、ポーズを解除する操作をしてから自機を動かす操作をするのに、
指を移動する時間が必要だからです。
でも、せっかく用意した”間”では、タッチを受け付けない実装になっていたので、
そこはバージョンアップで解決する予定です。
つまり、こういうことです。

ラベルをタッチするなどしてポーズを解除して、
解除される前からスライド操作すると、
解除された直後からスライド操作による自機の移動が開始されます。

もし、間を置かずにポーズを解除したら???
被弾する直前であれば、スライド操作が間に合わず、被弾することになります。

“FOOAppDelegate.m”から一部、抜粋。

- (void)applicationWillResignActive:(UIApplication *)application
{
    // "FOOGameView.h"がimportされているとして、
    // pauseメソッドが実装されていることが前提
    FOOGameView *view = [[_window subviews] firstObject];
    [view pause];
}

次に、”FOOGameView.m”から一部、抜粋。

-(void)pause
{
    // タイトル画面とかの場合は、ポーズする必要は無い
    if ( [self.scene isKindOfClass:[FOOGameScene class]] ) {
        FOOGameScene *gameScene = (FOOGameScene *)self.scene;
        if ( [gameScene canPause] ) { // canPauseメソッドは用意してね
            [gameScene pause]; // pauseメソッドは用意してね
            // memo: BGMが鳴っていれば停止する
        }
    }
}

// ユーザーの操作によるポーズ
-(void)pauseWithSound
{
    // todo: 音を鳴らす
    [self pause];
}

// ユーザーの操作によるポーズ解除
-(void)resume
{
    // todo: 音を鳴らす
    [(FOOGameScene *)self.scene resume]; // resumeメソッドは用意してね
    // memo: 少し間をおいて再開するので、ここでBGMを再生しない
}

// ポーズ解除後に、少し間を置いてから呼ばれる
-(void)playMusic
{
    // todo: BGMを再生する
}

あとは、SKSceneを継承したゲームシーンに、
pasueメソッドとresumeメソッドを用意しておいて、
その中でpausedプロパティを変更するだけなんだけど、
ポーズを解除するまでに間を置くには、updateメソッドを使います。
ポーズ中でもcurrentTimeを退避しておいて、
resumeメソッドが呼ばれてからn秒後にポーズを解除するように、
例えば、カウントダウン用の変数を使うなどして、
あとは、updateメソッドの中でpausedプロパティを変更します。

その代わり、状態が増えてしまいます。

  • ゲーム中
  • ポーズしている
  • ポーズ解除中

あと、ポーズ解除中は、
ポーズ解除のラベルでタッチ判定が行われないようにしたり、
ゲームオーバーになった場合はポーズできないようにしたり・・・って、
今、気付いたのですが、
ゲームオーバーになった瞬間に、ホームボタンが押されたら・・・?

という訳で、ポーズ可能かどうか、ゲームシーンに問い合わせてから、
ゲームシーンのpasueメソッドを呼ぶようにしました。
この辺の状態遷移は、あんましよく分かってないので、
いくつかゲームを作って身につけないとですね。

つづく。

Leave a Comment