Swiftで作るモグラ叩きゲーム

 

f:id:gevvoihorry:20160328102652j:plain

 

パワハラ上司をどつき回せ」ってアプリを、現在Appleに申請しています。

これはモグラ叩きを改良したゲームなんですが、僕のようなヘッポコプログラマーは作るのに四苦八苦してしまいました。

同じようなヘッポコ同志が全国に10人はいると思うので、その人たちのために、作り方を書こうと思った次第です。

(僕のコードはヘッポコなんで、もっといいコードがあると思います。でも紹介するやつでもちゃんと動きますよw)

 

☆☆☆

 

まず、なんでモグラ叩きだったのかって言うと、それはこの本に載ってたからですね。

 

iPhoneのゲームアプリをつくろう!

iPhoneのゲームアプリをつくろう!

 

 

iPhoneアプリ開発の教科書を書いてる森巧尚さんの本。

これにモグラ叩きゲームが載ってたんですよ。

 

だからそうそう。これから書くことは、この本を持ってるって前提になりますね。

全部書くのは大変すぎますから、まずはこの本を買ってみてくださいw

 

☆☆☆

 

本の通りに書けば、簡単にモグラ叩きゲームが作れるんですが、僕が困ったのは、数種類のキャラを表示させることです。

 

f:id:gevvoihorry:20160328103254j:plain

 

こんな風に、3人のキャラクターを出して、それぞれ点数を振りたかったんですよ。

上司をタップすれば10点。社長だとマイナス30点。美人OLはプラス50点。て感じに。

 

let action1 = SKAction.moveToY(-1000, duration: 0.0)

let action2 = SKAction.waitForDuration(1.0,withRange: 1.5)

let action3 = SKAction.moveToY(hole.position.y, duration: 0.0)

let action4 = SKAction.waitForDuration(1.0, withRange: 2.0)

let action5 = SKAction.moveToY(-1000, duration: 0.0)

let actionS = SKAction.sequence([action1,action2,action3,action4,action5])

let actionR = SKAction.repeatActionForever(actionS)

mog.runAction(actionS)

 

通常だと、こうやって書いて、ずっとランダムにモグラが出る設定にするんですが、これじゃ調子が悪い。

毎回出てくるキャラクターをランダムにして、それを表示させたかったんです。 

 

そのために、このモグラ叩きの中で出てくる、時間を減らしていく関数を使うことにしました。

 

timeLimit = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "timerUpdate", userInfo: nil, repeats: true)

 

こういうやつですね。

 

上記のコードだと、1.0秒毎に、timerUpdateって関数が呼び出される仕様になってます。

なので、モグラを出すコードを関数にすることにしました。

 

func mogmog(){

 

       〜 省略 〜

  //targetは画像名の変数

        for i in 0...4{

            let random = Int(arc4random_uniform(20))

                if(random>0 && random<13){

                    target = "boss"

                }else if(random>=13 && random<18){

                    target = "ceo"

                }else{

                    target = "OL"

                }

   

   〜 省略 〜

                      

            let action1 = SKAction.moveToY(-1000, duration: 0.0)

            let action2 = SKAction.waitForDuration(1.0,withRange: 1.5)

            let action3 = SKAction.moveToY(hole.position.y, duration: 0.0)

            let action4 = SKAction.waitForDuration(1.0, withRange: 2.0)

            let action5 = SKAction.moveToY(-1000, duration: 0.0)

            let actionS = SKAction.sequence([action1,action2,action3,action4,action5])

            mog.runAction(actionS)

            

        }

    }

 

先にコードから書くとこんな感じです。

毎回乱数を発生させて、その数字でそれぞれのキャラクターを判別していきます。

 

この関数をしかるべき秒数ごとに動かせばいいんですが、その秒数はこれです。

 

let action1 = SKAction.moveToY(-1000, duration: 0.0)

let action2 = SKAction.waitForDuration(1.0,withRange: 1.5)

let action3 = SKAction.moveToY(hole.position.y, duration: 0.0)

let action4 = SKAction.waitForDuration(1.0, withRange: 2.0)

let action5 = SKAction.moveToY(-1000, duration: 0.0)

let actionS = SKAction.sequence([action1,action2,action3,action4,action5])

let actionR = SKAction.repeatActionForever(actionS)

mog.runAction(actionS)

 

この2つの秒数(赤字)を合わせた数字を指定しましょう。

モグラの1ターンは、最大でこの幅になりますから。

 

timeLimit = NSTimer.scheduledTimerWithTimeInterval(3.5, target: self, selector: "mogmog", userInfo: nil, repeats: true)

 

こうやって書けば問題ないですね。

(timerUpdateをmogmogに変えています。これは上記のモグラを表示させる関数名がmogmogだったから)

 

あとはタップしたときに、それがなんなのか判定して、点数を表示させればOK。

 

if touchNode == bossArray[i]{

}

if touchNode == ceoArray[i]{

}

if touchNode == OLArray[i]{

}

 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)の中にそれぞれを書いて、処理を振っていけばいいでしょう。

 

はい、Swiftで作るモグラ叩きはこんな感じです。

ヘッポコ同志の参考になれば幸いですよw