プレイ日記
ケイン KEIN.HORGAN
シンプルRPG製作日記 16日目 当たり判定をつける(コンソール画面版) ~ CKHKCHR() と ASC() について~
1そうだね
プレイ済み
返信[1]
親投稿
ケイン KEIN.HORGAN
前回の続きです。 といいつつ、前回「次は下移動時のバグの不具合と~」と言った気がしますが、その説明は前回のプレイ日記コメントで済ませちゃいました。 ので、今日はもう一つの予定である「当たり判定」からやります。 (もっと正確に言うならば「移動出来るかどうかの判定」ですね) ※この当たり判定、もしかしたら使わなくなるかもしれないですが…… まあ、覚えていても損はないので、気にしない事にします。 (使わなくなる=キャラクターを移動させるのではなく、マップをスクロールさせる形式にした場合の話)
0そうだね
プレイ済み
返信[2]
親投稿
ケイン KEIN.HORGAN
さて、この判定ですが…… プチコンには専用命令はないので、コンソール画面で行う場合、次のように手動で判定する流れになります。 1.移動しようとしている場所に何があるかを調べる  ↓ 2.もし何もない(または、何かあっても歩くのに問題ない場合)なら、現状通り。  もし歩くのに邪魔な物があるなら、移動をキャンセルする。  ↓ 3.キー入力待ちに戻る
0そうだね
プレイ済み
返信[3]
親投稿
ケイン KEIN.HORGAN
1.移動しようとしている場所に何があるかを調べる これには、CHKCHR() 関数が使えます。使い方は、次の通りです。 C=CHKCHR(X,Y) ' C は、数値型変数。X,Y は、調べたい場所の座標 こうすると、調べた場所にある物に応じた値がCに代入されます。 例えば、もし山(のつもりで配置したそれっぽい記号)があった場合、C=57859 になります。 これが、森っぽい記号だとか、道のつもりで配置した空白文字だとかなら、また違う値になるわけです。 ……はい、山っぽい記号が57859 だとかすぐには意味が分からないですね。 どうして山っぽい記号が57859 になるのかは、どこかの偉い人が決めたルールがあるからで、そのルールに従って文字を数値で表したものを「UTF-16」コードと呼びます。
0そうだね
プレイ済み
返信[4]
親投稿
ケイン KEIN.HORGAN
まあ、呼び名は今は関係ないので話を元に戻すと…… 「山は57859 でいいとしても、じゃあ森とか道とかはどうなるの?」 となります。 これを求めるのが、ASC() 関数です。 45行目からを見てください。 これは、「移動できる地形のリスト」を作っているところです。 MOVABLE_TILE[0] ~ MOVABLE_TILE[2] までの配列を作成して、この1つ1つに「移動できる地形」をセットしていきます。 例えば46行目は、MOVABLE_TILE[0] に、ASC(" ") を入れています。 前回作成したマップでは、道の部分を" "(空白文字です)にしているので、こうなるわけです。 同様に、47,48行目では平原,森を指定しています。 今回は、道と平原、そして森を移動可能な地形としてみました。
0そうだね
プレイ済み
返信[5]
親投稿
ケイン KEIN.HORGAN
実際に使うときは、65行目からのようにします。 65行目の C という変数は、「これから移動する場所の地形」の数値が代入されます。 ※NX,NY というのは、59~62行目で出てくる変数で、「これから移動しようとする場所の座標」の事です。 66行目の F_MOVE という変数は、「この先、移動出来るかどうか?」の変数です。 初期値は FALSE とします。 (FALSE は、数値の0の事です。主に「正しくない」という意味で使います)
0そうだね
プレイ済み
返信[6]
親投稿
ケイン KEIN.HORGAN
次の行からは、移動先の地形が、「移動できる地形」かどうかをチェックしています。 移動できる地形は3種類あるので、FOR ループで3回ループさせています。 C(移動先の地形)と、MOVABLE_TILE[0](移動できる地形の1種類目)が同じなら、 F_MOVE = TRUE にして(TRUE とは、数値で1の事です) そしてループを抜ける という処理です。 ※THEN の後に書いた命令の後に : を使うと、追加でTHEN の時に行う命令が書けます もしC が「移動できる地形」3種類のうち、どれか一つと同じ地形なら、F_MOVE が TRUE になり、もし C が移動できる地形の3種類のどれかでなかった場合は、F_MOVE は FALSE のまま、と言うことになります。
0そうだね
プレイ済み
返信[7]
親投稿
ケイン KEIN.HORGAN
そして最後に、71行目でチェックした結果を反映しています。 IF !F_MOVE THEN ~ というのは、「もし、F_MOVE が 0 なら」という意味です。 F_MOVE が0 、つまり、先ほどのループで TRUE にならずにFALSE のままだったなら、今回移動しようとした場所は、移動できる地形ではなかった、という事なので…… NX と NY の値を、移動前の元の座標に戻してあげます。こうする事で、移動をキャンセルする事が出来ました。 さて、次回ですが…… 今のままだと、主人公が平原や森を歩くと、道になってしまいます。 それをどうにかしようと思います。 ※あと、タイトルに誤字がありました。「~ CKHKCHR() と ASC() について~」ではなくて、 「~ CHKCHR() と ASC() について~」でした(汗
1そうだね
プレイ済み
返信[8]
親投稿
二次元座標からif A$[x、y]==”?” THEN でも判定は可能とか酔っ払って言って見た。
0そうだね
プレイ済み
返信[9]
親投稿
ケイン KEIN.HORGAN
そうですねー マップ情報を文字列配列に読み込んだらそれで判定ができるかと思います。 最終的にREAD/DATA 命令を使用した場合は文字列配列に読み込む事になると思いますので、その時はその方法を使う事になると思われます。
0そうだね
プレイ済み