INCLUDE "hardware.inc" INCLUDE "input.inc" INCLUDE "oam.inc" Section "Player Data", WRAM0 playerWorldX: dw playerWorldY: dw ; player data PLAYER_X:: db PLAYER_Y:: db PLAYER_DIR:: db Section "Player Code", ROM0 spriteData: INCBIN "png/sprite/player.2bpp" DEF SPRITE_OAM_IDX EQU 0 DEF SPRITE_IDX EQU 32 ; tile index, rename later DEF SPRITE_WIDTH EQU 2 DEF SPRITE_HEIGHT EQU 2 Player_Init:: ; clear player data ld hl, PLAYER_X ld [hl], 0 inc hl ld [hl], 144-32 inc hl ld [hl], 0 ld a, 8 ld hl, _OAM + 1 ld [hl], a ld bc, _VRAM8000 + SPRITE_IDX * 16 ld hl, spriteData ld d, 16 * (SPRITE_WIDTH * SPRITE_HEIGHT) call memcpy OAM_set SPRITE_OAM_IDX + 0, 8, 144-8-8, SPRITE_IDX, 0 OAM_set SPRITE_OAM_IDX + 1, 16, 144-8-8, SPRITE_IDX + 1, 0 OAM_set SPRITE_OAM_IDX + 2, 8, 144-8, SPRITE_IDX + 2, 0 OAM_set SPRITE_OAM_IDX + 3, 16, 144-8, SPRITE_IDX + 3, 0 ld bc, _OAMRAM ld hl, _OAM ld d, 4 * (SPRITE_WIDTH * SPRITE_HEIGHT) call memcpy ret Player_Update:: ; Only update every 2 frames ; ld hl, frame ; ld a, [hl] ; and %1 ; cp %1 ; ret nz ld hl, keys ld b, [hl] ; check for move right ld a, b and BTN_RIGHT jr z, .left ; check for right boundary ld hl, PLAYER_X ld a, [hl] add 16 cp SCRN_X jr nc, .left inc [hl] call player_bg_collides jr z, .right_rollback ld hl, PLAYER_DIR ld [hl], 0 call update_oam ret .right_rollback: ld hl, PLAYER_X dec [hl] ret .left: ; check for left button ld a, b and BTN_LEFT ret z ; check for left boundary ld hl, PLAYER_X ld a, [hl] or a ret z dec [hl] call player_bg_collides jr z, .left_rollback ld hl, PLAYER_DIR ld [hl], $ff call update_oam ret .left_rollback: ld hl, PLAYER_X dec [hl] ret ; Update player metasprite with positional data update_oam: ld hl, PLAYER_DIR ld a, [hl-] ; dir (0 = right , $ff = left) and OAMF_XFLIP ld c, a ld a, [hl-] ; y add 16 ld d, a ld a, [hl] ; x add 8 ld b, a ld a, d ld_OAM_y hl, SPRITE_OAM_IDX ; top left sprite ld [hli], a ld [hl], b inc hl ld [hl], SPRITE_IDX inc hl ld [hl], c inc hl ; top right ld d, a ld a, b add 8 ld b, a ld a, d ld [hli], a ld [hl], b inc hl ld [hl], SPRITE_IDX + 1 inc hl ld [hl], c inc hl ; bottom left add 8 ld d, a ld a, b sub 8 ld b, a ld a, d ld [hli], a ld [hl], b inc hl ld [hl], SPRITE_IDX + 2 inc hl ld [hl], c inc hl ; bottom right ld d, a ld a, b add 8 ld b, a ld a, d ld [hli], a ld [hl], b inc hl ld [hl], SPRITE_IDX + 3 inc hl ld [hl], c ; flip tile indices if necessary ld a, c or c jr z, .done ld_OAM_tile hl, SPRITE_OAM_IDX ld [hl], SPRITE_IDX + 1 ld_OAM_tile hl, SPRITE_OAM_IDX + 1 ld [hl], SPRITE_IDX ld_OAM_tile hl, SPRITE_OAM_IDX + 2 ld [hl], SPRITE_IDX + 3 ld_OAM_tile hl, SPRITE_OAM_IDX + 3 ld [hl], SPRITE_IDX + 2 .done: ret