前回からひきつづき
https://gbdev.io/gb-asm-tutorial/part2/objects.html
を読みすすめていきます。
オブジェクトを動かしてみる
Main:
; Wait until it's *not* VBlank
ld a, [rLY]
cp 144
jp nc, Main
WaitVBlank2:
ld a, [rLY]
cp 144
jp c, WaitVBlank2
; Move the paddle one pixel to the right.
ld a, [_OAMRAM + 1]
inc a
ld [_OAMRAM + 1], a
jp Main
今までなにもしない無限ループだった部分を移動させるループに変更です。
Mainループで VBlankでなくなるまで待って、WaitVBlank2 でVBlankになるまで待ちます。
こうすることにより、次のVBlankまで待つことになり、表示されるのかな。
あとは X座標をインクリメントすると・・・
動きました!なるほど255になったあと、0に戻るので、左端からまたでてきます(笑)
1/60秒に一回インクリメントされるので、1秒間に60ピクセル動きます。
これを遅くするには毎回ではなくて15フレームに一回など制限させます。
SECTION "Counter", WRAM0
wFrameCounter: db
WRAM0は読み書きできる領域で、グローバル変数として利用できる感じでしょうか。
ld a, 0
ld [wFrameCounter], a
0で初期化しまして、
Main:
ld a, [rLY]
cp 144
jp nc, Main
WaitVBlank2:
ld a, [rLY]
cp 144
jp c, WaitVBlank2
ld a, [wFrameCounter]
inc a
ld [wFrameCounter], a
cp a, 15 ; Every 15 frames (a quarter of a second), run the following code
jp nz, Main
; Reset the frame counter back to 0
ld a, 0
ld [wFrameCounter], a
; Move the paddle one pixel to the right.
ld a, [_OAMRAM + 1]
inc a
ld [_OAMRAM + 1], a
jp Main
aが15になるまでMainループに戻り、15になったら、0に戻して X座標をインクリメントします。
これで遅くすることができました。cp a, 15
は cp 15
でも動きました。
余談
Qiita って動画貼れないんですね・・・。しょうがなくアニメgifに変換しました。
次回
次回はFunction(サブルーチン)です!