- 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
|