第１６章

## 第１６章　縦スクロール

### 水平ミラーリング

縦スクロールに入ります。横スクロールのときはあまり細かい部分は見なかったのですが、 今回は以前より詳しく調べましょう。縦スクロールを行うには、ミラーの設定を以下のようにします。

    	.inesmir 0 ;   - VRAMのミラーリングを水平にする。

今までと同じ0です。縦スクロールなら垂直ミラーの1じゃないかと思われるかもしれませんが、これでいいのです。 （最初にこの章を更新したときは、垂直ミラーでやっててなんか変だなと思ってましたが、やはり間違っていました） こうすることにより、ネームテーブルの$2000~$23FFと$2800~$2BFFの領域、縦につながる2画面分使用できるようになり、 画面外でネームテーブルを更新することができます。これにより、これから進む先のBG画面を見えない部分で更新することができます。

### 縦スクロールプログラム

早速これを落として、ソース開いてください。今回はソースを頭から説明します。

メインループの流れは、道路描画アドレス計算→道路描画→スプライトとBGの衝突判定→BGスクロール→スプライト描画→コース読み込み→表示ネームテーブル選択→キー取得→スプライトX座標加算、となります。

calcCourse:というラベルがありますが、これ以下の部分は、4回に1度、Road_YH(上位アドレス)とRoad_YL(下位アドレス) から構成される4桁の数字(ネームテーブルにアクセスするためのアドレス)から、32を減算しています。このサンプルは毎回2ドットづつ上にスクロールするので、 BGの8ドット÷2＝4ということで4回に一度BG更新処理を行っています。32という数字は、ネームテーブルの横のキャラ数の32です。 それを減算するのは、上方向に更新して行くということです。

桁下がりが発生すると、NameTblNumを更新していますが、NameTblNumが0のときは$2000から、1のときは$2800から更新するようにしています。 ネームテーブルは$2000→$2800→$2000→$2800・・・のように交互に更新されています。

以下の部分でsecという命令を実行していますが、 sbcという命令はキャリーが0だと1多く減算する性質があるので、敢えてキャリーフラグをセットする必要があります。

    	sec				; sbcの前にキャリーフラグをセット
    	sbc #32				; 道路のY座標アドレス(下位)に32減算

scrollBG:では以下のような記述があります。

    	cmp #254			; 254になった？
    	bne sendSprite
    	lda #238			; 16ドットスキップして238にする
    	sta <Scroll_Y

16ドットスキップする理由は、解像度が240であることと、スクロールレジスタが256まであることのギャップが原因です。 これを実行しないと、ずれてしまいます。Yスクロールレジスタの240~255は使用できません。

以下の部分では、画面に表示するネームテーブルをレジスタ$2000に設定しています。 bit1~0が00なら$2000、01なら$2400、10なら$2800、11なら$2C00から表示します。VRAM更新後に毎回実行する必要があります。

    	; 表示するネームテーブル番号(bit1~0)をセットする
    	lda #%10001000
    	ldx <NameTblNum
    	bne setNameTblNum
    	ora #2			; (%10001010)ネームテーブル2番を表示する
    setNameTblNum:
    	sta $2000

isCrash:というサブルーチンで当たり判定を行っています。このサンプルでは、 BG画面更新アドレスから$C0差し引いたアドレスがスプライトの位置です。（X座標は中心部分しか見ていませんが・・・） $C0を差し引いたときに桁下がりが起こるともう片方のネームテーブルをチェックする必要があるので、ちょっとややこしくなっています。 ヒットしたらとりあえずパレットを変えています。

goCourse:というサブルーチンは、Course_Tblというコースデータを読んで、コースの方向（直進、右折、左折）と その方向に進む継続時間を取得しています。そして、右折・左折する場合は道路のX座標Road_Xを加算・減算します。 つまりRoad_Xはオフセットであり、道路1ラインの左端のネームテーブル上のアドレスは、(Road_YH*$100+Road_YL)+Road_Xで表されるということです。

writeCourse:がネームテーブルを更新しているサブルーチンです。１度呼ばれると１ライン更新します。 左の緑の部分→道路の左の路肩→道路→道路の右の路肩→右の緑の部分の順で、出力します。 このとき、方向によって路肩のキャラを変えています。また左折、右折するときは路肩をつなげるために位置をずらしています。

実行すると以下のような画面になり、道路がスクロールして行きます。左右でキャラクタを移動します。 車のドット絵を描いたほうが良いんですが、ま〜これはこれで味があるような気がしてきた。

今回はかなり理解しづらいと思います。私もネームテーブルのミラーがなかなか理解できませんでした。 やはりこのくらいのことになるとどうしても難しくなってしまいます。

トップページ 前のページ 次のページ

FC2 |  | キャッシング 花 | 無料 掲示板 無料ホームページ