NESレーザー進捗

レーザー出すのがだいぶ形になってきた。

オプションは256バイトのリングバッファにXYを入れて128フレーム前まで見れるように。ちょうど1ページに収めるとコードもシンプルで良い

ラスター後の座標がズレる問題は、NMIの中で全てを処理しようとしていたのがまずかった。名前の通り、NMIで処理するとrtiで帰るまでIRQがかからないので、NMIの中で長い処理をしてたらそのあいだラスタースクロールが発動できない。半端にメインループと処理が分散してたのを実機で振動する現象の解決にNMIに処理を持ってきたが、むしろNMIを使わない方向じゃないと解決できないことがわかった

MainLoopでVBLANK発生を待つ形に変えて、適当なnopループで画面を描き終えた頃に次のフレームのラスタースクロール用パラメータを設定するようにしたらだいぶ良くなった。

まだ上下の端でズレるのでそこは要調査。

レーザーの表示位置は上からY座標を配列に入れたら出るように改変できたので、次は時期とオプションの座標をソートしてレーザー表示位置配列に突っ込む処理を入れれば、なんとなく動いてる風になるはず。

その後は、裏画面に書いてるレーザーの開始位置と終了位置を一本単位で正しく設定できるようにすれば、レーザー部分はほぼ完成。

敵とかミサイルとかどこまで作るかな。あと32ドットあっても8KB単位でバンク切り替えできるなら二重スクロールもいけなくはなさそう

f:id:Nao_u:20210228040236p:plain

この方式だとどうしてもパレットのうち1色が犠牲になると思ってたけど、レーザーの移動単位を16dotに妥協すれば、ちゃんとアトリビュートを書き換えてことで普通にBGを使いながらレーザーが出せることに気付いてしまった。

FC版のグラディウス1のBGはなぜかほとんど2色しか使ってないので1色減ってもほぼ違和感なく再現できそうだけど、どうせならパレットにも制約がない方が魅力的だなぁ…。アトリビュートには触れたくなかったけど、原理的には最適化すれば上下8ドットくらい表示を切ればアトリビュートを書き換えてもVBLANKで処理できそうかも?