2017年8月17日木曜日

Swift3 で SpriteKit に入門する

概要

SpriteKit は 2D のゲームを開発するためのフレームワークです
ゲームも作成したいなーと思い入門してみました
基本的なコーディング方法や操作方法について紹介します

環境

  • macOS X 10.12.6
  • Xcode 8.3.3 (8E3004b)

プロジェクトを作成する

今回は SpriteKit を使うため Game を選択しましょう
sprite_kit1.png

最近 GameplayKit 新しいフレームワークも追加されたのですが、今回は使わないので「Integrate GameplayKit」のチェックは外しておきます
sprite_kit2.png

あとはプロジェクトを作成するディレクトリを選択すれば OK です

開発準備

今回は Xcode が作成してくれた .sks ファイルと .swift ファイルをそのまま使っていきます
他のサイトなどを見ると .sks ファイルを使わないで .swift だけで開発する手法が紹介されていますが個人的には UI とロジックは分けて書きたいので、そのまま使う方法でいきます

とりあえず今回は SKNode と呼ばれるオブジェクトを 1 つ配置してそれを swift ファイルから操作してみます
オブジェクト用のアイコンを用意しましょう
適当なアイコンで OK です
assets.atlas というディレクトリにアイコンを保存してください
spkit3.png

そしてこれをプロジェクトに追加します
フォルダごとドラッグアンドドロップすれば OK です
コピー時の選択は以下の通りです
spkit4.png

以下の追加できれば OK です
spkit5.png

SKNode を追加する

GameScene.sks を開きましょう
すると「helloLabel」というラベルがあるので一旦これを削除します (あっても問題ないです)

右ペインでインスペクターを選択し「Color Sprite」を選択し Scene 配下にドラッグアンドドロップして追加します
すると右側のサンプルにもオブジェクトが表示されるので適当に位置を調整しましょう
こんな感じになれば OK です
spkit7.png

そしたら右ペインのインスペクターで Texture の欄を選択し先ほど追加した assets.atlas 内にある画像のファイル名を選択しましょう
ちゃんと assets.atlas が追加されている場合プルダウンの中に選択肢が登場するはずです
こんな感じで SKSpriteNode が画像に変更されれば OK です
spkit8.png

さらに Name という欄があるのでここに追加したノードの名前を入力しましょう
ここで入力した名前は Swift 側で参照する際の識別子として使われるので他のノードと被らないようにかつわかりやすい名前を付与しましょう
今回は画像と同じ名前の「block1」としました
Name 欄を変更すると左ペインの Scene 側の表示も Name のものに変わると思います

そして更に Scene に Custom Class を設定しましょう
Scene のインスペクターに移動しここの Custom Class の欄にすでにある GameScene.swift を参照するために「GameScene」を入力します
spkit9.png

Swift 側で参照する

では追加したノードを Swift 側で参照しましょう

GameViewController.swift の編集

まず GameViewController に .sks に指定した Custom Class を指定します
GameViewController の viewDidLoad でシーンを呼び出す部分があります
そこの SKScene を GameScene に変更します

override func viewDidLoad() {
    super.viewDidLoad()

    if let view = self.view as! SKView? {
        // Load the SKScene from 'GameScene.sks'
        if let scene = GameScene(fileNamed: "GameScene") {
            // Set the scale mode to scale to fit the window
            scene.scaleMode = .aspectFill

            // Present the scene
            view.presentScene(scene)
        }

        view.ignoresSiblingOrder = true

        view.showsFPS = true
        view.showsNodeCount = true
    }
}

GameScene.swift の編集

GameScene.swift を開きましょう
デフォルトでいろいろと記載があると思いますが、今回はそのままで追記していきます
とりあえず今回は .sks 側に追加したノードを取得して位置を変更してみます
GameScene.swift の didMove メソッドの最後に以下を追加しましょう
既存のコードでいろいろ書いていますが、それは .sks にもあったラベルを表示する処理などが書かれています

  • GameScene.swift
let block1 = self.childNode(withName: "block1") as? SKSpriteNode
block1?.position = CGPoint(x: 0, y: 0)

ポイントは childNode です
これに .sks で指定したノードの名前を指定することで SKSpriteNode としてノードを取得することができます
あとはそのノードのフィールド (今回であれば position) を編集するだけです
今回は CGPoint で中央指定しています
SpriteKit の場合座標の中心が画面の中心になります
なので 0 以上のプラスを指定した場合ノードは右上へと移動しマイナスを指定すると左下へと移動します

動作確認

実行するとブロックが中央に移動していると思います
spkit10.png

最後に

2D ゲーム開発するために Swift + SpriteKit に入門してみました
2D ゲームを作成するためのフレームワークは他にもたくさんありますが、個人的に iOS アプリを出しているということもあり SpriteKit を選択しました

SpriteKit には他にも物理エンジンやノードを動かすための Action が豊富に用意されているので今後それらも紹介できればと思います

参考サイト

0 件のコメント:

コメントを投稿