第１７章

## 第１７章　横スクロール

### 垂直ミラーリング

今度は横スクロールに入ります。ミラーの設定は以下のようにします。

    	.inesmir 1 ;   - VRAMのミラーリングを垂直にする

ネームテーブル領域を見ることができるエミュがあれば、前回や今回でなぜこう記述するのかが、理解できると思います。

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

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

メインループの流れは、Courseテーブル読み込み→床描画→スプライト描画→スプライトと床の当たり判定→ジャンプ加速度加算→BGスクロール→表示ネームテーブル選択→キー入力取得→移動処理、となります。

今回は、8x16スプライトを使用しています。スプライト番号の指定は0番、2番、4番…のようにします。0番が上、1番が下、 2番が上、3番が下…のようになります。今までと違いスプライト→BGの順でバンク2に配置していますが、 8x16ではこうしないとスプライトが正しく表示されません。

横スクロールでやることは、大まかに言えば、縦１ラインずつの背景の描画です。 前回の縦スクロールは横１ラインずつ描画していましたから、それが縦になったとイメージしてください。 横の場合ネームテーブルは$2000からと、$2400からになります。横スクロールの背景更新部分は、 前章が理解できればわかると思います。ところで、横１ライン描画は、$2006レジスタへのアクセスが1度で済みますが、 縦１ラインの場合は$2006へのアクセスを最大縦30回分繰り返す必要があるように思えます。しかし、その必要はありません。

    	; PPUコントロールレジスタ1の割り込み許可フラグを立てる
    	lda #%10110101				; スプライトは8x16、ネームテーブルは$2400を指定
    						; PPUアドレスインクリメントを+32にする
    	sta $2000

レジスタ$2000の2ビット目を1にすると、$2007へアクセスしたあと+32されるようになります。32加算されるということは、 １キャラ連続で出力して行けば、縦にキャラを並べてゆくことが可能です。何度も$2006でアドレスを指定する必要はありません。 実に上手くできていますね。ファミコン恐るべし。

startIsHitBlock:ラベル以下でスプライトの足元と床・地面との当たり判定を行っています。 スプライトのアドレスは1ドット単位ですが、BGのキャラは8x8なので、X座標とY座標とも8で割る必要があります(右シフト3回します。 昔のCPUには除算をするDIV命令などありません)。

addPreGrav:というラベル以下で妙なことをやっていますが、これは、$2007をReadするときに、前回の値が残ってしまっているので、 一度空読みしています（前章ではやっていませんが、やる必要があるのかもしれません）。

スプライトの移動やジャンプ処理はゲームによって違ってくる部分なので、 ソースを読むか、もっと良いものを自分で作ってください。いや作らないとだめです。実行すればわかります。

左右で移動、Aボタンでジャンプします。かなり操作性が悪いですねー。 このまま敵を出してゲームを作ってもクソゲーになっちゃうでしょう（笑) ファミコンの製品化されたアクションゲームがいかに良くできてたかが、わかると思います。

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

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