SwiftでSpriteKitを用いて軽くゲーム作ってみよう!

これまで、「iOS7で追加されたSpriteKit
フレームワークの使い方」について記事を書いてきましたが、
ここで少し寄り道をしましょう!

Swiftが世に出て
早、2ヶ月が経とうとしていますね。

このブログで前回作成したゲームをSwift書きなおしてみようと思います!
下記の前回までのObjective-C版とぜひ比べてみてくださいね。
全く異なるのが手に取るようにわかるかと思います。

第一回:iOS7で追加されたSpriteKitフレームワークの使い方 ~その1~
第二回:iOS7で追加されたSpriteKitフレームワークの使い方 ~その2~
第三回:iOS7で追加されたSpriteKitフレームワークの使い方 ~その3~

Swift触ってみて感じたことを書きますね。


 

 

1.objective-cとは全然書き方が違うぞ!

まずobjective-cとは全然ちがいます。
なんかスクリプト言語なのかと錯覚してしまうくらい…

でもお互いの言語のライブラリやフレームワークを
参照できます!

下のプログラムを見てください。

let bombCategory:uint = 0x1 << 0
let ballCategory:uint = 0x1 << 1
let worldCategory:uint = 0x1 << 2
    
    override func didMoveToView(view: SKView) {
        /* Setup your scene here */
        
        //背景色設定
        backgroundColor = SKColor(red: 0.15, green: 0.15, blue: 0.15, alpha: 1.0)
        
        self.physicsWorld.contactDelegate = self
        
        self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
        
        self.physicsWorld.gravity = CGVectorMake(0, -3.26)
        
        self.physicsBody?.categoryBitMask = worldCategory
        
        for i in 0..<50
        {
            addChild(createBall()!)
        }
    }
    


selfは別に書かなくても良いし
セミコロンがいらないし
forin文も簡単な表記で出来るし
for文もif文も()いらないし
メッセージを送る[]もないし
キャストはasを使うし

もはやまったく違う…


 

 

2.optional?とunwrapping!とはなんぞ!?

参考にしたサイト

createBall()が呼ばれている際の”!”
physicsBodyの後の”?”

がそうです!

これが厄介です(T_T)

このObjective-c版からSwift版に転記するのに
かかった工数は3時間ほどですが、
多分、これに引っ掛からなければ
1時間もかからなかったと思います。

端的に言うとOptional型の変数は”?”が付きます。
その変数からT型の変数にするのに”!”を付けます。

と言ったイメージです。

はいはいわかりましたー、っと思っても
これだけではまだ引っかかってしまうのです…

optionalとは異なりますが、
そこでIntやFloatなども引っかかります。(Cannot invoke ~って言われます)
以下の部分はまさにそれでした。

func Randf() -> CGFloat {
        return CGFloat(rand()) / CGFloat(RAND_MAX)
    }
    
    func Rand(low: CGFloat, high:CGFloat) -> CGFloat {
        return Randf() * (high - low) + low
    }

ちなみに関数の作成は
func 関数名(引数名1: 引数型, 引数名2: 引数型2) -> 戻り値型 です。

戻り値も複数つけられたりします!


 

 

3.varとlet

型を指定しなければならなかった
objective-cとは違い、Swiftでは
自動で型を合わせてくれます。

ですが、以下のように型を明示的に指定もできます。

    func createBall() -> SKNode? {
        
        var ball:SKShapeNode = SKShapeNode()
        
        var path = CGPathCreateMutable()
        
        let r:CGFloat = Rand(3.0, high: 30.0)
        
        CGPathAddArc(path, nil, 0, 0, r, 0, CGFloat(M_PI * 2), true)
        
        ball.path = path
        
        ball.fillColor = SKColor(red: Randf(), green: Randf(), blue: Randf(), alpha: 1.0)
        
        ball.strokeColor = SKColor.clearColor();
        
        ball.position = CGPointMake(CGRectGetMaxX(self.frame) * Randf(), CGRectGetMaxY(self.frame) * Randf())
        
        ball.physicsBody = SKPhysicsBody(circleOfRadius: r)
        
        ball.name = "ball"
        
        ball.physicsBody?.restitution = 0.99
        ball.physicsBody?.friction = 0.1
        ball.physicsBody?.mass = 1.0
        
        ball.physicsBody?.categoryBitMask = ballCategory
        
        return ball
    }

varは変数
letは定数です。


 

 

4.まとめ

今回転記してみて感じたことをまとめましょう!

・もーまったく違う言語やね。
・単純な書く工数は少なくなりそう。
・できることが多いわー。

一つ目は単純に感想ですね。
これから慣れていくため、勉強しなくては…

二つ目はObjective-cと比べると
すごい書かなくていい部分が増えたなと感じます。

三つ目は複数の戻り値やOptionalやクロージャなど
できることが多くなったなと思います。
ですが、いろいろと不便だなと思うこともあります。

以下にソースを載せます。
ぜひ興味がある方は勉強してみてください!!

前回のソース
今回のソース

追記:
playgroundというライブコーディングができるツールがあるらしい。
まだ使ったことがないので今度ぜひ使ってみてください。
参考にしたサイトではすごく楽しそうです!

コメントを残す

メールアドレスが公開されることはありません。