シーンを組み立てる
SKSceneはゲームの1画面に相当します。フィールドや戦闘・ステージ別など必要に応じてシーンを作成し、それをSKViewに表示させることで、Sprite Kitのゲームは作り上げられていきます。
今までもいくつかシーンは作成してきましたが、ここではもう少し詳しく見てみましょう。
ループ
シーンが描画されるとき、Sprite Kitの内部では、以下の様な流れで処理が行われます。
1フレームの処理
これで1フレームが終わります。
60FPSなら1秒間に60回繰り返され、ゲームが進んでいきます。
独自処理を組み込む箇所は、
- update:
- didEvaluateActions
- didSimulatePhysics
の3つのメソッドです。
1は毎フレームの最初に呼ばれます。共通の前処理など、最も利用することが多いでしょう。
2・3はアクション・物理演算の処理が終わった後に呼び出されます。Sprite Kitによる処理が終わった後、独自にノードを操作したい場合等に利用します。
以下のようにそれぞれのメソッドでNSLogしてみると、順番通り呼び出されているのがわかります。
深さと描画順
シーンに追加された各ノードは、後に追加されたものほど手前に存在することになります。
以下の例だと、最後に追加されたblue
が一番上に描画されます。
addChild:された順に表示
描画順を変えたい場合、addChild:
の代わりに、insertChild:atIndex:
を使って順番を調整することで対応できますが、
いつもその方法が取れるとは限りません。
そこで、zPosition
というプロパティを使えば、Nodeツリー上の順番と関係なく、描画順を変更することができます。
zPoistionが小さい順に描画されるため、以下の例では、初期値の0であるcyan
、1が設定されたmagenta
、2が設定されたyellow
の順に表示されます。
zpositionの小さい順に表示
ノードの検索
特定のノードを後から操作したいことがあります。
その場合、シーンのインスタンス変数として保持する必要があるのでしょうか。
もちろん、それも可能ですが、Sprite Kitにはノードに名前をつけて、それをもとに検索する機能があります。
以下では、画面をタップする度に、ノードを検索して、操作しています。
名前にwhite1
が設定された左端の矩形は、タップの度に縮小、whites
が設定された右3つの矩形は、タップの度に回転します。
このように、childNodeWithName:
では1つ、enumerateChildNodesWithName:usingBlock:
では複数のノードを検索できます。
ノードを検索して変更
画面の切り替え
一般的にゲームは、タイトル画面、ゲーム画面、設定画面など複数の画面で構成されています。
Sprite Kitではその画面ごとにSKSceneを作って、SKView上で切り替えて表示することになります。
それでは、2つ目の画面を作って、切り替えてみましょう。
SJFirstScene.m
SJSecondScene.h
SJSecondScene.m
SJFirstScene
では2本指でタップされると、SJSecondScene
のインスタンスを作り、
Pushトランジションを使ってSKViewに表示しています。
また、SJSecondScene
には前回画面を保持するプロパティprevScene
が追加されており、そこに自分自身を設定しています。
SKViewに表示されなくなったシーンは参照が削除されるので、再利用したい場合はどこかで保持しておかないと開放されてしまいます。
今回はSJSecondSceneにその役目を持たせています。
これで以下のように2つのシーンを行き来できます。
First → Second
First ← Second
SJFirstSceneを再利用しているため、タップで回転させた白のノードが、戻ってきた画面でも回転したままなのがわかります。
Sprite Kitでは、このように独自のシーンを組みわせてゲームを作っていきます。
comments powered by