Swiftで作るモグラ叩きゲーム
「パワハラ上司をどつき回せ」ってアプリを、現在Appleに申請しています。
これはモグラ叩きを改良したゲームなんですが、僕のようなヘッポコプログラマーは作るのに四苦八苦してしまいました。
同じようなヘッポコ同志が全国に10人はいると思うので、その人たちのために、作り方を書こうと思った次第です。
(僕のコードはヘッポコなんで、もっといいコードがあると思います。でも紹介するやつでもちゃんと動きますよw)
☆☆☆
まず、なんでモグラ叩きだったのかって言うと、それはこの本に載ってたからですね。
iPhoneアプリ開発の教科書を書いてる森巧尚さんの本。
これにモグラ叩きゲームが載ってたんですよ。
だからそうそう。これから書くことは、この本を持ってるって前提になりますね。
全部書くのは大変すぎますから、まずはこの本を買ってみてくださいw
☆☆☆
本の通りに書けば、簡単にモグラ叩きゲームが作れるんですが、僕が困ったのは、数種類のキャラを表示させることです。
こんな風に、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