サンプルプログラム7 (その2)
プログラマーからひとこと
前回は、キャラを動かす方法を重点的に学びました。たぶん今のあなたなら、画面の中の主役キャラ(たとえそれが「г」とかだったとしても)を十字ボタンで上下左右に動かすのもカンタンなんじゃないでしょうか。
そう考えるとかなりレベルアップしたって気分になりませんか。
今回は、フラグの考えを中心に学んでいきます。
ゲーム用語で「フラグ」ということばを聞いたことはありませんか? あのフラグです。
これまたゲームプログラムらしいフンイキが出てきましたね。
これを読み終えたとき、あなたはまた一歩レベルアップすると言えるんじゃないでしょうか。
それを楽しみに読んでいきましょう。
弾を出してみよう
ワンパク「しかしプレイヤーキャラ1つ動かすだけでも、ケッコウ考えるコトが多いもんだぜ……。」
神崎「ホントだね。でも、やり方がだいぶわかったから、次からは応用でうまくできるんじゃないかな?」
インテリ「ちょうど応用になりそうなトコロがあるよ。画面タッチで出るショットのプログラムを作ってみようか。
自弾 )として用意することにしたよ。」
0021#. @LOOP
0022#. GOSUB @MYSHIP
0023#. GOSUB @MYSHOT
0024#. WAIT(1)
0025#. GOTO @LOOP
これもサブルーチン@MYSHOT(0022#. GOSUB @MYSHIP
0023#. GOSUB @MYSHOT
0024#. WAIT(1)
0025#. GOTO @LOOP
ワンパク「まずはフツウにサブルーチンをはじめるとして……
」
0040#. ’--- タマ
0041#. @MYSHOT
……オイちょっと待て、画面タッチってイガイとまだ考えたコトなかったぞ!0041#. @MYSHOT
」
インテリ「それもそうだったね。
画面タッチにはシステム変数TCHSTを使うよ。
」
画面タッチにはシステム変数TCHSTを使うよ。
0042#. IF TCHST==TRUE THEN ???
TCHST==TRUEだとタッチされている、TCHST==FALSEだとタッチされてない、というイミさ。」
神崎「TRUEは「アリ」、FALSEは「ナシ」だったね、そういえば。」
ハカセ「このシステム変数TCHSTという名前はタッチのジョウタイ、つまり「タッチ・ステータス 」のリャクじゃな。」
ワンパク「どうもシステム変数ってヤツは、フツウの変数と見た目がイッショでワカりづらいぜェ……。」
ハカセ「こればっかりは、しかたないかのう。システム変数はどれもなかなかベンリなモノなので、なれておくのもイイじゃろう。」
神崎「話をもどすと、システム変数TCHSTでタッチされたかどうか調べるんだったよね。
」
0042#. IF TCHST==TRUE THEN VY=-1
あっ、これだとずっとタッチしていないとショットが動かなくなっちゃうか……。」
ワンパク「プレイヤー機のプログラムそのままじゃダメってコトかよ……応用問題とか、オレのキライな話だぜ!」
インテリ「プレイヤー機は「止まっている」「1文字ぶん動く」の2つだけでプログラムできたけど、ショットには3つのパターンが考えられるね。
」
A | 発射した | タッチされてすぐ | プレイヤー機の上に出る |
---|---|---|---|
B | ショット移動中 | 発射されてから消えるまで | 1文字分ずつ上に上がる |
C | 何もない | ショットが画面中にない | スキップ |
ワンパク「フーム……あいかわらずワカるような、ワカんねェような……。
とりあえず、一番カンタンなCの「何もない」だけ作るゼ!
ミサイルをスキップする 」ってコトだぜ。
」
とりあえず、一番カンタンなCの「何もない」だけ作るゼ!
0040#. ’--- タマ
0041#. @MYSHOT
0042#. IF TCHST==FALSE THEN @MSSKIP
0043#. ’---
0044#. @MSSKIP
0045#. RETURN
@MSSKIPってラベル名は、「0041#. @MYSHOT
0042#. IF TCHST==FALSE THEN @MSSKIP
0043#. ’---
0044#. @MSSKIP
0045#. RETURN
」
神崎「ミサイルとかそういう英語はよく分かるんだね。それにしても、ホントにカンタンなトコだけ……。」
ハカセ「まあ分かるトコロはさっさと片付けるというのも、プログラム作りのテクニックのひとつじゃよ。
次にカンタンなのはAの「発射した」じゃが……」
次にカンタンなのはAの「発射した」じゃが……」
神崎「それって、こういうこと?
ミサイル の場所ってことで、43行目に変数MXとMYを用意したよ!
」
0040#. ’--- タマ
0041#. @MYSHOT
0042#. IF TCHST==FALSE THEN @MSSKIP
0043#. MX=PX:MY=PY
0044#. MY=MY-1
0045#. LOCATE MX,MY:PRINT”・”
0046#. ’---
0047#. @MSSKIP
0048#. RETURN
とりあえず0041#. @MYSHOT
0042#. IF TCHST==FALSE THEN @MSSKIP
0043#. MX=PX:MY=PY
0044#. MY=MY-1
0045#. LOCATE MX,MY:PRINT”・”
0046#. ’---
0047#. @MSSKIP
0048#. RETURN
」
インテリ「42行目のIF文で「タッチしていないとき」は@MSSKIPに行くことになってるから、43行目から先はかならず「タッチされているとき」になるね。
だから、ココから書いていくのはリクツに合ってるよ。」
だから、ココから書いていくのはリクツに合ってるよ。」
神崎「プレイヤー機の場所(PXとPY)のすぐ上ってことは、ヨコ方向はMX=PXで、タテ方向はMY=PYにした後MY=MY-1でいいよね。」
ワンパク「で、45行目でソコにショットの”・”を出してるワケだ。合ってるんじゃねェか?」
神崎「うーん、でもコレだと何回でも撃てちゃうな。本当はショットが出てる間はもう撃てないはずなんだけど……。」
ハカセ「ウム、なにがマズいのかよくワカっておる。ダイジなことじゃぞい。
ショットは敵に当たって消えることもあるしのう。どうやって「A.発射した」と「B.ショット移動中」の区別をつけるかとカンガエると、ムズカシいのう?」
ショットは敵に当たって消えることもあるしのう。どうやって「A.発射した」と「B.ショット移動中」の区別をつけるかとカンガエると、ムズカシいのう?」
インテリ「ここは、フラグを使いましょう。」
ワンパク「ン? フラグ?」
フラグを立ててみよう
ハカセ「フラグというのは旗 のことじゃが、プログラム用語ではもっとトクシュなイミになるのじゃ。」
神崎「ゲームでもときどき「フラグを立てる」って言い方をするよね。あれのこと?」
インテリ「だいたい同じイミだよ。ジッサイに見てもらうのが早いかな。
まず変数をひとつ用意しておくね。ミサイル・ステータス でMSTという名前にしておこう。
まず変数をひとつ用意しておくね。
0043#. MST=1
」ワンパク「スガスガしいほど、ナニをしたいのかワカらねえぜ!」
インテリ「だと思ったから、ボクらにワカるルールを作っておこう。変数MSTが1のときは「ショットが画面上にある」、変数MSTが0のときは「ショットが画面から消えている」、ということにするよ。」
ワンパク「自分ルールかよ。マスマスややこしいんじゃねェのか?」
インテリ「これがフラグというものさ。もう少し進むと、わかってくるハズだよ。
」
0041#. @MYSHOT
0042#. IF TCHST==FALSE THEN @MSSKIP
0043#. MST=1
0044#. MX=PX:MY=PY
0045#. MY=MY-1
0046#. IF MY<3 THEN MST=0:GOTO @MSSKIP
0047#. LOCATE MX,MY:PRINT”・”
46行目にIF文を足して、ショットのタテ位置(変数MY)が3より小さくなったらMST=0にすることにしたよ。0042#. IF TCHST==FALSE THEN @MSSKIP
0043#. MST=1
0044#. MX=PX:MY=PY
0045#. MY=MY-1
0046#. IF MY<3 THEN MST=0:GOTO @MSSKIP
0047#. LOCATE MX,MY:PRINT”・”
」
神崎「画面の上の方まで行ったら、ショットが消えるからMST=0にするんだね。」
ワンパク「ついでに@MSSKIPに行くのもナットクだぜ。画面の上までショットをPRINTしてもシカタねえもんな。」
インテリ「ココから一気に書きたすよ。
MOVE 」だよ。
」
0041#. @MYSHOT
0042#. IF MST==1 THEN @MSMOVE
0043#. IF TCHST==FALSE THEN @MSSKIP
0044#. MST=1
0045#. MX=PX:MY=PY
0046#. GOTO @MSMOVE2
0047#. ’---
0048#. @MSMOVE
0049#. LOCATE MX,MY:PRINT” ”
0050#. ’---
0051#. @MSMOVE2
0052#. MY=MY-1
0053#. IF MY<3 THEN MST=0:GOTO @MSSKIP
0054#. LOCATE MX,MY:PRINT”・”
ラベルに使ったMOVEというのは「動く」というイミの「0042#. IF MST==1 THEN @MSMOVE
0043#. IF TCHST==FALSE THEN @MSSKIP
0044#. MST=1
0045#. MX=PX:MY=PY
0046#. GOTO @MSMOVE2
0047#. ’---
0048#. @MSMOVE
0049#. LOCATE MX,MY:PRINT” ”
0050#. ’---
0051#. @MSMOVE2
0052#. MY=MY-1
0053#. IF MY<3 THEN MST=0:GOTO @MSSKIP
0054#. LOCATE MX,MY:PRINT”・”
」
ワンパク「オイオイ、イキナリプログラムが増えすぎてついてけねェぞ!」
インテリ「まずは、さっきの表をもういちど見てみよう。
たとえば、フラグの変数MSTが0のとき(自分ルールで「ショットが画面から消えている」)に、画面をタッチするとどうなるかな?」
A | 発射した | タッチされてすぐ | プレイヤー機の上に出る |
---|---|---|---|
B | ショット移動中 | 発射されてから消えるまで | 1文字分ずつ上に上がる |
C | 何もない | ショットが画面中にない | スキップ |
ワンパク「そりゃトウゼン「A.発射した」じゃねーか! ……ン? トウゼンっていえばトウゼンだが、MSTが0のトキは、「B.ショット移動中」にはならねェわけだな……そういえば。」
インテリ「それがフラグのベンリなところだね。「変数MSTが0のときはショットが画面から消えている」という自分ルールが決めてあるから、ぐっと区別がラクになっているんだ。」
神崎「なるほどね。「A.発射した」のパターンだと、まず42行目と43行目のIF文でひっかからないから、そのままリストを下に進んで……ショットを発射するから、変数MSTを1にしてるんだ!」
インテリ「そのあとプレイヤー機の上にショットを書いている方法は、もうわかるよね。あいだにGOTOをはさんでいるけど、やってるコトはほとんど今までと同じさ。」
ワンパク「となるとモンダイは、「B.ショット移動中」のパターンか?」
インテリ「それはフラグの変数MSTが1のとき、だよね。プログラムをなぞってごらん。」
神崎「えぇと、42行目ですぐに@MSMOVEに飛んで、画面に書いてあるショットを” ”で消しちゃうのか。」
ワンパク「そのままMY=MY-1して、PRINT”・”するから……ショットが上に上がるワケだな。ここはプレイヤー機を動かすヤリ方と似てるからワカる気がするぜ。」
ハカセ「だいたいフラグの使い方は見えてきたようじゃの。変数に入っている数字でジョウタイをチェックするのが、おおざっぱなフラグの考え方じゃ。
数字は自分ルールでかまわんが、イッパンテキには1だと「アリ」、0だと「ナシ」で、フラグが1になることを「フラグ(旗)が立つ」と言うのじゃな。」
数字は自分ルールでかまわんが、イッパンテキには1だと「アリ」、0だと「ナシ」で、フラグが1になることを「フラグ(旗)が立つ」と言うのじゃな。」
インテリ「遠くから土地を見て、旗が立っているかどうかでそこに何があるのかチェックする、というイメージなんだろうね。
ココを読んでるみんなはフラグについてわかったかな? 変数MSTが0のときと1のときで、どう動きが変わるか注意して読み直してみるとわかりやすいよ!」
ココを読んでるみんなはフラグについてわかったかな? 変数MSTが0のときと1のときで、どう動きが変わるか注意して読み直してみるとわかりやすいよ!」
ワンパク「ム……なんだかキョウイクテキすぎる言い方が気にいらねェが、ゲーム用語になってるくらいだし、ダイジなコトなのはたしかか……。」
神崎「(その通りだけど、ゲーム用語かどうかがキジュンなのかなあ……)」
インテリ「じゃあショットのプログラムができたことだし、ココまでのプログラムをまとめてセイリしておこうか。
メインループに入るより先に、13行目で変数を用意しておいたよ。」
メインループに入るより先に、13行目で変数を用意しておいたよ。」
ワンパク「ン? 0じゃなくてFALSEなのか? 文字変数……ってワケじゃねェよな。」
神崎「ホントだ。今までフラグに使っていた変数MSTにはゼンブ1や0じゃなくてTRUEやFALSEが入っているよ。」
インテリ「まとめるついでに、そこだけ変えてみたんだけど、わかるかな?
変数にFALSEと入れると0、TRUEと入れると1のイミになるんだ。」
変数にFALSEと入れると0、TRUEと入れると1のイミになるんだ。」
神崎「……ん?」
インテリ「たとえばMST=FALSEと書いたあとにPRINT MSTすると、0って出るんだけど……」
ワンパク「オイ! それじゃハジメからMST=0って書けばいいじゃねェか!」
ハカセ「ふぉっふぉっふぉ。リクツで言えばそうかもしれんが、MST=FALSEと書いたほうがハッキリ「アリ」か「ナシ」かワカりやすいじゃろう?」
ワンパク「また「アリ 」「ナシ 」のハナシかよ……。」
ハカセ「ビット演算のトキにも話したが、もともとコンピューターはON / OFFのアリ・ナシの組み合わせで作られたものじゃからな。このテのコトが多いのも、トウゼンなのじゃよ。」
- TCHST変数
- システム変数TCHSTには、常に画面タッチされているかどうかの情報が入りつづけます。0(FALSE)ならタッチされていなく、1(TRUE)ならタッチされています。
- A=TCHST
変数Aに画面タッチされたかどうかが数字で入ります。 - IF TCHST==TRUE THEN (命令)
画面タッチされていれば、命令を実行します。 - フラグを使うとは
- おおざっぱに言えば、自分ルールにしたがって決まった数を変数に入れるようにすれば、それがフラグです。
たとえばゲーム開始時に変数A=0として、「プレイヤーがカギを取ったら変数A=1にする」というルールを決めてプログラムしておけば、ドアの前でIF Aで調べるとドアを開くべきかどうかすぐにわかりようになります。このとき変数Aが1になるのを「フラグが立つ」と言うこともあります。