
はじめてみよう。プログラミング! - Swift Playgroundsでゲーム作成-5。
点数が出るようになりました。次は時間を決めてその中でゲームを楽しむ、点数を争っていく仕組みを作ります。タイマー機能をつけていきます。
表示部分を追加して、カウントダウンタイマーを作ります。時間が終われば、ゲームオーバーとして、数字をリセットします。
まず、タイマーを作っていきますが、そのデータが入っていく変数を作っていきます。
var time = 30
var frames = 20
var status = "running"
まず残り時間をカウントする変数は、プログラムの先頭に近い部分で定義しておきましょう。上で得点用のscoreを定義した行に続けて、残りの秒をカウントするtimeと、タイマーによるループの数から「秒」の経過を割り出すframesを定義します。とりあえずゲーム時間は30秒としてtimeの初期値は30とします。タイマーによるループは、インターバルを0.05(秒)としているので、1秒間に20回実行されます。そこでframesは、初期値を20としてループの中でカウントダウンすることで、0になったら1秒が経過したと判断できます。
要するにTimerでは"0.05秒"ごとに更新しています。
Timer.scheduledTimer(withTimeInterval: 0.05
タイマーは1秒ごとにカウントダウンしたいので、"0.05 * 20"すれば"1"秒となります。
20回更新すれば1回更新すれば良いですね。そこで、
var frames = 20
としてこれを利用してカウントダウンします。
frames -= 1 // 20frameで1秒
if frames == 0{
time -= 1
}
0.05秒ごとに変数"frame"を"1"ずつ減らします。変数"frames"を"20"減らすと"0"になります。
if frames == 0{
time -= 1
}
"0"になった時に変数timeを"1"減らします。そして表示部分も更新しないといけないので
if frames == 0{
time -= 1
scoreDisp.string = "Time:\(time) 得点: \(score)" // 表示を更新
frames = 20 // framesを20に戻す
}
となります。時間の更新をしていきます。
そして今更新中ですよということを表すための変数を作ります。
var status = "running"
とします。この"running"の時は実行中ということです。
タイマーで時間をカウントダウンして"0"になった時に"running"から"gameover"とします。
その"gameover"の処理ですが、
if time == 0{
status = "gameover"
for i in 0..<moles.count{
moles[i].center.y = locations[i][1]
}
}
変数timeが"0"の場合の処理です。statusは"gameover"にします。
status = "gameover"
そして、クジラを示す、"mole"の位置を元に戻します。x座標は変わってないのでそのまま、y座標を全て最初の位置にfo in ループで数値を変えることで戻します。
for i in 0..<moles.count{
moles[i].center.y = locations[i][1]
}
それでは試してみましょう。
タイマーが動いて"0"になると、動作は止まり、数字はリセットされます。