前回は、キャラを動かす方法を重点的に学びました。
たぶん今のあなたなら、画面の中の主役キャラ(たとえそれが「г」とかだったとしても)を十字ボタンで上下左右に動かすのもカンタンなんじゃないでしょうか。
そう考えるとかなりレベルアップしたって気分になりませんか。
今回は、フラグの考えを中心に学んでいきます。
ゲーム用語で「フラグ」ということばを聞いたことはありませんか? あのフラグです。
これまたゲームプログラムらしいフンイキが出てきましたね。
これを読み終えたとき、あなたはまた一歩レベルアップすると言えるんじゃないでしょうか。
それを楽しみに読んでいきましょう。
しかしプレイヤーキャラ1つ動かすだけでも、ケッコウ考えるコトが多いもんだぜ……。
ホントだね。でも、やり方がだいぶわかったから、次からは応用でうまくできるんじゃないかな?
ちょうど応用になりそうなトコロがあるよ。Aボタンを押すと出るショットのプログラムを作ってみようか。
- @LOOP
- GOSUB @MYSHIP
- GOSUB @MYSHOT
- VSYNC 1
- GOTO @LOOP
これもサブルーチン@MYSHOT(自弾)として用意することにしたよ。
まずはフツウにサブルーチンをはじめるとして……
Aボタンを押したときはBUTTON()命令が16になるんだったね。
- ’−−− たま
- @MYSHOT
- B=BUTTON()
- IF B AND 16 THEN VY=−1
あっ、これだとずっとボタンを押していないとショットが動かなくなっちゃうか……。
プレイヤー機のプログラムそのままじゃダメってコトかよ……応用問題とか、オレのキライな話だぜ!
プレイヤー機は「止まっている」「1文字ぶん動く」の2つだけでプログラムできたけど、ショットには3つのパターンが考えられるね。
A | 発射した | ボタンが押されてされてすぐ | プレイヤー機の上に出る |
---|---|---|---|
B | ショット移動中 | 発射されてから消えるまで | 1文字分ずつ上に上がる |
C | 何もない | ショットが画面中にない | スキップ |
フーム……あいかわらずワカるような、ワカんねェような……。
まずカンタンそうなCから作るとして……「Aボタンが押されていない」ときにスキップすればいいのか? でも、イマ書いたIFの条件は「Aボタンが押されている」とき、だったよな? どう書きかえればギャクにできるのかわかんねェ!
ビット演算のしくみを思い出して、よく考えてごらん。BUTTON()命令の数値をAND 16したケッカで「Aボタンが押されているか」の判定をしているけど、これを逆に「Aボタンが押されていないとき」はどうするかな?
Aボタンが押されていると、数字を2進数になおしたとき、「1」どうしになる位(くらい)があるけど、
21 | 10101 | 上(1)と左(4)とA(16)を押している |
---|---|---|
AND 16 | 10000 | A(16)を押しているか? |
= 16 | 10000 | = 押していた |
ボタンが押されていないときは、「1」どうしになる位がひとつもないんだよね。
5 | 00101 | 上(1)と左(4)が押している |
---|---|---|
AND 16 | 10000 | A(16)が押しているか? |
= 0 | 00000 | = 押していなかった |
この場合、ビット演算した答えは0になるんだったっけ。
そのとおり! だから、このプログラムの場合、「B AND 16」が0のときは「Aボタンが押されていない」、と判断すればいいんだね。
そうか、じゃあこうすりゃいいんだナ! カンタンなもんだぜ!
- IF B AND 16==0 THEN ???
それでいけるように見えるよね。 でもワナがあって、これではダメなんだ。
ワンパク君にしてはがんばったけどおしい!
なん……だと……?
そう書いてしまうと、プチコンは16==0の部分から見てしまって、正しく計算されないんだよ。
この場合は、(B AND 16)==0のように、カッコでかこってあげるとうまく動くよ。
なんだと! マッタクイミがわかんねェぜ!
そもそも「ワンパク君にしては」って、おもいっきり上からメセンじゃねーか!
たとえは、「3+4×2」という式を計算する場合、かけ算である「4×2」からまず計算するし、そうではなく「3+4」を「×2」したいなら「(3+4)×2」とするじゃろう。
おなじように、プチコンのANDや==にも、どちらが先かという順番が決まっておるのじゃ。この2つどうしでは、==のほうが先じゃから、16==0から先に読んでしまうんじゃのう。この場合は、算数や数学と同じように、順番を先にしたい部分をカッコでかこえばよいのじゃ。
でも==って、数字どうしをくらべるけど、計算するための記号じゃないですよね……?
ジツは、==などの比較する記号も、比較したケッカは0か1の数字になるのじゃ。これを使ってIFを使わないで自機を動かしたりもできるのじゃが……ショクンらにおしえるのはまだ早いかのう。
ウォー! そんなこと、言われないとワカンネェよ! ひでェハナシだぜ!
しかたねェ、じゃあこうすりゃいいんだナ!
- IF (B AND 16)==0 THEN ???
よし、とりあえず、一番カンタンなCの「何もない」だけ作るゼ!
- ’−−− たま
- @MYSHOT
- B=BUTTON()
- IF (B AND 16)==0 THEN @MSSKIP
- ’−−−
- @MSSKIP
- RETURN
@MSSKIPってラベル名は、「ミサイルをスキップする」ってコトだぜ。
ミサイルとかそういう英語はよく分かるんだね。それにしても、ホントにカンタンなトコだけ……。
まあ分かるトコロはさっさと片付けるというのも、プログラム作りのテクニックのひとつじゃよ。
次にカンタンなのはAの「発射した」じゃが……
それって、こういうこと?
- ’−−− たま
- @MYSHOT
- B=BUTTON()
- IF (B AND 16)==0 THEN @MSSKIP
- MX=PX:MY=PY
- MY=MY−1
- LOCATE MX,MY:PRINT ”│”
- ’−−−
- @MSSKIP
- RETURN
とりあえずミサイルの場所ってことで、42行目に変数MXとMYを用意したよ!
41行目のIF文で「Aボタンを押していないとき」は@MSSKIPに行くことになってるから、42行目から先はかならず「Aボタンが押されているとき」になるね。
だから、ココから書いていくのはリクツに合ってるよ。
プレイヤー機の場所(PXとPY)のすぐ上ってことは、ヨコ方向はMX=PXで、タテ方向はMY=PYにした後MY=MY−1でいいよね。
で、44行目でソコにショットの”│”を出してるワケだ。合ってるんじゃねェか?
うーん、でもコレだと何回でも撃てちゃうな。本当はショットが出てる間はもう撃てないはずなんだけど……。
ウム、なにがマズいのかよくワカっておる。ダイジなことじゃぞい。
ショットは敵に当たって消えることもあるしのう。どうやって「A.発射した」と「B.ショット移動中」の区別をつけるかとカンガエると、ムズカシいのう?
ここは、フラグを使いましょう。
ン? フラグ?
フラグというのは旗(はた)のことじゃが、プログラム用語ではもっとトクシュなイミになるのじゃ。
ゲームでもときどき「フラグを立てる」って言い方をするよね。あれのこと?
だいたい同じイミだよ。ジッサイに見てもらうのが早いかな。 まず変数をひとつ用意しておくね。ミサイル・ステータスでMSTという名前にしておこう。
- MST=1
スガスガしいほど、ナニをしたいのかワカらねえぜ!
だと思ったから、ボクらにワカるルールを作っておこう。変数MSTが1のときは「ショットが画面上にある」、変数MSTが0のときは「ショットが画面から消えている」、ということにするよ。
自分ルールかよ。マスマスややこしいんじゃねェのか?
これがフラグというものさ。もう少し進むと、わかってくるハズだよ。
- ’−−− たま
- @MYSHOT
- B=BUTTON()
- IF (B AND 16)==0 THEN @MSSKIP
- MST=1
- MX=PX:MY=PY
- MY=MY−1
- IF MY<3 THEN MST=0:GOTO @MSSKIP
- LOCATE MX,MY:PRINT ”│”
45行目にIF文を足して、ショットのタテ位置(変数MY)が3より小さくなったらMST=0にすることにしたよ。
画面の上の方まで行ったら、ショットが消えるからMST=0にするんだね。
ついでに@MSSKIPに行くのもナットクだぜ。画面の上までショットをPRINTしてもシカタねえもんな。
ココから一気に書きたすよ。
- ’−−− たま
- @MYSHOT
- B=BUTTON()
- IF MST==1 THEN @MSMOVE
- IF (B AND 16)==0 THEN @MSSKIP
- MST=1
- MX=PX:MY=PY
- GOTO @MSMOVE2
- ’−−−
- @MSMOVE
- LOCATE MX,MY:PRINT ” ”
- ’−−−
- @MSMOVE2
- MY=MY−1
- IF MY<3 THEN MST=0:GOTO @MSSKIP
- LOCATE MX,MY:PRINT ”│”
ラベルに使ったMOVEというのは「動く」というイミの「MOVE (ムーブ)」だよ。
オイオイ、イキナリプログラムが増えすぎてついてけねェぞ!
まずは、さっきの表をもういちど見てみよう。
A | 発射した | ボタンが押されてされてすぐ | プレイヤー機の上に出る |
---|---|---|---|
B | ショット移動中 | 発射されてから消えるまで | 1文字分ずつ上に上がる |
C | 何もない | ショットが画面中にない | スキップ |
たとえば、フラグの変数MSTが0のとき(自分ルールで「ショットが画面から消えている」)に、Aボタンを押すとどうなるかな?
そりゃトウゼン「A.発射した」じゃねーか! ……ン? トウゼンっていえばトウゼンだが、MSTが0のトキは、「B.ショット移動中」にはならねェわけだな……そういえば。
それがフラグのベンリなところだね。「変数MSTが0のときはショットが画面から消えている」という自分ルールが決めてあるから、ぐっと区別がラクになっているんだ。
なるほどね。「A.発射した」のパターンだと、まず41行目と42行目のIF文でひっかからないから、そのままリストを下に進んで……ショットを発射するから、変数MSTを1にしてるんだ!
そのあとプレイヤー機の上にショットを書いている方法は、もうわかるよね。あいだにGOTOをはさんでいるけど、やってるコトはほとんど今までと同じさ。
となるとモンダイは、「B.ショット移動中」のパターンか?
それはフラグの変数MSTが1のとき、だよね。プログラムをなぞってごらん。
えぇと、41行目ですぐに@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のアリ・ナシの組み合わせで作られたものじゃからな。このテのコトが多いのも、トウゼンなのじゃよ。
- IF (BUTTON() AND 16)==0 THEN (命令)
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.298 秒 | このページの最終更新 : 2022/09/20 (火) 12:49:04 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30