cleaned up animation code + fixed frame 0 bug
This commit is contained in:
parent
fa65a2b0b2
commit
88ad5534c3
@ -7,8 +7,8 @@
|
||||
bytes 1, XPos
|
||||
bytes 1, GFXCounter
|
||||
bytes 1, GFXState
|
||||
words 1, GFXData
|
||||
bytes 1, TileData
|
||||
words 1, GFXData
|
||||
end_struct
|
||||
|
||||
SECTION "Actor STructs", WRAM0
|
||||
@ -28,7 +28,6 @@ hWorkingState: db
|
||||
hWorkingCounter: db
|
||||
hWorkingData: dw
|
||||
hWorkingTile: db
|
||||
hWorkingEnd:
|
||||
|
||||
SECTION "Animations Subs", ROM0
|
||||
|
||||
@ -47,82 +46,74 @@ SECTION "Animations Subs", ROM0
|
||||
RenderActor::
|
||||
; @input: hl <- Player
|
||||
; @input: de <- ShadowOAM place
|
||||
; clobbers af, bc, de, hl
|
||||
|
||||
ld a, [hli] ; a <- YPos
|
||||
ldh [hWorkingScreenY], a
|
||||
ld a, [hli] ; a <- XPos
|
||||
ldh [hWorkingScreenX], a
|
||||
push hl
|
||||
push hl ; save counter pointer on stack
|
||||
ld a, [hli] ; a <- GFXCounter
|
||||
ldh [hWorkingCounter], a
|
||||
ld a, [hli] ; a <- GFXState
|
||||
ldh [hWorkingState], a
|
||||
ld a, [hli] ; a <- GFXData(Low)
|
||||
ldh [hWorkingData+1], a
|
||||
ld a, [hli] ; a <- GFXData (High)
|
||||
ldh [hWorkingData], a
|
||||
ld a, [hl] ; a <- TileData
|
||||
ld a, [hli] ; a <- TileData
|
||||
ldh [hWorkingTile], a
|
||||
; fin loading data
|
||||
ld a, [hWorkingData]
|
||||
ld a, [hli] ; a <- GFXData(Low)
|
||||
ld h, [hl] ; a <- GFXData (High)
|
||||
ld l, a
|
||||
ld a, [hWorkingData+1]
|
||||
ld h, a
|
||||
; add actor struct offset saved in wWorkingState
|
||||
ld a, [hWorkingState]
|
||||
|
||||
ld a, [hWorkingState] ; add actor struct offset saved in wWorkingState
|
||||
rlca ; double state offset because of word length
|
||||
add a, l
|
||||
ld l, a
|
||||
adc a, h
|
||||
sub l
|
||||
ld h, a ; hl contains state struct pointer
|
||||
ld a, [hli]
|
||||
ld b, a
|
||||
ld a, [hl]
|
||||
ld l, b
|
||||
ld h, a
|
||||
ld a, [hli] ; a <- state frame limit
|
||||
ld b, a
|
||||
|
||||
ld a, [hli] ;
|
||||
ld h, [hl] ; derefence [hl]
|
||||
ld l, a ;
|
||||
|
||||
ld a, [hWorkingCounter]
|
||||
inc a
|
||||
ld c, a
|
||||
ld a, b
|
||||
ld b, c
|
||||
ld b, a
|
||||
ld a, [hli] ; a <- state frame limit
|
||||
cp b
|
||||
ld a, b
|
||||
jr nc, .continueAnimation
|
||||
xor a
|
||||
.continueAnimation
|
||||
; TODO: make counter 0 indexed so doesnt skip first frame
|
||||
ldh [hWorkingCounter], a
|
||||
ld b, h
|
||||
ld c, l
|
||||
pop hl
|
||||
ld [hl], a
|
||||
ld h, b
|
||||
ld l, c
|
||||
.loopFrameFind
|
||||
ld b, a ; b <- current frame count
|
||||
ld a, [hli] ; a <- next frame block
|
||||
ld c, a
|
||||
ld a, b
|
||||
ld b, c
|
||||
sub b
|
||||
jr z, .foundFrame
|
||||
jr c, .foundFrame
|
||||
ld b, h ;
|
||||
ld c, l ; save current hl
|
||||
pop hl ; restore counter wram pointer
|
||||
ld [hl], a ;
|
||||
ld h, b ; restore hl
|
||||
ld l, c ;
|
||||
|
||||
ld c, a ; save current frame in c
|
||||
xor a ; set a = 0
|
||||
.loopFrameFind ;
|
||||
ld b, a ; b <- current total
|
||||
ld a, [hli] ; a <- next frame tick limit
|
||||
add b ; add to limit
|
||||
cp c ; compare to limit
|
||||
jr nc, .foundFrame ; if no carry, cum total > current frame
|
||||
inc hl
|
||||
inc hl
|
||||
jr .loopFrameFind
|
||||
|
||||
.foundFrame
|
||||
ld a, [hli]
|
||||
ld b, a
|
||||
ld a, [hl]
|
||||
ld h, a
|
||||
ld l, b ; hl <- pointer to frame data
|
||||
ld h, [hl]
|
||||
ld l, a ; hl <- pointer to frame data
|
||||
ld a, [hli]
|
||||
ld b, a ; b <- sprite counter
|
||||
|
||||
.spriteLoop
|
||||
; load Y position, then offset by -16
|
||||
ld a, [hli]
|
||||
|
||||
ld a, [hli] ; load Y position, then offset by -16
|
||||
ld c, a
|
||||
ld a, [hWorkingScreenY]
|
||||
add c
|
||||
@ -130,34 +121,30 @@ RenderActor::
|
||||
add c
|
||||
ld [de], a ; store YPos in shadowOAM
|
||||
inc de
|
||||
; load X position, then offset by -8
|
||||
ld a, [hli]
|
||||
|
||||
ld a, [hli] ; load X position, then offset by -8
|
||||
ld c, a
|
||||
ld a, [hWorkingScreenX]
|
||||
add c
|
||||
ld c, 8
|
||||
add c
|
||||
ld [de], a ; store YPos in shadowOAM
|
||||
ld [de], a ; store XPos in shadowOAM
|
||||
inc de
|
||||
; load tile offset, and add to base tile pointer
|
||||
ld a, [hli]
|
||||
|
||||
ld a, [hli] ; load tile offset, and add to base tile pointer
|
||||
ld c, a
|
||||
ld a, [hWorkingTile]
|
||||
add c
|
||||
ld [de], a
|
||||
inc de
|
||||
; load attributes and xor them
|
||||
ld a, [hli]
|
||||
|
||||
ld a, [hli] ; load attributes and xor them
|
||||
ld c, a
|
||||
ld a, 0 ; TO DO: set base attributes
|
||||
xor c
|
||||
ld [de], a
|
||||
inc de
|
||||
; end of single sprite
|
||||
dec b
|
||||
|
||||
dec b ; end of single sprite
|
||||
jr nz, .spriteLoop
|
||||
ret
|
||||
|
||||
BUFFER EQU 160
|
||||
TRUE EQU $42
|
||||
FALSE EQU $69
|
||||
|
@ -33,14 +33,15 @@ Start:
|
||||
ld [Player_YPos], a
|
||||
ld a, 80
|
||||
ld [Player_XPos], a
|
||||
xor a
|
||||
ld a, $FF
|
||||
ld [Player_GFXCounter], a
|
||||
xor a
|
||||
ld [Player_GFXState], a
|
||||
ld [Player_TileData], a
|
||||
ld a, HIGH(ActorROM)
|
||||
ld [Player_GFXData], a
|
||||
ld [Player_GFXData+1], a
|
||||
ld a, LOW(ActorROM)
|
||||
ld [Player_GFXData + 1], a
|
||||
ld [Player_GFXData], a
|
||||
|
||||
ld a, LCDCF_ON | LCDCF_OBJON | LCDCF_BGON
|
||||
ld [rLCDC], a
|
||||
|
Loading…
Reference in New Issue
Block a user