HSP3講座〜0から他の講座までのつなぎ〜 
ステップ6:ループ文やif文、乱数を使ってみよう。

満月芸夢topへ
HSP3講座topへ

<<前へ 次へ>>

【目次】
ステップ0:HSP3をダウンロードしてゲームを作る準備をしよう。
ステップ1:エディタを立ち上げて画面を表示してみよう。
ステップ2:画像を表示してみよう。
ステップ3:文字を表示してみよう。
ステップ4:実行ファイルを作ってみよう。
ステップ5:変数を使ってみよう。
ステップ6:ループ文やif文、乱数を使ってみよう。
ステップ7:goto文、gosub文を使ってみよう。
ステップ8:これまでの内容でゲームを作ってみよう。
ステップ9:配列変数を使い、スクリプトの分割をしてみよう。
ステップ10:音を追加し、透明色を使ったアニメを作ってみよう。


では、今回は同じ処理を何度も繰り返す「ループ文」と、
条件があったときのみ処理を行う「if文」をサンプルを交えて説明していくぞ。
ループ文にif文か、初めて聞く言葉だ。
使っていくうちに段々分かってくるさ。
では今回のサンプルはこれだ。

sample06_01(ループ文、if文、乱数についてのサンプル)

よし、では拝見させてもらおう……長い!

だんだん内容は増えてくるが、一つずつ落ち着いて理解していけば大丈夫だ。
とりあえず「コンパイル+実行」で実行してみてくれるかな。

分かった、とりあえず実行してみよう……お、マウスの位置によって数字が変わるぞ!


怪しげなボタンがあるな……マウスが乗ると色が変わった。
とりあえず押してみるか。


うおおおお!
何だかよくわからないが、矢が次々と飛んできて私が死んだ!!

ボタンを押すと矢が5回飛んでくるが、この「5回繰り返せ(ループしろ)」という所で「ループ文」を使っていて、
また、「もしHPが0になったら“死んだ!”と表示しろ」というところで「if文」を使っているんだ。

このサンプルではほかにも「ループ文」や「if文」を使っているが、
「繰り返したいときはループ文を使う」、「もし何々なら何々をする、という処理をしたいときはif文を使う」
と覚えておけばOKだ。
むむむ……とっさのときにループ文やif文が何をするものか思い出せるかな……。
思い出せなくても必要な時に調べなおしたり聞きなおしたりすればいいから、それほど心配しなくてもいいよ。

ただ、「ループ文」や「if文」という単語は覚えておくと便利だ。
“HSP3 ループ文”で調べたり“HSP3 if文”で検索すれば
いくらでも参考サイトが出てくるからね。
わかった、思い出せなかったら調べなおすしよう。
それでも分からなければアルマか妹に聞くよ。
そうだね、そうやって調べたり聞いてるうちに自然と身についていくものさ。

では、今回の内容について図を使って説明しよう。
今回のサンプルの中身はこんなイメージだ。
うむむ……
図によると、このサンプルの中では2回ほどループ文を使っているのかな?
そうだよ。 スクリプトは最初の行から順に読まれていくから、
まず一つめのループに入ってグルグル回って、
ボタンを押したら二つ目のループでグルグル回るといった感じだね。

では、最初の行から順に見ていこうか。
分からないところがあったら教えてくれ。

ちょっと待ってくれ、今見てる……。

……ええっと、画像の準備は使ってる画像が増えだけだから分かる。
だが、13行目に書いてあるrandomizeっていうのは何だ?

randomizeっていうのは乱数を使う時に入れて置くおまじないみたいなものさ。
今回は後半で矢のダメージを決めるときに乱数を使っているからここにrandomize命令を書いているよ。
むむ、乱数ってどういう意味だったかな。
聞いたことはある気がするのだが。
乱数っていうのはランダムな数のことだね。

サイコロを使うようなゲームを作りたければ「1〜6の乱数」を使えばサイコロの出目を表すことができるし、
コインを弾くようなゲームを作りたければ「0〜1の乱数」を使って0なら表、1なら裏と決めればコイン弾きを表現できるよ。
なるほど、それはゲーム作りでは使い場所が多そうだな。
もしrandomizeを書き忘れたらどうなるんだ?
乱数が固定されてしまうから、何度やっても同じ順番で乱数が使われてしまうね。

今回のサンプルでrandomize命令をコメントにして実行して見れば実感としてわかると思うよ、
randomize命令があるときはダメージは1〜6の中からランダムに決まるが、
randomize命令がないと何度やってもダメージが6,6,5,5,6になってしまうはずだよ。
うーむ、まだ完全にはわかってない気がするが、
とりあえず「乱数を使うときはrandommize命令を一回最初に入れておけ」ということだな。
今のところはそういう考え方でいいと思うよ。
乱数をもっと詳しく知りたくなったらそのときにまた調べればいいさ。

なるほど、randomizeはだいたいわかった。

で、次はこの16〜46行目の部分か。
repeat、loop、if、stick、break、await辺りが初めて見るなあ……

16行目のrepeatと46行目のloopだが、
これは「repeat〜loopの間をくり返し実行する命令」なんだ。
loop命令まで来たら最後に通過したrepeat命令まで戻る感じだね。
ふむ。と、言うことは繰り返されることによって
19〜21行の画像が何度も何度も画像が貼り付けられているのかな?
そういうことだね。画像や文字は上からドンドン上書きされていくから、
それを意識しておいてね。
ん?「上書きを意識する」とはどういう事だ?
そうだね……絶歌、試しにサンプルの19行目をコメントで消して実行してみてくれるかい。

承知した。よっと……

特におかしいところはないが……。
と、思ったがマウスの位置表示がおかしくなっているな。

文字がドンドン上書きされておかしくなってしまったね。
こうならないように、「上書きしている」ということを意識して、
背景から再度貼り付けて今まで書いた文字を消したりと工夫する必要があるのさ。
うーむ、工夫かあ……。
まあ、表示がおかしくなったときに考えれば問題ないさ。

で、45行目のawaitだが、これはプログラムの実行を一定時間中断する命令なんだ。
await 1だと1/1000秒、await 2だと2/1000秒といったように1/1000秒単位で設定できるよ。

回数制限のないループ文の中ではこのawaitか後に出てくるwaitを入れないと
ゲームが止まってしまうから注意だ。
それは大変だな。
「回数制限のないループ文ではawait 1を挟んでおくこと」これは忘れないようにしよう。

……回数制限のあるループ文もあるのか。
回数制限のあるループ文については後で出てくるね。
53行目のようにrepeat 5と書けばloopまで5回繰り返すループ文になり、
こちらの場合はawaitが無くてもフリーズしない。

ふむ。なるほど。
後は32〜42行の辺りを詳しく教えてほしいかな。

だが、その前に一つ質問させてくれ。
どうもrepeat〜loopの間でスクリプトの左側に空白を入れているようなのだが、
これにはなにか意図があるのか?

その空白はループの箇所を分かりやすくするための工夫だな。
私は「どこからどこまでがループ文やif文なのか」を分かりやすくするために入れているな。
無くても問題なく動くが、あったほうがわかりやすくなるはずだ。
サンプルを触ってて思ったんだけど、この空白って半角スペースじゃないよな?
半角スペース4個分くらい間があいているのだが、バックスペースだと一回で空白が消える……。
どうやって空白を入れているんだ?
キーボードの左側にある「tab」と書いてあるキーを押すと、サンプルのように一気に一定間隔あけてくれるよ。
半角スペースを何回も挟むよりも便利なはずだから有効活用してくれ。
「tabキー」か。ありがとう、覚えておこう。
では、次に32〜42行目の箇所を説明していこう。
ここではif命令を使っている。
if 命令は「if 条件式」の形で書き、もし条件式を満たしていればそれ以降の行を実行し、満たされていなければ次の行に移るんだ。

32行目に
if mousex >=200:if mousex <=299:if mousey >=0:if mousey <=24:
とif命令があるから、

「mousexの位置が200以上の位置にあるか、mousexの位置が299以上の位置にあるか、
 mouseyの位置が0以上の位置にあるか、mouseyの位置が24以上の位置にあるか」
と判断していき、それらすべてを満たした時にこれらの命令に続く{}(波括弧)の中を実行するんだ。
ボタンの位置をif文で表して、ボタンの上にマウスカーソルが来たときに、
{}の中が実行されるんだな。
そういうことだね。で{}の中に入った後は33行目で赤枠で縁取られたボタンが表示されて、
35〜40行でボタンの上でクリックしたときの処理が書かれている。
36行目のstickという命令は何をしているんだ?
stick命令はクリックやキーボードのボタンを押したときに変数の中に対応した数字を入れる命令だな。
左クリックの場合は256が入る。左クリック以外にも色々なボタンに対応しているが、それはヘルプ(hdl.exe)や検索サイトで調べてくれ。
36行目のstick命令でclikという変数に数字を入れる……。
もし左クリックしていたなら38行目のif clik=256を満たしているからその後の{}の中が実行される……と、いうことか

そうだね。そして39行目のbreak命令でループを脱出するから47行目に飛ぶんだ。

で、ループを抜けた後は矢が飛んでくる箇所に入っていくわけだ。
えーっと、repeat回数の指定もif文についてもさっき教えたけど、まだ教えてないことはあるかな?

61行目にあるrnd(6)っていうのをまだ教わってないな。
waitも教わっていないが、コメントに書いてあるようにawaitの停止時間が長くなっただけみたいだから問題ないだろう。
おっと、rnd()を忘れていたよ。
これは「0」から「括弧の中に入れた数-1」の範囲で整数の乱数値を発生させるんだ。
今回のrnd(6)の場合は「0,1,2,3,4,5」のどれかの数が発生する事になるね。
61行目でdamageという変数に「0,1,2,3,4,5のどれかに1を足した数」つまり「1,2,3,4,5,6のどれか」を代入してるのか。
これで、サイコロを振ってダメージを決めるのと同じようなことができるんだな。
そういうことだね。他に質問はあるかい?
うーん……今のところは特にないかな。
しかし今回はサンプルも長くなって中々大変だったな。
ちょっと内容を詰め込みすぎたかもしれないね。
少し休憩しようか。
そうだな。ちょっとまっててくれ、緑茶をいれてこよう。
茶菓子も戸棚の奥に残っていたはずだ。
糖分補給はいいことだね。疲れた時はリフレッシュするのも大切さ。

……いれてきたぞ、あと桜餅があった。
これはありがたい、早速頂くとしよう。
うむ。私も頂くとしよう。
……食べながらでいいから教えてくれ、
次は何を教えてくれるんだ?
次はgosubとgotoという命令について教えるつもりだよ。
その後は実際に何か小さなゲームを作ってもらうつもりさ。
……桜餅の甘さが体にしみわたるな。
おお、もうゲームが作れる寸前まで来てるのか。
……あー、緑茶が温かい。

細かいところは省いているけど、簡単なゲームを作ることぐらいなら今の知識でもできそうだね。
でもgosubやgotoを覚えるともっとできることが広がるんだ。
楽しみにしていてくれ。
<<前へ 次へ>>
inserted by FC2 system