りょうのゲーム塾 -16ページ目

りょうのゲーム塾

再開、準備中。

サブルーチンHITCHKには実はバグが存在していました。

それはすべてのタスクに対して当たり判定をしていたからです。

今回はたまたま他のタスクが使われていなかったので誤動作は生じていません。


そこで安全なサブルーチンに修正します。


まず、ここで使用しているタスクについて記述しておくと

タスクは全部で20個あります。

先頭は0番で最後が19番です。


0番は現在未使用ですが、本来はゲームタスクが使います。

このサンプル2では使用しません。


1番はプレイヤタスクが使います。


2番から8番まではエネミタスクが使用します。


9番から11番まではターゲットタスクが使用します。


残りの12番から19番までは現在使用していませんが今後使用します。


当たり判定をしたいタスクにだけ当たり判定する最も簡単な方法は

フラグを応用する事です。


というより、そのためにフラグ修理について説明していたわけですから

当然の事ですよね。


ここでフラグについての仕様は下記の通りです。


SF(TN)のフラグn番 → フラグ名

0  →  プレイヤ識別

1  →  エネミ識別

2  →  ターゲット識別

7  →  当たり判定フラグ




それでは修正コードです。


りょうのゲーム塾-001


実際にあたり判定をしているサブルーチンHITCHKでフラグ7番の当たり判定フラグを確認します。

当たり判定の必要が無ければ判定せずに次のタスクへ進みます。


次のIF文で当たり判定する相手かどうかを判断します。

変数FLAGに当たりを行いたい相手の識別ビッチを1にしたものを入れてHITCHKを読みだします。

これはフラグ処理におけるフラグ判定です。


今までのHITCHKは全てに当たり判定していましたが

当たり判定フラグが1であり、識別ビットが1のタスクに当たり判定します。


サブルーチンSETOBJでは新たに当たり判定フラグを1にし

そして自分が何者なのかを識別するビットの設定が必要になります。

SETOBJを呼ぶ前に変数FLAGに識別ビットを設定します。

識別ビットが0の時は当たり判定する必要がないことを意味します。


りょうのゲーム塾-002

プレイヤタスクでは当たり判定のフラグをセットし

またプレイヤ識別のビットもセットする必要があります。

初期化のところで変数FLAGに自分に識別のために&B001を代入しています。

要するにフラグ変数SFの0ビット目のフラグが1の時プレイヤであるという事です。


そして判定を行っている部分でも変数FLAGに当たり判定の識別ビットを代入します。

&B001はプレイヤでした。

プレイヤがプレイヤに当たり判定をする必要はありませんね。

&B010はエネミタスクです。

当然当たり判定が必要です。

&B100はタ0ゲットタスクです。

これも当たり判定が必要です。


&B010 ←エネミ識別

&B100 ←ターゲット識別

OR    ←両方ともにだからORですね。

&B110 ←その結果これがエネミとターゲット両方に当たりを行うための判定ビットになります。


最後のIF文は以前の修正で記載していなかったものなので

ついでに変更しておいてください。



りょうのゲーム塾-003

エネミタスクも識別フラグを設定します。


りょうのゲーム塾-004

ターゲットタスクも識別フラグを設定します。


今、気がついたんですけど。。。


今日は4月1日だからエイプリルフールってやつですよね。


けど、ウソのつもりで書いても。。。

俺の場合は信用されてしまいそうなので何もしません。


一応、その事だけ記録しておきます。





じゃね☆





一通りフラグ処理に必要な説明を行ったので

後は実践しながら覚えていただきましょう。


前回のサンプルの変更部分で特にフラグに関する部分を

簡単に説明をしたいと思います。

今度は少し理解できるのではないでしょうか?


りょうのゲーム塾-002


最初はタスクの初期化部分でフラグ処理を行う変数SFを宣言しています。

タスク変数は今後も配列変数になりますので覚えておいてください。


その後でフラグ変数SFのすべてのフラグをリセット(0にする)しています。



りょうのゲーム塾-003

サブルーチンSETOBJではタスク変数CHRにキャラクタの設定を行っています。

要するにこれによりキャラクタ表示の準備が出来た事になります。


それに対してフラグをセット(1にする)しています。

問題は何のフラグをセットしているかですよね。


まず、フラグをセットするのだから前回の説明から。。。


フラグをONにするにはそれに対応する位置のビットが1のフラグビットをOR(論理和)する。


でしたよね?

ここではプログラムコードは。。。


SF(TN)=SF(TN) OR &H60000


となっています。

SFはフラグ変数でフラグビットをORして元の変数に戻しています。

間違いありませんね?


では&H60000とはどんなフラグビットでしょうか?


ここで使っている変数の制限からビット処理できるビットすうは20ビットです。

一番下のビットは0ビットと呼びます。

最も上位のビットは0から始まっているので19ビットとなります。


ただし以前にお話ししたように最上位ビットは符号として使用しているので

下手に扱うとプログラムにバグを作ってしまうのでここでは使用しません。

実際に使用するのは0ビットから18ビットまでの19個のフラグが使えるわけです。


十分な量があるので問題はないと思います。


ここで次の事を覚えてください。

今後2進数と10進数と16進数の関係を毎回説明していては時間がかかります。

次の表を覚えましょう。


2進数 16進数 10進数

0000     0     0

0001     1     1 ←フラグビットとして使用する①

0010     2     2 ←フラグビットとして使用する②

0011     3     3

0100     4     4 ←フラグビットとして使用する③

0101     5     5

0110     6     6

0111     7     7 ←マスクビットとして使用する④

1000     8     8 ←フラグビットとして使用する④

1001     9     9

1010     A    10

1011     B    11 ←マスクビットとして使用する③

1100     C    12

1101     D    13 ←マスクビットとして使用する②

1110     E    14 ←マスクビットとして使用する①

1111     F    15


【重要】特に今回はフラグやマスクとして使うものについてしっかりと覚える事!




フラグビットとして指定されている値は16進数なのでこれを2進数に変換してみると。。。


60000 ←16進数


0110 0000 0000 0000 0000 ←2進数(ただし見やすいように4ビット毎に空白をいれています)


するとこれは18ビットと17ビットをONにするフラグビットであることが分かります。


18ビット(キャラクタの有無)

17ビット(キャラクタ表示の有無)


として使っています。

そしてSETOBJでこの2つのフラグをONにしています。




サブルーチンDISPOBJではこのフラグを使っています。


フラグの判定は判定したい位置のビットが1のフラグビットでAND(論理積)して

0(OFF)か0でない(ON)かを判定します。

サンプルプログラムのコードでは


IF (SF(_R0) AND &H60000)!=&H60000 GOTO @L000100


となっています。

&H60000がフラグビットですが判定が0かそうでないかではないですね?

本来はこう書けば分かりやすいいのです。


IF (SF(_R0) AND &H40000)== 0 GOTO @L000100

IF (SF(_R0) AND &H20000)== 0 GOTO @L000100


最初のIF文は18ビットがOFFの時処理をスキップします。

このフラグはキャラクタが設定されていないので表示できないからです。


そして次のIF文は17ビットがOFFの時処理をスキップします。

このフラグはキャラクタは設定されているが表示させない設定になっている事を表しています。


今回表示する処理は


1)キャラクタが設定されている

2)キャラクタを表示するモードになっている


1と2の二つの条件が同時に重なっている必要があるので

2つのフラグビットでANDした値が2つのビットがONである値よするに&H60000である必要があったのです。

この値でない時に表示する処理をスキップしていました。


分かり辛いのであれば下のコードを使ってください。


ではなぜあえて上のコードを使ったかと言うと

プログラムコードが少ないということは大体において実行速度がはやくなる傾向にあるからです。