プチコンの長いスクロール方法
やっぱりやる気ない感じですねw
下記の観点としてまとめてみました。
・プチコンのスクロールは512×512ドットの範囲でハードスクロールさせている。
・長い画面に対応する。
プチコンのスクロールは512×512ドットの範囲でハードスクロールさせている
あまり細かいコトは他の方が説明をしていたりするので、しなくて良いですよねw
ハード的にどの様に処理されているか分かりませんが、ハードウェアスクロールの
様な動作と言う意味です。
BGとしてスクロールさせるには8×8ドットのブロック単位で構成されているので、
BGのサイズとしては64×64となっています。
64ブロック
□□□□□・・・□□□□□
□□□□□・・・□□□□□
□□□□□・・・□□□□□
・
・ 64ブロック
・
□□□□□・・・□□□□□
□□□□□・・・□□□□□
□□□□□・・・□□□□□
表示画面のサイズは256×192ドットなので、見えてる画面上のBGサイズは
32×24ブロックです。
BGは8×8ドットが一つのブロックですが、スクロールは1ドット単位で可能です。
簡略しますが、イメージ的には下記の■部分が実際に見えてる画面の範囲です。
△は見えてないけどBGに書かれている部分です。(※□は無色のブロックとする)
■■■■■■□□□□□□□□□□□□△
■■■■■■□□□□□□□□□□□□△
■■■■■■□□□□□□□□□□□□△
■■■■■■□□□□□□□□□□□□△
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
スクロールはイメージ的には見えている範囲を移動させてると思います。
そうなると上記のイメージで画面を右にに8ドット動かすと左側が表示されなくなると
感じますが、実際には下記の様にBGの先頭は最後のブロックと繋がってるので、
下記の様なイメージで表示されます。
△■■■■■■□□□□□□□□□□□□
△■■■■■■□□□□□□□□□□□□
△■■■■■■□□□□□□□□□□□□
△■■■■■■□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□
このことから、右にスクロールさせたい場合、画面には見えていない一つ左のBGに
絵を用意してスクロールすれば、隠れた部分がドット単位に表示されます。
BGは8ドット単位なので、8ドット毎にこの処理を行うコトになります。
長い画面に対応する。
作るマップが広くない場合は配列などを使用して問題ないのですが、
プチコンmkIIは行数が9999行MAXのため、長いマップだと圧縮などしないとメモリに収まらない
可能性があります。。
プログラムを追加するコトは可能ですが、削除するコトは出来ないため、
下記の方法を考えてみました。
ゼビウスやツインビーの様な縦スクロールするとして説明します。
・グラフィックをメモリとして使う。(誰でも思いつきそうですがw)
プチコンの画面ロードはほぼ一瞬なので、面で構成されてるゲームなどでは
負担が少なく実行出来ると思います。
まずマップ用のグラフィックを用意します。グラフィック画面はカラーが0〜255なので、
ドット辺り255までのBGNOと考えるコトが出来ます。
BGは1024個登録出来るので、2ドット使えば全てのBGNOが使用
出来ます。
・問題点
8ドット毎に1列処理する場合、メモリ内で行う処理ではなくGSPOITと言う
命令で画面情報を読み込むため、1列のBGだと32×2で64ドット読み込む
必要があり、この数だと1フレーム内に処理が収まりません。
・解決策
トッドの読み込みをフレーム毎に処理します。
次のBGをセットする単位は8ドットで、BGの横のブロック数(32÷8)×2で
フレーム毎に4ブロックずつ描画すれば、次のブロックが準備出来ている
ので負担が少なく描画出来ると考えられます。
・プログラム解説
@MAPINITサブルーチンでマップ用の適当な画像を描画しています。
この部分はご自身のプログラムで準備することになります。
実際には画面の情報を面毎で保存しておき、面の切替で読み込むと
良いでしょう。
マップ用に描画した画面をSAVE "GRP:画像名"で保存しておくと、
画像をほぼ一瞬で描画出来るので、面の切り替わり等で
LOAD "GRP:画像名"にてマップデータを読み込むコトを想定しています。
BGMAXという変数が面で使用する縦ブロックの総数なので、
サンプルでは192ブロック分のスクロールとなります。
プチコンの画面サイズは横が256ドットなので、1画面の情報64ドットから
256÷64で4となり、768ブロック分の情報が連続でスクロールできます。
・プログラム
下記がプログラムになります。

・最後に
画像を一瞬で描画出来ると言っても、VSYNC 2としても読み込み時に
若干遅延が発生します。
あまり大きなプログラムを作らないかもしれないですが、ご参考までにw