ATAN2が使えないならDDTとかの手法もありますが、DDTをやるにも除算が重いのでこれもまたキツイ。
という訳で2点間の角度を求める機能をハードウェアで作ってしまいました。
概ね下記のような形。
https://github.com/suzukiplan/vgs8/commit/c0437fa5c453a1df0b62072bff0da9680b0ab302
※上記commit時点では若干バグがあります(最新版では治っていますが)
要約すると、MANUAL.mdに書いてある通りですが
- $5A10 に x1 の座標をstore
- $5A11 に y1 の座標をstore
- $5A12 に x2 の座標をstore
- $5A13 に y2 の座標をstore
- $5A14 を load することで (x1, y1) と (x2, y2) の角度を求める
というもの。角度は360度だと8bitに収まらないので、0〜255の特殊なラジアンです。
赤丸が (x1,y1) で 青バツが (x2, y2) とした時の求まるラジアン値は下図のようになります。
(x2, y2) が真上の時が 0 で、時計回りで最大255まで増えます(256 = 0で一周)。
これにより、6502でも無事自機狙いの弾を作ることができました。
だいたい自機を狙えています。
256方向弾ではなくメモリ節約のため32方向弾だから若干ズレますが ^^;
少し大変ですが、やっぱり実際にゲームを作りながら検証しないと必要な機能が漏れてしまったり、不必要なハードウェア機能を実装してゲーム機としてのシンプルさを欠くことになってしまうので、実際にゲームを作りながらゲーム機をつくることは重要。ゲームエンジンにしても然りですが、昨今のゲームエンジンは無駄に高機能なものが多くてあまり美しくないと思っていたりする。