サンプルプログラム7 (その2)
前回は、キャラを動かす方法を重点的に学びました。
たぶん今のあなたなら、画面の中の主役キャラ(たとえそれが「
г」とかだったとしても)を十字ボタンで上下左右に動かすのもカンタンなんじゃないでしょうか。
そう考えるとかなりレベルアップしたって気分になりませんか。
今回は、フラグの考えを中心に学んでいきます。
ゲーム用語で「フラグ」ということばを聞いたことはありませんか? あのフラグです。
これまたゲームプログラムらしいフンイキが出てきましたね。
これを読み終えたとき、あなたはまた一歩レベルアップすると言えるんじゃないでしょうか。
それを楽しみに読んでいきましょう。

しかしプレイヤーキャラ1つ動かすだけでも、ケッコウ考えるコトが多いもんだぜ……。

ホントだね。でも、やり方がだいぶわかったから、次からは応用でうまくできるんじゃないかな?

ちょうど応用になりそうなトコロがあるよ。画面タッチで出るショットのプログラムを作ってみようか。
0021#. @LOOP
0022#. GOSUB @MYSHIP
0023#. GOSUB @MYSHOT
0024#. VSYNC(1)
0025#. GOTO @LOOP
これもサブルーチン
@MYSHOT(
自弾)として用意することにしたよ。

まずはフツウにサブルーチンをはじめるとして……
0040#. ’--- タマ
0041#. @MYSHOT
……オイちょっと待て、画面タッチってイガイとまだ考えたコトなかったぞ!

それもそうだったね。
画面タッチにはシステム変数
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の「何もない」だけ作るゼ!
0040#. ’--- タマ
0041#. @MYSHOT
0042#. IF TCHST==FALSE THEN @MSSKIP
0043#. ’---
0044#. @MSSKIP
0045#. RETURN
@MSSKIPってラベル名は、「
ミサイルをスキップする」ってコトだぜ。

ミサイルとかそういう英語はよく分かるんだね。それにしても、ホントにカンタンなトコだけ……。

まあ分かるトコロはさっさとカタヅケるというのも、プログラム作りのテクニックのひとつじゃよ。
ツギにカンタンなのはAの「発射した」じゃが……

それって、こういうこと?
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
とりあえず
ミサイルの場所ってことで、43行目に変数
MXと
MYを用意したよ!

42行目のIF文で「タッチしていないとき」は@MSSKIPに行くことになってるから、43行目から先はかならず「タッチされているとき」になるね。
だから、ココから書いていくのはリクツに合ってるよ。

プレイヤー機の場所(PXとPY)のすぐ上ってことは、ヨコ方向はMX=PXで、タテ方向はMY=PYにした後MY=MY-1でいいよね。

で、45行目でソコにショットの”・”を出してるワケだ。合ってるんじゃねェか?

うーん、でもコレだと何回でも撃てちゃうな。本当はショットが出てる間はもう撃てないはずなんだけど……。

ウム、なにがマズいのかよくワカっておる。ダイジなことじゃぞい。
ショットは敵に当たって消えることもあるしのう。どうやって「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にすることにしたよ。

画面の上の方まで行ったら、ショットが消えるからMST=0にするんだね。

ついでに@MSSKIPに行くのもナットクだぜ。画面の上までショットをPRINTしてもシカタねえもんな。

ココから一気に書きたすよ。
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というのは「動く」というイミの「
MOVE」だよ。

オイオイ、イキナリプログラムが増えすぎてついてけねェぞ!

まずは、さっきの表をもういちど見てみよう。
A | 発射した | タッチされてすぐ | プレイヤー機の上に出る |
B | ショット移動中 | 発射されてから消えるまで | 1文字分ずつ上に上がる |
C | 何もない | ショットが画面中にない | スキップ |
---|
たとえば、フラグの変数
MSTが
0のときに、画面をタッチするとどうなるかな?

そりゃトウゼン「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になることを「フラグ(旗)が立つ」と言うのじゃな。

遠くから土地を見て、旗が立っているかどうかでそこに何があるのかチェックする、というイメージなんだろうね。
ココを読んでるみんなはフラグについてワカったかな? 変数MSTが0のときと1のときで、どう動きが変わるかチュウイして読み直してみるとわかりやすいよ!

ム……なんだかキョウイクテキすぎる言い方が気にいらねェが、ゲーム用語になってるくらいだし、ダイジなコトなのはタシカか……。

(その通りだけど、ゲーム用語かどうかがキジュンなのかなあ……)

じゃあショットのプログラムができたことだし、ココまでのプログラムをまとめてセイリしておこうか。
プログラムリストを表示メインループに入るより先に、13行目で変数を用意しておいたよ。

ン? 0じゃなくてFALSEなのか? 文字変数……ってワケじゃねェよな。

ホントだ。今までフラグに使っていた変数MSTにはゼンブ1や0じゃなくてTRUEやFALSEが入っているよ。

まとめるついでに、そこだけ変えてみたんだけど、わかるかな?
変数に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になるのを「フラグが立つ」と言うこともあります。