いものやま。

雑多な知識の寄せ集め

SpriteKitのサンプルコードを読んでみた。(その1)

変種オセロをiOSで遊べるようにするために、SpriteKitのサンプルコードを読んでみた。

SpriteKitについて

SpriteKitは2Dゲームを開発するためのフレームワーク

アーキテクチャ

SpriteKitのアーキテクチャを大雑把に説明すると、以下のような感じ。

  • ビューの1つであるSKViewにSKSceneをセットすると、SKSceneの内容が描画されていく。
  • SKSceneは短い一定の間隔で更新が行われる。
    この更新の際に呼ばれるメソッドを上書きすることで、ゲームに必要な処理(キャラを動かしたりとか)を行える。
  • SKSceneにはSKNodeを追加でき、これらは階層構造をとる。
  • SKNodeには、画像を表示させるもの(SKSpriteNode)や文字を表示させるもの(SKLabelNode)などが用意されている。
    なお、SKScene自身もSKNodeのサブクラスの一つ。
  • SKNodeにSKActionを渡すと、アニメーションを実行することが出来る。
  • SKNodeにSKPhysicsBodyを設定すると、物理シミュレーションを行うことが出来る。

サンプルコード

AppleがSpriteKitのサンプルコードとして、Adventureというサンプルコードを用意している。

Adventure: Building a SpriteKit Game Using Swift

このゲームはMaciPhone、それにiPadで遊ぶことが出来るようになっていて、

  • 実行すると、タイトル画面が表示される。
  • タイトル画面で「アーチャー」か「ウォーリアー」を選ぶと、そのキャラクターでゲームが始まる。
    (といっても、キャラクターで性能が違うわけではないw)
  • ゲームが始まると、マップ(の一部)が俯瞰で表示され、そこにキャラクターがいる。
    • (Macで実行した場合)
      • カーソルキーを使って、キャラクターの移動と向きの変更を行う。
      • スペースキーを押すと、攻撃をする。
    • (iOSで実行した場合)
      • 画面をタッチすると、その方向にキャラクターが動く。
      • ゴブリンやゴブリンの洞穴をタッチすると、その方向に攻撃をする。
  • 敵としてゴブリンが出てくる。
    • ゴブリンはキャラクターに気がつくと向かってきて、ある程度近づくと攻撃してくる。
    • ゴブリンの攻撃を食らうとキャラクターは死亡して、ライフが減る。
      ライフが全部なくなると、ゲームオーバー。
    • ゴブリンはゴブリンの洞穴から次々と湧いてくる。
    • ゴブリンの洞穴を攻撃して破壊すると、ゴブリンはそれ以上湧かなくなる。
  • 最後にボスがいて、ボスを倒すとクリア。
    ・・・らしいのだけど、ボスに辿り着けない(^^;

という感じ。

画面は次のような感じ。

まず、タイトル画面。

Mac

f:id:yamaimo0625:20150706023342p:plain

iPhone 4S

f:id:yamaimo0625:20150706023421p:plain

iPhone 6 Plus

f:id:yamaimo0625:20150706023448p:plain

iPad (Retina)

f:id:yamaimo0625:20150706023520p:plain

そして、実際のゲーム画面。

Mac

f:id:yamaimo0625:20150706023629p:plain

iPhone 4S

f:id:yamaimo0625:20150706023656p:plain

iPhone 6 Plus

f:id:yamaimo0625:20150706023712p:plain

iPad (Retina)

f:id:yamaimo0625:20150706023735p:plain

各デバイスで画面のサイズは違うのだけど、昨日紹介したテクニックを使うことで、ほぼ同じだけの情報をユーザに与えることが出来ていることが分かる。

なお、このサンプルはObjective-Cでも書かれていて、そちらには解説がついている。

code:Explained Adventure

ただ、クラスの構成などがちょっと違う感じ。
クラス名にもObjective-Cっぽく接頭辞がついてたり。
(APA- という接頭辞がついてる。これはApple AdventureでAPA- だとか)

なので、この解説を参考にしつつ、コードはSwiftで書かれたものを読んでいった。
コードの詳細は、明日以降で。

今日はここまで!