自機8方向移動操作
GARUDAでは自機・敵機ともに、向きや移動方向を角度(一周128分割)で示します。
移動パラメータをX移動量&Y移動量で保持するよりも、角度&速度で保持した方が、ホーミングや
画像回転のあるこの作品では都合が良いからです。
方向値は、画面下方向を0として、右下16、右32、右上48というように、反時計回りで増加します。
(grotateの角度パラメータは時計回りなので、符号反転して与えます)
で、ここで一つ問題があります。
キー入力はstick命令でやっています。
stick命令で取得した入力値、下位4ビットが矢印キーの情報であることは言うまでもないですが、
方向値として使用するためには、下位4ビット=8のとき角度0、同3で角度80というように、
変則的な変換を行わなければ成りません。
矢印キー | 無し | ← | ↑ | ←↑ | → | ←→ | ↑→ | ←↑ → |
↓ | ←↓ | ↑↓ | ←↑ ↓ |
→↓ | ←→ ↓ |
↑→ ↓ |
全部 | |
下位4ビット | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
方向値 | - | 96 | 64 | 80 | 32 | - | 48 | (64) | 0 | 112 | - | - | 16 | (0) | - | - |
「-」は左右同時押しとか全部押しなど、方向値を定めなくてもよいところ。
この変換を行うロジックとして考えたのがこれ。方向値eedと、速度eed.1を計算します。
kdir="D6452D3407DD10DD"
eed=16*peek(kdir,ky&15) ,(eed<896)*500
AXにして93バイト。
方向値の元になる値を文字列で用意し、「下位4ビット」番目のアスキーコード値を取り出して16倍。
今計算したeedが896("8"のコードの16倍)より小さいなら、速度=500。それ以外は停止。
方向値が128を越えるけど、後の作りが一周128で対応する角度の方向値としてみなすので問題なし。
("D"は方向値として$44*16&$FF→$40=64で、内部的には停止時の方向は上になっています。)