このページの本文へ

アップルの無償プログラミング学習ツール「Swiftプログラミング」でいっしょに遊ぼう 第5回

アップルの無償プログラミング学習ツール「Swift Playgrounds」アクションゲーム作り(仕上編)

2020年10月11日 09時00分更新

文● 柴田文彦 編集●飯島恵里子/ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

ステップ2:ゲームの時間制限を設けて、
その範囲でしか動かないようにする

 このステップにも、得点表示のときと同じように、まず大きく2つの作業が必要です。1つは、残り時間を表す変数を用意して、それを徐々に減らしていくことと、もう1つはその数字を常に表示することです。そして最後にもう1つの仕事が必要です。得点には上限がありませんが、残り時間はゼロという下限があるので、そこに達したらそれ以上減らないようにし、ゲームも遊べないようにすることです。それらの手順は以下の通りです。

・残り時間をカウントする変数を用意する
・現在のゲームの状態を記憶する変数を用意する
・得点表示の文字列に、残り時間の表示も加える
・ゲーム動作中はタイマーによるループの中で1秒の経過をカウントする
・1秒が経過したら、残り時間の秒のカウントを1つ減らす
・残り時間が0になったらゲームオーバー状態に変更する
・ここまでのプログラムを動かして動作を確認する

 まず残り時間をカウントする変数は、プログラムの先頭に近い部分で定義しておきましょう。上で得点用のscoreを定義した行に続けて、残りの秒をカウントするtimeと、タイマーによるループの数から「秒」の経過を割り出すframesを定義します。とりあえずゲーム時間は30秒としてtimeの初期値は30とします。タイマーによるループは、インターバルを0.05(秒)としているので、1秒間に20回実行されます。そこでframesは、初期値を20としてループの中でカウントダウンすることで、0になったら1秒が経過したと判断できます。

 それに続いて、現在のゲームの状態を表すstatusという変数を用意し、初期として文字列の「running」に設定しておきます。これは、実行中という意味ですが、別の文字列でも構いません。疑問なのは、なぜこんな変数が必要なのか、ということでしょう。この段階では分かりにくいのですが、タイマーによるループの先頭でチェックし、それが「running」であれば、これまで同様の処理を実行し、そうでなければゲームオーバーの状態として、とりあえず何もしないようにするのです。そのため、ゲームの残り時間が0になった時点で「running」を「gameover」に変化させますが、それはまだちょっと後の話です。

 次に、これまでもあった得点表示の文字列に、残り時間の表示も加えます。これは簡単で、これまでは「得点:\(score)」だったstring:の指定を、「残り\(time)秒 − 得点:\(score)」にするだけです。文字列の中心で位置合わせしているので、文字列が長くなっても、位置を調整する必要はありません。

 ここから後は、すべてタイマーの中のプログラムの変更です。上で述べたように、タイマーの先頭で、statusをチェックし、それが「running」であれば、とりあえずこれまでと同じ処理を実行します。

 これまでもあった個々のもぐらに対する処理に続けて、ゲームの残り時間に関する処理を付け加えます。まずframesの値を1だけ減らします。それが0でなければ、まだ何もする必要がないので、残りの処理はすべて飛ばして、タイマーの処理は終わりとなります。ここでframesの値が0となった場合には、さらにtimeの値も1減らします。これで残りの秒数が1秒減るわけです。

 そして、もしtimeの値が0になれば、ゲームオーバーなので、その処理に入ります。timeの値が0でない場合も、秒数は減っているのでその表示を更新するため、scoreDispのstringの値を入れ直し、また新たな1/20秒のカウントができるよう、framesの値を20に設定して処理を終わります。

 この部分、細かく区切ると分かりにくいので、最後までまとめてプログラムを示します。

 timesの値が0になった場合のゲームオーバー処理では、まずstatusの値を「gameover」に変更しています。その後、すべてのもぐら(ボール)について、上下方向の位置(y座標)を、locationsに記録した位置にリセットします。これで、すべてのもぐらは穴の底に降りて、見えない状態になります。ここでは省いていますが、ここにanimate {}によるアニメーションを付けてもいいでしょう。

 この部分、プログラミングに慣れないうちは、ちょっと複雑に感じられ、分かりにくいかもしれません。しかし、それぞれの変数(ここではframesとtime、そしてstatus)の値を自分の頭の中に思い浮かべ、自分がコンピューターになったつもりで場合ごとの動作を考えるようにすると、だんだん分かってくるはずです。どうしてそんな処理が必要なのかという疑問があったら、いったんプログラムを変更してみて、どのような動きになるか、観察してみるのもよいでしょう。

 ここまでできたら動かしてみて、残り時間がゼロになるとどうなるのか、確認しましょう。

カテゴリートップへ

この連載の記事

ASCII.jp RSS2.0 配信中