カッパでも分かるiOSアプリゲーム開発

カッパがひたすらゲーム制作に関することを書くブログです。Railsに関するTipsもたまにまとめてます。

xcode7, swift2 とSpriteKit でゲームを作る時にまず行ったこと

スポンサードリンク

swift と SpriteKit でゲームを作るときの流れ。

f:id:InvokeTwoA:20151105040739j:plain

まずは新規プロジェクトを作成

Xcode -> File -> New -> Project

初めにテンプレートを選べと言われるが、Gameを選択

f:id:InvokeTwoA:20151105164214p:plain

続いて各設定を埋めていく。
Organization などは自分個人を示すユニークな何かをつければ良い。
言語は Swift , ゲームエンジンは SpriteKit を選択

Next を押すと一通りのファイルが作られる。

./GameScene.sks
./GameScene.swift
./GameViewController.swift
./Info.plist

まずはスタート画面を表示する

初めの時点で Product -> Run を実行するとデフォルトのスタート画面がでる。
(タップするとその場所に飛行機が現れ回転)

f:id:InvokeTwoA:20151105171129p:plain

これだとあまりに自分の作ったものっぽさがないので、関連コードは削除する。

GameScene.swift

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */
        let myLabel = SKLabelNode(fontNamed:"Chalkduster")
        myLabel.text = "Hello, World!";
        myLabel.fontSize = 45;
        myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
        
        self.addChild(myLabel)
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
       /* Called when a touch begins */
        for touch in touches {
            let location = touch.locationInNode(self)
            
            let sprite = SKSpriteNode(imageNamed:"Spaceship")
            
            sprite.xScale = 0.5
            sprite.yScale = 0.5
            sprite.position = location
            
            let action = SKAction.rotateByAngle(CGFloat(M_PI), duration:1)
            
            sprite.runAction(SKAction.repeatActionForever(action))
            
            self.addChild(sprite)
        }
    }

この Setup your scene here のあたりが初めに書かれていたもの。
まるっと決して問題なし(後で自分の思う画面を作る)

    override func didMoveToView(view: SKView) {
      // 何か処理
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
       // 画面をタップした時の処理
    }

git の設定をしておく

.gitignore とか作って、gitに登録しないファイルは除外しておこう。
自分的には下記ファイルとかはgitに登録する必要なし

Assets.xcassets/
Base.lproj/
Info.plist

storyboard を使わないならば、消してしまう

storyboard使わない派ならば、不要ファイルは後々のために決しておくと良い。

main.storyboard を削除。
ただ、消しただけだと下記のエラーが起きてしまうので

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'Main' in bundle NSBundle

Project settings -> Info -> Custom iOS Target Properties
ここで、下記の行を削除する

Main storyboard file base name

一緒に LaunchScreen.storyboard も削除。

※ついでにアプリ名とかも変えておく。標準だとProject Name のままアプリが配信されるので
Project settings -> Info -> Custom iOS Target Properties

Bundle Name
に適当な名前を設定しておく。


このままではAppDeletegate.swift と GameViewController.swift が紐付いていないので、下記の通り修正

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window!.rootViewController = GameViewController()
        self.window!.makeKeyAndVisible()
        return true
    }

更に UIView を SKView にcastできないとエラーがでるので

Could not cast value of type 'UIView' (0x3b130600) to 'SKView' (0x3a5389a0).

GameViewController も下記のように修正

    override func loadView() {
        self.view = SKView(frame: CGRect(x: 0, y: 0, width: 320, height: 480))
    }

これで問題なく GameViewController を呼べる。
storyboard を使うべきか否か、未だに迷うとこだね。

GameScene.sks も使わないならば消してしまう

このファイルは普通に消すだけで問題なし

共通で呼ぶ定数ファイルを作成する

どうせ共通用のライブラリは作るから、Common の group を作成しておく。
自分は

common/CommonConst.swift

に定数ファイルを保存してる

例えば広告の高さとか下記の感じで設定

import Foundation

class CommonConst {
    // 広告の高さ
    class var adHeight: Int {
        return 50
    }
}

呼ぶ時は CommonConst.adHeight とすれば良い。

親クラスを作っておく

ゲームによってはSceneクラスを多数作る。
それらに共通の処理や設定を行うための、親クラスを作っておく。

自分は BaseScene.swift を作ってる

import Foundation
import SpriteKit

class BaseScene: SKScene {

}

さっそく GameScene.swift は BaseScene.swift を継承するようにする

class GameScene: BaseScene {
}

好きなフォントを入れる

自分の好きなファミコン風なドット絵文字はこちらitouhiro.hatenablog.com

ダウンロードしたフォントを Fonts という名の Groupなどを保存してそこに格納。
続いて info.plist にフォントを追加する。

f:id:InvokeTwoA:20151105184959p:plain

これでできるはずー と思ったらなんかフォントが変わらない。
Build Phases -> Copy Bundle Resources にフォントを追加したら適用された。

loading 画面を変更する

方法は前にまとめてた。グッジョブかっぱ!kappa-game.hatenadiary.jp

apple の証明書を発行しておく

Provisioning file 関連は毎回面倒。早めにやっておく
Sign in with your Apple ID - Apple Developer

新しいアプリの Certificate 登録。それに対応する Provisioning file の登録。
登録だけすれば後は Xcode 側で Download できるようになったのでだいぶ楽になった。

apple の申請準備を早めにしとく

別にソースコードが完成していなくても apple 審査の準備はできる。
https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/ng/
早めにアプリ説明文などは書いておき、必要ファイルなどを認識しておくと良い

nendの広告申請

承認まで数日かかるので、先にやっておくのが吉。kappa-game.hatenadiary.jp
広告がバージョンアップしてたりしたら厄介。

今のところ NendAd って手でダウンロードしてきてるから自動更新とかされない……。