【Swift】SpriteKitの使い方。タイトル画面、プレイ画面、結果画面の順番でシーンを切り替える。(Swift 2.2、XCode 7.3)

2020年6月16日

シーン切替えとは

今までのSpriteKitの記事は、1つのシーン内で物理ボディを動かしたり、衝突させたりしてきた。ゲームは通常、下図のようにタイトル画面、プレイ画面、結果画面などのシーンを切り替えながら進んでいく。

そこで本記事では、シーンの切り替えについて説明する。
シーンの切り替え

 

シーン切替えを試す

実際にシーンの切替えを実装してみよう。以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる方はご利用下さい。⇒「テスト用プロジェクト

事前準備では、タイトル画面シーン、プレイ画面シーン、結果画面シーンの3つを作成しておいた。

タイトル画面にはスタートボタンを配置してある。現段階ではボタンを押しても何も起きない。

タイトルシーン

 

以下のコードは変更前のTitleScene.swift。

 

プレイ画面には鳥ノードを1匹配置した。ドラッグした位置に鳥ノードが移動し、ドロップすると地面に落下する。

 

以下のコードは変更前のPlayScene.swift。

結果画面シーンにはスコアを表示するためのラベルノードを配置しておいた。

結果画面シーン

 

以下のコードは変更前のResultScene.swift。

 

まずは、タイトル画面のスタートボタンが押されたらプレイ画面にシーンが切り替わるものを実装する。

TitleScene.swiftのtouchesBeganメソッドを以下のコードに変更する。このように、遷移先シーンのインスタンスを引数にpresentSceneメソッドを呼び出すとシーンが切り替わる。

 

以下は実際のプレイ動画。スタートボタンを押したらプレイ画面に移動し、ゲームができるようになった。

 

次は、プレイ画面で鳥ノードを画面端に触れさせてしまった時点で、結果画面にシーンが切り替わるものを実装する。

PlayScene.swiftのdidBeginContactメソッドを以下のコードに変更する。

presentSceneメソッドでシーンを切り替える前に、ドラッグした秒数を結果画面シーンのスコアプロパティに設定している。つまり、鳥を飛ばし続けるほどスコアが高くなる。

 

ResultScene.swiftのdidMoveToViewメソッドを以下のコードに変更する。

プレイ画面で設定したスコアプロパティの値をラベルに表示している。

 

以下は実際のプレイ動画

 

今回は画面数が少ないので、スコア渡しは遷移先シートのプロパティに設定するだけでも問題ないが、画面数が増えるとシーン切替えのたびに遷移先シートのプロパティに値を設定するのは煩雑だ。

そんなときは、SKViewのサブクラスにシーン全体で使うプロパティを追加するのが良い。