2024年04月28日
【ゲーム制作】面クリア型アクションゲーム 第28回
面クリア型アクションゲーム 第28回
ドット抜けバグが、どうしても直らない…。
稀なんですが、毎回発生する場所も違うし、タイミングもバラバラで規則性がない…。
走査線割込みでSPRITE5枚以上の表示処理をしているので、それの影響であることは容易に推測出来ました。
ただ、まぁそれでもドット消しロジックのバグの可能性もあるので、そちらも調査。
ドットを消した場所とその隣に別のキャラを表示するように修正。
稀にですが、予想通りどちらかが抜けます。
と言う事は、ドット消しロジックがおかしいわけではないと結論。
(ドット消しロジックがおかしいのなら、両方共表示されない。)
次に、OTIR命令で転送が終わるまでに次のVRAM操作が入るのかな?と考えましたが、割込み処理ロジックでは、SPRITEシャッフル処理の後、BGM演奏ルーチンを実行しているので、転送処理時間が足りていない事はないと言い切れます。(32枚×4バイト=128バイト分の転送待ち時間)
しかし、ひょっとしたらの可能性が捨て切れないので、シャッフル処理とBGM演奏ルーチンの間に大量NOPを追加してみました。
…やっぱり直らない…。
何処かのサイトで、割込み処理内でVRAM操作すると画面がおかしくなる。とありました。
うーん、正しくこの状態なのかな?
そこでシャッフル処理だけ割込み処理から外してメインロジックに組み込んでみました。
遅い…。
「ハンド君」、敵、衝突判定、シャッフル処理のタイミングループ時間を調整。
うーん、ドット抜けは無くなりましたが、割込み処理でのSPRITE表示を見越して作成した、キャラクタ初期位置表示や、「ハンド君」消滅アニメーションが、おかしくなりました。
この方法を採用するなら、そのあたりのロジックを修正する必要があります。
この方法はどうしても直らなかった時ですね…。
とりあえず元に戻します。
となると、次に原因の要因となるのはドット消し時の&H004D。
そこで、&H004Dのコールを、DIとEIで囲い、VRAM操作中に割込みが掛からないようにしてみました。
…直らない…。
うーん、調べものと思考錯誤で時間が経ってしまいました。
今回は解決に至らず…。
次回も引き続きバグ取りです。