You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

212 lines
3.2 KiB

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