画面遷移時のWait(待ち時間)

面クリアー時の画面遷移

ゲームアプリに限らずiPhoneアプリに於いては アニメーションはユーザーに現在アプリがどのような状況にあるか知らせるために重要な役割を果たします。 其れは画面遷移時の動きに於いても一般です。

開発中のゲームアプリに於いては画面遷移は面クリアー時及びゲームオーバー時などに発生します。 ブロック崩しゲームの面クリアー時には 必ずボール足るキャラクターがブロック足る果物の最後の一つを食す筈です。 またゲームオーバー時にはボール足るキャラクターが地面に落下している筈です。 当然其れ等の処理はプログラム内に記述してあるのですが 全て処理は飛ばされて画面遷移が発生しているとしか思えない状態が発生してしまいました。 プレイヤーに取っては訳も分からず突然画面が切り替わるように感じられる由々しき事態です。

スポンサーリンク
日付:2014年3月16日
開発機:MacBook Air(11-inch, Mid 2013)
MacOSバージョン:OS X 10.9.1
Xcodeバージョン:5.1
言語:Objective-C
主関連アプリ:uPanda Breaks Out Fruits

原因として考えられたのは複数ある処理の並列的な実行でした。 此処では一つにはどのような状況かをプレイヤーに伝えるアニメーションと一つには画面遷移でした。 処理的な記述としては面クリアー及びゲームオーバー時に両者共に引き鉄が弾かれるため 同時に処理が進行して見た目には画面遷移しか人の見た目には映らない状況と考えたのです。 然者しからば 処理を並列ではなく直列で実行させ、 更に処理間にWait(待ち時間)を挿入すれば宜しいなるだろう考えに達しました。 其処でネットを繰って見付け出したのがサイト Ray Wenderlich | Tutorials for iPhone / iOS Developers and Gamers の2013年10月4日の 初心者の為のSprite Kit チュートリアル なる題目の記事で望む処のコードがピンポイントで記されている感を受ける程 状況に最適な情報が得られたのでしたが 2016年6月現在は残念ながらリンク切れとなっています。 参考にしたコードの控えがありますので以下に記し置きましょう。

// GameOverLayer.mのコードの一部分
[self runAction:
  [SKAction sequence:@[
    [SKAction waitForDuration:3.0],
    [SKAction runBlock:^{
      // 5
      SKTransition *reveal = [SKTransition flipHorizontalWithDuration:0.5];
      SKScene * myScene = [[MyScene alloc] initWithSize:self.size];
      [self.view presentScene:myScene transition: reveal];
    }]
  ]]
];

これを参考に記述した手元の SpriteKit フレームワークを利用した 画面遷移の前にアニメの処理を待つ処理 のコードが以下になります。

[self runAction:
  [SKAction sequence:@[
    [SKAction waitForDuration:1.0],
    [SKAction runBlock:^{
      [self.view removeFromSuperview];}
    ]
  ]]
];

上記 [SKAction waitForDuration:1.0] の部分で任意の秒数をウェイト時間に設定出来る塩梅で マジックナンバーの 1.0 を書き換えれた時間だけプレイヤーに然るべきアニメーションを提示しウェイトが掛かった後 画面遷移を実行するもので由々しき事態を免れられました。

なおSpriteKitフレームワークを用いて待ち時間を実装する Qiita の2013年10月下旬の以下の記事 SpriteKit入門 -6- も有りました。 今回は手元の環境とは適合せず参考を見送りましたが 孰れ役立つ機会もあるやも知れず取り敢えずリンクを記し置くものです。

uPanda Breaks Out Fruits
無料:カテゴリ: ゲーム: 4+ 評価
バージョン: 4.12
リリース: 2014年9月15日
更新: 2022年4月20日
サイズ : 10.7 MB
互換性: iOS 14.4 以降のiPhone、iPod touch に対応。および、macOS 11.0以降とApple M1 チップを搭載したMac に対応。