ついにサンプルプログラムを見ていく旅もここで終わりです。
RPGなら光とか青空とか出てくるムービーが始まるころですが、まだ今回もサンプルプログラムがゲームとして完成してはいないので、青空がふいにくもって真のラスボスが出てくる場面と言ったほうがいいでしょうか。
そこはどうだっていいですね。
今回はゲーム用語のいわゆる「当たり判定」から始まります。
思えばゲームっぽい話がたくさん出てくるサンプルプログラムでした。
あなたのプログラムのウデもかなり上がったんじゃないでしょうか。
これが終わったら、自分でカンタンなゲームを作ってみるのもいいかもしれません。
いまのは死亡フラグみたいなセリフでしたが、フラグのことも学んだあなたなら、このていどのフラグはFALSEにできるはずです。
いままでのプログラムリストをゼンブまとめてみると、こうだったよね。
+ | プログラムリスト |
|
変数EMAXを敵の数に使うようになってるんだね。
敵の数をいつ変えたくなってもいいワケじゃな。前にもちらっと話したが、変数にできるトコロは変数にしておくのはダイジな心くばりじゃ。
まだデキてねェところは……ショットが敵に当たったトキ、か。
プログラムでショットが敵に当たるというのは、どういうコトかを考えるとわかるんじゃないかな?
うーん、ショットの場所と、敵の場所が重なったとき……かな?
ショットの場所は変数MXとMYだったよな……。敵の場所はEX[I]とEY[I]だから……。つまり、こんなカンジか!?
- IF MX==EX[I] AND MY==EY[I] THEN GOSUB @EOUT
配列変数をツカッてるから、敵をウゴかすFOR~NEXTの中に入れないとイケねェな。
ワシじゃワシじゃ、今回はやたら顔を出すハカセじゃ。
ここでは話のナガレ的に出てこなかったが、当たり判定にベンリなCHKCHR()という命令があるのを知っておったかな?
このサンプルにはカンケイない話じゃが、カンタンにセツメイしておくぞい。
ここまではいい調子じゃないか。敵にショットが当たったコトが分かったら、次は敵がやられるルーチン@EOUTだね。
- @EOUT
- LOCATE EX[I],EY[I]:PRINT” ”
- RETURN
タシカにそうだが……ちょっと待てよ。コレだと、次に敵のターンがきたトタンに、消えた敵もまた出てきちまうぜ!
そうか、敵を動かすためにいつも書きなおしていたんだっけ。
いちどショットが当たった敵はPRINTしちゃダメってことだなあ。
これも、いままでの応用でなんとかなるんじゃないかな?
そうか! フラグを使うんだな!
ED[I]=0 | 右に動く | X=49になるまでX+1 | @RI |
---|---|---|---|
ED[I]=1 | 下におりる | 1回だけY+1 | @DW |
ED[I]=2 | 左に動く | X=0になるまでX-1 | @LF |
ED[I]=3 | 下におりる | 1回だけY+1 | @DW |
ED[I]=-1 | 消えた | 表示しない | @EOUT |
---|
- @EOUT
- LOCATE EX[I],EY[I]:PRINT” ”
- ED[I]=−1
- RETURN
これでフラグは立ったから、次は敵の表示のトキにそのフラグを調べるのが……えーと、ドコがいいんだ?
Еを書いて消すなら、FORループの中ならどこでもいいとも言えるけど。でもどうせなら、もう表示しないってくらいがいいだろうね。
- FOR I=0 TO EMAX−1
- IF ED[I]==−1 THEN @PASS
- @PASS
- NEXT
- RETURN
待てよ……? ハハァ、ピンときたぜ!
こうなってくると敵が減れば減るほどごっそりスキップする行が多くなるよな。つまり、敵をタオせばタオすほど、ゲームのスピードが早くなるってワケだな!
ウムウム。どうやらショクンも、プログラムがダイブ身についてきたようじゃな。
負ける気がしねェゼ!
じゃが、せっかくならココで、よりコウリツのいいプログラムにチャレンジしてみんかな?
コウリツときやがったか。プログラムが動けばそれでいいんじゃねェの?
ム……ム。そういう考えもたしかにアリじゃが。
ひとつにはプログラムの動作スピードが早くなるテクニックなので、オボエておけばアトアト「重い」プログラムを動かすのに助かる、というコトはあるぞい。
アクションゲームにある「処理落ち」とか、そういうやつ?
まあそんなトコロじゃな。もうひとつのメリットとしては、プログラムが見やすくなるコトもある、とも言えるのう。
「見やすくなるコトもある」……?
逆に見にくくなるコトも、ときにはあるかも……
えー……
ま、まァまァ! じゃからこそ、シンプルプログラムのイマのうちにオボエておこうという話じゃよ。なに、たいしてムズカしいコトではないぞい。
ハカセが言いたいのは、たぶんこの部分ですね。
- IF MX==EX[I] AND MY==EY[I] THEN GOSUB @EOUT
さすがはインテリ君じゃな。さよう、ソコは「敵がやられたとハッキリ決まったら、やられルーチンに行って帰ってくる。それ以外は普通に進む」となっておる。
それでフツウじゃねえか?
しかし、こうすればどうじゃ。
- IF MX!=EX[I] THEN @PASS
- IF MY!=EY[I] THEN @PASS
- ’−−− しぼう
- LOCATE EX[I],EY[I]:PRINT” ”
- ED[I]=−1
- @PASS
- NEXT
ン? ……ンンン? 85~86行目は、さっき作ったやられたトキのプログラムだよな。
82行目でMX!=EX[I]ってコトは、ショットのヨコ位置と敵のヨコ位置がチガうってコトだろ。ツマリ当たってないから、@PASSに飛ぶよな。
83行目のMY!=EY[I]もタテ位置になっただけで、同じことだね。
そのどっちでもないって時は、かならずショットが当たっているって言えるから、そのままやられたことになる……
さよう。もともとのMX==EX[I] AND MY==EY[I]という条件式は、ハッキリしとるがそれだけチェックに時間がかかるものじゃ。
新しいプログラムじゃと、カンタンな理由さえあればザクザク切っているのがワカるじゃろう。
やってるコトも、GOTOで飛ぶだけだしね。
それに、まだ敵のやられチェックをカンタンにする方法は残っているよ。
ツマリ今は「敵がゼッタイにやられてない」条件をサガせばいいってコトか? ……やられてないトキ……逆に言えば、やられるのはショットが当たったトキだけ……よし! ゼンゼンわからねえ!
ものすごくあきらめちゃったけど、たぶん「ショットが画面に出ていない間は、敵はやられない」と言えるんじゃないかな。
ソコだね! ショットは変数MSTで表示フラグをカンリしていたから……あとはカンタンだよね。
- IF MST==FALSE THEN @PASS
ナルホドな。言われてみりゃ、そのとおりだぜ。……てことは、何も言われずにコレいきなり見たら、どういうイミなのかワカりづらくねェか?
スナオにIF MX==EX[I] AND MY==EY[I]って書いてあった方がカンタンじゃねえの?
ぜんぶヒテイされてもうたが……そのキモチも、ワカらんでもないわい。スピードを気にせんでいい初心者のコロなら、ムリしてまでやるコトではないのはタシカじゃ。
でも、人のプログラムリストを見るときに「どうしてこんな書き方を?」ってギモンはなくなるんじゃないかな。こういうプログラムの書き方があると知っておくのはムダじゃないよ。
ナイスフォローじゃ、インテリ君!
プログラムの書き方にはヒトそれぞれイロイロなポリシーがあるものじゃが、そういう考え方を知っておくのもひとつのベンキョウじゃぞ。
ベンキョウってヒビキは気にくわねェが……ツギからこういうスキップのしかたを見てもナットクできるのはタシカか。
あれ? このプログラムRUNしてみると、ときどきショット1発で何匹も倒せることがあるよ。
ホントだな。こりゃアレだぜ、パワーアップとかによくある「カンツウダン」の動きになってるな!
「貫通弾」だね。シューティングゲームだと、敵に当たったらそこでショットは消える方がオーソドックスかな? このゲームならそうしないとカンタンすぎるしね。
ええと、敵に当たったらすぐにショットを消すわけだ。
さっきもやったけどショットの表示フラグは変数MSTだったね。
- ’−−− しぼう
- LOCATE EX[I],EY[I]:PRINT” ”
- ED[I]=−1
- MST=FALSE
1行ふやしただけか。イガイにアッサリいくんだな。
フラグはうまく使うと、いろいろラクになるものさ。
あとは、敵を倒したらスコアも上げないとね。
コレはそうムズカしくなさそうな気がするぜ。
とりあえず、サイショに画面の上の方に出しておくんだろ?
- LOCATE 0,0
- PRINT”SCORE: ”;SC
変数SCをスコアってことにしておいたぜ。
そして、敵がやられた時に10点プラスすれば完成かな。
- ’−−− しぼう
- SC=SC+10
- LOCATE 7,0:PRINT SC
うむ、それで合っておる。合っておるのじゃが……。
ナンだ? RUNしても、ナニもモンダイはなさそうだぜ?
しかし、ワシとしてはこういうプログラムをテイアンしたい!
- ’−−− しぼう
- SV=SV+10
- @SCORE
- IF SV==0 THEN RETURN
- SC=SC+10
- SV=SV−10
- LOCATE 7,0:PRINT SC
- RETURN
メインループから@SCOREにGOSUBすると考えてくれい。
どういうこった? 敵がやられたトキは、ただ変数SVに10点プラスして終わりかよ?
そのあとで、変数SCを変えてPRINTするのはサブルーチン@SCOREでやるんだね。そこで変数SVもー10して、またゼロに戻る……
イミがワカらねェな! プログラムが長くなっただけじゃねえか!
先に言っちゃうと、これはLOADしたサンプルプログラムだとこうなってるんですよね。
さよう。なぜワシがこんな一見ムダに見えるプログラムにしたのか、ソコがワカるかの?
ムググ……サイゴになってイガイなナゾトキだぜ……。どう見てもムダにしか見えねェが……。
いやジッサイ、このプログラムのままじゃと、ホントにムダなのじゃ。
バカにしてんのか!
このサンプルプログラムはユーザーのショクンの手でカンセイさせるためのモノじゃからのう。そこでイミが出てくるように作ってあるのじゃよ。
うーん。そうは言っても、どういう時にヤクに立つのか……
こういう何のためにあるのか分からないプログラムは、関係のありそうな数をデタラメでも変えてみると、あんがい目に見えて分かるコトもあるよ。
というと、たとえば敵がやられたトキのSV=SV+10をSV=SV+1に変えてみる、とかいうコトか?
ヤミクモにRUNしてやろうじゃねェか!
画面の前のみんなもジッサイに変えてためしてみよう!
ウ、ウォオ!? 敵を1回撃ったら、スコアが上がりツヅケて止まらねー!
そうか……考えてみればこうなるのはトウゼンではあるよね。
アァ? ブツブツ……SVが1になってそのアト10引いてまたモドッて0じゃねェからまた10……フムフム。そりゃスコアがいつまでも上がりっぱなしにもなるな!
みんなもプログラムの流れを読むと、何が起きたのかだいたいわかるよね!
わざとデタラメにやっておるのじゃから、おかしな動きになるのはトウゼンじゃな。
しかし、このスコアを見てナニかに気付いたのではないかの?
いや、ベツに……
ココまでのナガレがダイナシになるのう……
あっ! スコアが10点ずつアニメーションで増えるように見えるよ!
そりゃタシカにそう見えるけどよォ……。メインループを1回通るたびに10点増やしてんだからトウゼンじゃ……ハッ!?
いいトコロに気付いたね。ギャクに言えば、メインループを1回通るたびに点を増やすようにすると、アニメーションで点数が増えて見えるワケだ。
ナゾがとけてきたゼ……こうすりゃハッキリするな。さっきSV=SV+1にしたトコロをSV=SV+100にしてRUNだ!
うむ! 止まった画面ではよくワカらんが、ミゴトに1匹倒すごとに100点が入り、それが10点ずつアニメーションしておる。
サブルーチン@SCOREを通るたびに、変数SVがカラになるまで10点ずつ増えてるからな! コレはメインループの中でナンドも通ることにイミがあったってワケだ!
モトモトは、たとえば1匹だけ高得点の敵がいるとして、そいつを倒したときにボーナスっぽく、と作ったブブンだったんじゃが、コレももちろんセイカイじゃぞい。
まさかサイゴにこんなクイズがノコッてたとはな……。
プログラムをヒトに渡す時は分かりにくい処理にはコメントを付けておくのがキホンだけど、初心者向けのカダイとしては、まあ良かったんじゃないかな。
ケッキョクそういうアツカイなのかのう……?
- (変数)=CHKCHR(横座標,縦座標)
- (変数)=ASC(”文字”)
- (変数)=CHR$(文字コード)
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.348 秒 | このページの最終更新 : 2022/09/20 (火) 12:49:34 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30