cleaned up animation code + fixed frame 0 bug

This commit is contained in:
Thorn Avery 2020-05-28 15:12:01 +12:00
parent fa65a2b0b2
commit 88ad5534c3
2 changed files with 59 additions and 71 deletions

View File

@ -7,8 +7,8 @@
bytes 1, XPos bytes 1, XPos
bytes 1, GFXCounter bytes 1, GFXCounter
bytes 1, GFXState bytes 1, GFXState
words 1, GFXData
bytes 1, TileData bytes 1, TileData
words 1, GFXData
end_struct end_struct
SECTION "Actor STructs", WRAM0 SECTION "Actor STructs", WRAM0
@ -28,7 +28,6 @@ hWorkingState: db
hWorkingCounter: db hWorkingCounter: db
hWorkingData: dw hWorkingData: dw
hWorkingTile: db hWorkingTile: db
hWorkingEnd:
SECTION "Animations Subs", ROM0 SECTION "Animations Subs", ROM0
@ -47,117 +46,105 @@ SECTION "Animations Subs", ROM0
RenderActor:: RenderActor::
; @input: hl <- Player ; @input: hl <- Player
; @input: de <- ShadowOAM place ; @input: de <- ShadowOAM place
ld a, [hli] ; a <- YPos ; clobbers af, bc, de, hl
ld a, [hli] ; a <- YPos
ldh [hWorkingScreenY], a ldh [hWorkingScreenY], a
ld a, [hli] ; a <- XPos ld a, [hli] ; a <- XPos
ldh [hWorkingScreenX], a ldh [hWorkingScreenX], a
push hl push hl ; save counter pointer on stack
ld a, [hli] ; a <- GFXCounter ld a, [hli] ; a <- GFXCounter
ldh [hWorkingCounter], a ldh [hWorkingCounter], a
ld a, [hli] ; a <- GFXState ld a, [hli] ; a <- GFXState
ldh [hWorkingState], a ldh [hWorkingState], a
ld a, [hli] ; a <- GFXData(Low) ld a, [hli] ; a <- TileData
ldh [hWorkingData+1], a
ld a, [hli] ; a <- GFXData (High)
ldh [hWorkingData], a
ld a, [hl] ; a <- TileData
ldh [hWorkingTile], a ldh [hWorkingTile], a
; fin loading data ld a, [hli] ; a <- GFXData(Low)
ld a, [hWorkingData] ld h, [hl] ; a <- GFXData (High)
ld l, a ld l, a
ld a, [hWorkingData+1]
ld h, a ld a, [hWorkingState] ; add actor struct offset saved in wWorkingState
; add actor struct offset saved in wWorkingState rlca ; double state offset because of word length
ld a, [hWorkingState]
rlca ; double state offset because of word length
add a, l add a, l
ld l, a ld l, a
adc a, h adc a, h
sub l sub l
ld h, a ; hl contains state struct pointer ld h, a ; hl contains state struct pointer
ld a, [hli]
ld b, a ld a, [hli] ;
ld a, [hl] ld h, [hl] ; derefence [hl]
ld l, b ld l, a ;
ld h, a
ld a, [hli] ; a <- state frame limit
ld b, a
ld a, [hWorkingCounter] ld a, [hWorkingCounter]
inc a inc a
ld c, a ld b, a
ld a, b ld a, [hli] ; a <- state frame limit
ld b, c
cp b cp b
ld a, b ld a, b
jr nc, .continueAnimation jr nc, .continueAnimation
xor a xor a
.continueAnimation .continueAnimation
; TODO: make counter 0 indexed so doesnt skip first frame
ldh [hWorkingCounter], a ldh [hWorkingCounter], a
ld b, h ld b, h ;
ld c, l ld c, l ; save current hl
pop hl pop hl ; restore counter wram pointer
ld [hl], a ld [hl], a ;
ld h, b ld h, b ; restore hl
ld l, c ld l, c ;
.loopFrameFind
ld b, a ; b <- current frame count ld c, a ; save current frame in c
ld a, [hli] ; a <- next frame block xor a ; set a = 0
ld c, a .loopFrameFind ;
ld a, b ld b, a ; b <- current total
ld b, c ld a, [hli] ; a <- next frame tick limit
sub b add b ; add to limit
jr z, .foundFrame cp c ; compare to limit
jr c, .foundFrame jr nc, .foundFrame ; if no carry, cum total > current frame
inc hl inc hl
inc hl inc hl
jr .loopFrameFind jr .loopFrameFind
.foundFrame .foundFrame
ld a, [hli] ld a, [hli]
ld b, a ld h, [hl]
ld a, [hl] ld l, a ; hl <- pointer to frame data
ld h, a
ld l, b ; hl <- pointer to frame data
ld a, [hli] ld a, [hli]
ld b, a ; b <- sprite counter ld b, a ; b <- sprite counter
.spriteLoop .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 c, a
ld a, [hWorkingScreenY] ld a, [hWorkingScreenY]
add c add c
ld c, 16 ld c, 16
add c add c
ld [de], a ; store YPos in shadowOAM ld [de], a ; store YPos in shadowOAM
inc de 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 c, a
ld a, [hWorkingScreenX] ld a, [hWorkingScreenX]
add c add c
ld c, 8 ld c, 8
add c add c
ld [de], a ; store YPos in shadowOAM ld [de], a ; store XPos in shadowOAM
inc de 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 c, a
ld a, [hWorkingTile] ld a, [hWorkingTile]
add c add c
ld [de], a ld [de], a
inc de inc de
; load attributes and xor them
ld a, [hli] ld a, [hli] ; load attributes and xor them
ld c, a ld c, a
ld a, 0 ; TO DO: set base attributes ld a, 0 ; TO DO: set base attributes
xor c xor c
ld [de], a ld [de], a
inc de inc de
; end of single sprite
dec b dec b ; end of single sprite
jr nz, .spriteLoop jr nz, .spriteLoop
ret ret
BUFFER EQU 160
TRUE EQU $42
FALSE EQU $69

View File

@ -33,14 +33,15 @@ Start:
ld [Player_YPos], a ld [Player_YPos], a
ld a, 80 ld a, 80
ld [Player_XPos], a ld [Player_XPos], a
xor a ld a, $FF
ld [Player_GFXCounter], a ld [Player_GFXCounter], a
xor a
ld [Player_GFXState], a ld [Player_GFXState], a
ld [Player_TileData], a ld [Player_TileData], a
ld a, HIGH(ActorROM) ld a, HIGH(ActorROM)
ld [Player_GFXData], a ld [Player_GFXData+1], a
ld a, LOW(ActorROM) ld a, LOW(ActorROM)
ld [Player_GFXData + 1], a ld [Player_GFXData], a
ld a, LCDCF_ON | LCDCF_OBJON | LCDCF_BGON ld a, LCDCF_ON | LCDCF_OBJON | LCDCF_BGON
ld [rLCDC], a ld [rLCDC], a