人は、1年に1つずつ年齢を重ねていく。
しかし、刻々と流れゆく時間にただ身を任せるわけではなく、
時には同じことを繰り返したり、時には大きな選択を迫られたりする。
そうして人は複雑な人生を歩み、それぞれがちがった結果を残す。
さて、Lesson2は哲学のお勉強をします。
嘘です。(そればっかりw)
実は上に書いた中ニくさい文章は、プログラムにも同じことが言えます。
Lesson1で作ったプログラムは、何回実行しても同じ結果が出ますよね?
でも、ゲームはそうじゃありません。
同じゲームを100人の人がプレイしたら、スコアなり、主人公のレベルなり、
所持アイテムなり、最終的にはみんな違う結果になるはずです。
もし、100人とも同じ結果になるのであれば、
それはゲームではなく「映画」になってしまいます。
Lesson1で学習したとおり、
プログラムは基本的に上から1行ずつ順番に実行されます。
しかし、ある条件で違う処理をしたり、
条件を満たすまで処理を繰り返したりします。
例えば、シンプルなアクションゲームの処理を考えてみましょう。
ざっくり描くと、このような流れになるはずです。
YES・NOで分岐しながら。全体の処理を繰り返していますね?
Lesson2では、このようなプログラムの流れの変化を学習します。
これができないとゲームが作れません。
「映画」どころか「静止画」しか出せなくなってしまいます。
大して難しいことはありませんので、頑張りましょう。
繰り返し
では、同じ処理を繰り返す方法を勉強しましょう。
ちなみにプログラム用語では、繰り返すことを『ループ』と呼びます。
次のようにプログラムを書いてみてください。
screen 0, 640, 480
repeat 3
mes "スライムがあらわれた"
loop
実行してみると『スライムがあらわれた』が3回表示されます。
「repeat」と「loop」は必ずセットで使われる命令で、
「間に書かれた処理を繰り返しなさい」という意味です。
repeatのパラメータは繰り返す回数です。
repeatとloopの間には何行書いても構いません。
なお、repeatとloopの間のプログラムは、
上の例のようにTABキーでもう一段階右にずらしておきます。
そうすることで、どこからどこまでを繰り返すのかが
すぐにわかるようになります。
永久ループ
repeatのパラメータを省略すると、どうなるでしょうか。
この場合、必ずawait命令を入れてください。
次のようにします。
screen 0, 640, 480
repeat
mes "スライムがあらわれた"
await 16
loop
実行してみると、文字の表示が何度も繰り返され画面の外まで表示されます。
画面外に出ても、見えなくなっただけでループは止まりません。
このように、ずっと続くループ処理を永久ループと呼びます。
そして、永久ループに限らずしばらく時間がかかるループ処理を書く場合は
必ずawait命令を間に入れます。
これは「ちょっとだけプログラムを止める」という命令です。
なぜこれを入れなければならないかと言うと・・・・
▼▼▼▼▼▼▼▼混乱する人は読み飛ばしてください▼▼▼▼▼▼▼▼
Windowsというのは常にいろいろなプログラムが同時に動いています。
ネットをしながら音楽を聴いたり、
ネットだって何ページも同時に開けますよね?
何もしてなくても、時計が動いていたり、
マウスが動いていないか監視したりいろいろやってます。
それは、正確に言うと「同時に処理してる」のではなく
「順番に少しずつ処理している」のです。
これを専門用語で「マルチタスク」と言います。
さて、そんな忙しい状況で、HSPで永久ループを書くと
パソコン(CPU)はHSPの処理にかかりっきりになってしまいます。
すると、他の大事な機能を処理する暇が無くなってしまい、
パソコンがフリーズしてしまいます。
パソコンがフリーズしてしまえばHSPの処理も止まってしまい、
どうしようもなくなってしまうのです。
そこで、永久ループの場合は、
ちょっとだけ処理を止めるawait命令を入れます。
すると、HSPが一瞬止まった隙に、他の処理をすることができ、
みんなスムーズに動けます。
ようするに、「譲り合い」ということですね。
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
さて、await命令のパラメータは、プログラムを停止させる時間です。
単位は「ミリ秒」。
1メートルは1000ミリメートルですよね?
同様に、await 1000と書けば、1秒間止まります。
では、上の例の16という数値はどこから来たのでしょうか。
実はゲームは基本的に1秒間に60回画面を更新します。
1000ミリ秒に60回ってことですね?
ということは、1000÷60≒16.66666・・・・なので、
約16ミリ秒に1回画面を更新していることになります。
今回はそれに合わせてみました。
この講座はゲーム制作を目標にしているので、基本的にawaitは16でいいでしょう。
【メモ】
永久ループでなくても、ある程度時間がかかるループ処理をする場合はawaitが必要になります。
とは言っても、数百回のループであれば(処理内容にもよりますが)一瞬で終わるので、
awaitは必要ありません。
なお、await 16と書けば必ず1秒間に60回ループするとは限りません。
複雑な処理をしたり、性能の低いマシンで実行すれば、それより遅くなることがあります。
ただし、1秒間に60回以上繰り返すことはなくなります。
今回のポイント
-
repeat 回数 ~ loop の間に書いた処理は 指定した回数繰り返される。
-
永久ループの場合は、必ずループの中にawait 16を入れる。