第17章 横スクロール


垂直ミラーリング

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

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

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

横スクロールプログラム

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

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

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

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


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

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

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

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

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

 左右で移動、Aボタンでジャンプします。床を突き抜けないように落下の速度にリミットをかけてるため、おかしな動きになっています。床との当たり判定を改善する必要がありますね。このまま敵を出してゲームを作ってもクソゲーになっちゃうでしょう。 ファミコンの製品化されたアクションゲームがいかに良くできてたかが、わかると思います。


トップページ 前のページ 次のページ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送