Objects
https://gbdev.io/gb-asm-tutorial/part2/objects.html
いよいよスプライト(オブジェクト)です。スプライトといえば、MSXのときBASICで動かした覚えがあります。確か、単色で8ドットと16ドットがあるんでしたっけ。なつかしい。
オブジェクトもタイルマップと同じタイルを使用し(\$8000-\$87FF, \$8800–\$8FFF)、OAMという領域に位置などの情報を格納すると表示される。
OAMのエリアはまず初期化(0でうめる)必要がある。
ld a, 0
ld b, 160
ld hl, _OAMRAM
ClearOam:
ld [hli], a
dec b
jp nz, ClearOam
おなじみのコードになってきました。4バイトが40個で160バイト分を0で埋めます。
OAMは上位から4バイトでY座標, X座標, タイルのID, 属性 の順で格納する。
ld hl, _OAMRAM
ld a, 128 + 16
ld [hli], a
ld a, 16 + 8
ld [hli], a
ld a, 0
ld [hli], a
ld [hli], a
Y座標は16ピクセル、X座標は8ピクセル、足して格納する。画面から消したい場合は、Y座標を0とかにするらしい。
rLCDCに表示フラグをたて、背景とオブジェクトのパレットを指定する。
; During the first (blank) frame, initialize display registers
ld a, %11100100
ld [rBGP], a
ld a, %11100100
ld [rOBP0], a
表示できました!
赤く囲っている部分がオブジェクトです。試しに座標を変更してみると位置がかわったことを確認できます。もし、アニメーションみたいな動きを付ける場合は、タイルの方を変えるんでしょうか。複数タイルを用意しておいて、IDを変えるのかな。
Sublime Text でビルドできるように、Makefileをつくりました。
all: build
build:
@rgbasm -o main.o main.asm
@rgblink -o main.gb main.o
@rgbfix -v -p 0xFF main.gb
次回
次回ではいよいよ動かします!