ディスカッション (4件)
Commodore 64のBASIC環境における、ゲームマップのオーバーヘッド(見下ろし型)カメラ視点の実装方法についてのトピックです。
コードには改善できる余地がたくさんあるよ。例えば、FOR...TO...STEPを使うだけでずっと速くなるはず。
全体的に、これは6502アセンブリならすごく簡単に書けるルーチンだね。昔の雑誌に載ってたBASICのゲームの大半は、起動時にメモリへPOKEで流し込むようなルーチンをいくつか持ってたもんだよ。いくつかは再配置可能な形式で書かれていて、別のゲームにも簡単にコピーできるようになってたし。
これが必要になるはずだよ:
http://1amstudios.com/2014/12/07/c64-smooth-scrolling/
https://www.c64-wiki.com/wiki/Scrolling
-
$D018のビット上位4つ(VM10-VM13)がグラフィックメモリのベースを制御する
-
$D011(YSCROLL)と$D016(XSCROLL)の下位3ビットを使えば、画面表示を各軸0~7ピクセルずつ遅延させられる
-
$D011(RSEL)と$D016(CSEL)の4ビット目を使えば、画面メモリ自体は320x200のままでも、ビューポートを縮小して見た目上304x192ピクセル(NTSCの場合)にできる
VM10-13を使えばダブルバッファリングが可能だし、$D018を書き換えることでフロントバッファとバックバッファを瞬時に切り替えられる。スクロール中は、フロントバッファの内容を水平方向に8ピクセル(1バイト)または垂直方向に4ピクセルずらしてバックバッファにコピーし、スクロール先の端に新しいマップデータを追加していく。各フレームでXSCROLL/YSCROLLを1ピクセルずつ更新して表示画面を新しい画面へと動かし、8/4ピクセル分動ききったら新しいバッファへ切り替えるんだ。
グラフィックメモリ全域をコピーするのは重い処理だから、8/4フレームに分割して実行するのがコツだよ。
いやー、昔使ってたAtari 800でBASICを使ってゲームを入力したり書いたりしたことを思い出すよ。あの頃の開発環境には、一部の人間に刺さる強烈な懐かしさがあるよね。