mirror of
https://github.com/lscharen/iigs-game-engine.git
synced 2025-01-22 00:31:44 +00:00
Fix single-step vertical displacement issue
This commit is contained in:
parent
dec50bc6fc
commit
cde517bcc9
@ -203,10 +203,10 @@ SPRITE_VFLIP equ $0400
|
|||||||
SPRITE_HFLIP equ $0200
|
SPRITE_HFLIP equ $0200
|
||||||
|
|
||||||
; Stamp storage parameters
|
; Stamp storage parameters
|
||||||
VBUFF_STRIDE_BYTES equ 12*4 ; Each line has 4 slots of 16 pixels + 8 buffer pixels
|
VBUFF_STRIDE_BYTES equ {12*4} ; Each line has 4 slots of 16 pixels + 8 buffer pixels
|
||||||
VBUFF_TILE_ROW_BYTES equ 8*VBUFF_STRIDE_BYTES ; Each row is comprised of 8 lines
|
VBUFF_TILE_ROW_BYTES equ {8*VBUFF_STRIDE_BYTES} ; Each row is comprised of 8 lines
|
||||||
VBUFF_TILE_COL_BYTES equ 4
|
VBUFF_TILE_COL_BYTES equ 4
|
||||||
VBUFF_SPRITE_STEP equ VBUFF_TILE_ROW_BYTES*3 ; Allocate space fo 16 rows + 8 rows of buffer
|
VBUFF_SPRITE_STEP equ {VBUFF_TILE_ROW_BYTES*3} ; Allocate space fo 16 rows + 8 rows of buffer
|
||||||
VBUFF_SPRITE_START equ {8*VBUFF_TILE_ROW_BYTES}+4 ; Start at an offset so $0000 can be used as an empty value
|
VBUFF_SPRITE_START equ {8*VBUFF_TILE_ROW_BYTES}+4 ; Start at an offset so $0000 can be used as an empty value
|
||||||
VBUFF_SLOT_COUNT equ 48 ; Have space for this many stamps
|
VBUFF_SLOT_COUNT equ 48 ; Have space for this many stamps
|
||||||
|
|
||||||
|
56
src/Sprite.s
56
src/Sprite.s
@ -150,6 +150,11 @@ _DoPhase1
|
|||||||
lda #SPRITE_STATUS_EMPTY ; Mark as empty so no error if we try to Add a sprite here again
|
lda #SPRITE_STATUS_EMPTY ; Mark as empty so no error if we try to Add a sprite here again
|
||||||
sta _Sprites+SPRITE_STATUS,y
|
sta _Sprites+SPRITE_STATUS,y
|
||||||
|
|
||||||
|
lda _Sprites+TS_COVERAGE_SIZE,y ; Manually copy current value to old
|
||||||
|
sta _Sprites+OLD_TS_COVERAGE_SIZE,y
|
||||||
|
lda _Sprites+TS_LOOKUP_INDEX,y
|
||||||
|
sta _Sprites+OLD_TS_LOOKUP_INDEX,y
|
||||||
|
|
||||||
jmp _ClearSpriteFromTileStore ; Clear the tile flags, add to the dirty tile list and done
|
jmp _ClearSpriteFromTileStore ; Clear the tile flags, add to the dirty tile list and done
|
||||||
|
|
||||||
; Need to calculate new VBUFF information. The could be required for UPDATED, ADDED or MOVED
|
; Need to calculate new VBUFF information. The could be required for UPDATED, ADDED or MOVED
|
||||||
@ -158,15 +163,26 @@ _DoPhase1
|
|||||||
jsr _CalcDirtySprite
|
jsr _CalcDirtySprite
|
||||||
|
|
||||||
; If the sprite is marked as ADDED, then it does not need to have its old tile locations cleared
|
; If the sprite is marked as ADDED, then it does not need to have its old tile locations cleared
|
||||||
|
|
||||||
lda tmpA
|
lda tmpA
|
||||||
bit #SPRITE_STATUS_ADDED
|
bit #SPRITE_STATUS_ADDED
|
||||||
bne :no_move
|
bne :no_move
|
||||||
jsr _ClearSpriteFromTileStore
|
|
||||||
|
; If the sprite was not ADDED and also not MOVED, then there is no reason to erase the old tiles
|
||||||
|
; because they will be overwritten anyway.
|
||||||
|
|
||||||
|
bit #SPRITE_STATUS_MOVED
|
||||||
|
beq :no_move
|
||||||
|
|
||||||
|
; jsr _ClearSpriteFromTileStore
|
||||||
ldy tmpY
|
ldy tmpY
|
||||||
|
|
||||||
; Anything else (MOVED, UPDATED, ADDED) will need to have the VBUFF information updated and the
|
; Anything else (MOVED, UPDATED, ADDED) will need to have the VBUFF information updated and the
|
||||||
; current tiles marked for update
|
; current tiles marked for update
|
||||||
:no_move
|
:no_move
|
||||||
|
lda #SPRITE_STATUS_OCCUPIED ; Clear the dirty bits (ADDED, UPDATED, MOVED)
|
||||||
|
sta _Sprites+SPRITE_STATUS,y
|
||||||
|
|
||||||
jmp _MarkDirtySpriteTiles
|
jmp _MarkDirtySpriteTiles
|
||||||
|
|
||||||
; Dispatch table. It's unintersting, so it's tucked out of the way
|
; Dispatch table. It's unintersting, so it's tucked out of the way
|
||||||
@ -341,7 +357,7 @@ next
|
|||||||
_ClearSpriteFromTileStore
|
_ClearSpriteFromTileStore
|
||||||
lda _SpriteBitsNot,y ; Cache this value in a direct page location
|
lda _SpriteBitsNot,y ; Cache this value in a direct page location
|
||||||
sta tmp0
|
sta tmp0
|
||||||
ldx _Sprites+TS_COVERAGE_SIZE,y
|
ldx _Sprites+OLD_TS_COVERAGE_SIZE,y
|
||||||
jmp (csfts_tbl,x)
|
jmp (csfts_tbl,x)
|
||||||
csfts_tbl dw csfts_1x1,csfts_1x2,csfts_1x3,csfts_out
|
csfts_tbl dw csfts_1x1,csfts_1x2,csfts_1x3,csfts_out
|
||||||
dw csfts_2x1,csfts_2x2,csfts_2x3,csfts_out
|
dw csfts_2x1,csfts_2x2,csfts_2x3,csfts_out
|
||||||
@ -350,66 +366,66 @@ csfts_tbl dw csfts_1x1,csfts_1x2,csfts_1x3,csfts_out
|
|||||||
|
|
||||||
csfts_out rts
|
csfts_out rts
|
||||||
|
|
||||||
csfts_3x3 ldx _Sprites+TS_LOOKUP_INDEX,y
|
csfts_3x3 ldx _Sprites+OLD_TS_LOOKUP_INDEX,y
|
||||||
TSClearSprite 0
|
TSClearSprite 0
|
||||||
TSClearSprite 2
|
TSClearSprite 2
|
||||||
TSClearSprite 4
|
TSClearSprite 4
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+0
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+2
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+2
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+4
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+4
|
||||||
TSClearSprite 2*{TS_LOOKUP_SPAN*2}
|
TSClearSprite 2*{TS_LOOKUP_SPAN*2}+0
|
||||||
TSClearSprite 2*{TS_LOOKUP_SPAN*2}+2
|
TSClearSprite 2*{TS_LOOKUP_SPAN*2}+2
|
||||||
TSClearSprite 2*{TS_LOOKUP_SPAN*2}+4
|
TSClearSprite 2*{TS_LOOKUP_SPAN*2}+4
|
||||||
rts
|
rts
|
||||||
|
|
||||||
csfts_3x2 ldx _Sprites+TS_LOOKUP_INDEX,y
|
csfts_3x2 ldx _Sprites+OLD_TS_LOOKUP_INDEX,y
|
||||||
TSClearSprite 0
|
TSClearSprite 0
|
||||||
TSClearSprite 2
|
TSClearSprite 2
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+0
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+2
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+2
|
||||||
TSClearSprite 2*{TS_LOOKUP_SPAN*2}
|
TSClearSprite 2*{TS_LOOKUP_SPAN*2}+0
|
||||||
TSClearSprite 2*{TS_LOOKUP_SPAN*2}+2
|
TSClearSprite 2*{TS_LOOKUP_SPAN*2}+2
|
||||||
rts
|
rts
|
||||||
|
|
||||||
csfts_3x1 ldx _Sprites+TS_LOOKUP_INDEX,y
|
csfts_3x1 ldx _Sprites+OLD_TS_LOOKUP_INDEX,y
|
||||||
TSClearSprite 0
|
TSClearSprite 0
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+0
|
||||||
TSClearSprite 2*{TS_LOOKUP_SPAN*2}
|
TSClearSprite 2*{TS_LOOKUP_SPAN*2}+0
|
||||||
rts
|
rts
|
||||||
|
|
||||||
csfts_2x3 ldx _Sprites+TS_LOOKUP_INDEX,y
|
csfts_2x3 ldx _Sprites+OLD_TS_LOOKUP_INDEX,y
|
||||||
TSClearSprite 0
|
TSClearSprite 0
|
||||||
TSClearSprite 2
|
TSClearSprite 2
|
||||||
TSClearSprite 4
|
TSClearSprite 4
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+0
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+2
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+2
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+4
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+4
|
||||||
rts
|
rts
|
||||||
|
|
||||||
csfts_2x2 ldx _Sprites+TS_LOOKUP_INDEX,y
|
csfts_2x2 ldx _Sprites+OLD_TS_LOOKUP_INDEX,y
|
||||||
TSClearSprite 0
|
TSClearSprite 0
|
||||||
TSClearSprite 2
|
TSClearSprite 2
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+0
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+2
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+2
|
||||||
rts
|
rts
|
||||||
|
|
||||||
csfts_2x1 ldx _Sprites+TS_LOOKUP_INDEX,y
|
csfts_2x1 ldx _Sprites+OLD_TS_LOOKUP_INDEX,y
|
||||||
TSClearSprite 0
|
TSClearSprite 0
|
||||||
TSClearSprite 1*{TS_LOOKUP_SPAN*2}
|
TSClearSprite 1*{TS_LOOKUP_SPAN*2}+0
|
||||||
rts
|
rts
|
||||||
|
|
||||||
csfts_1x3 ldx _Sprites+TS_LOOKUP_INDEX,y
|
csfts_1x3 ldx _Sprites+OLD_TS_LOOKUP_INDEX,y
|
||||||
TSClearSprite 0
|
TSClearSprite 0
|
||||||
TSClearSprite 2
|
TSClearSprite 2
|
||||||
TSClearSprite 4
|
TSClearSprite 4
|
||||||
rts
|
rts
|
||||||
|
|
||||||
csfts_1x2 ldx _Sprites+TS_LOOKUP_INDEX,y
|
csfts_1x2 ldx _Sprites+OLD_TS_LOOKUP_INDEX,y
|
||||||
TSClearSprite 0
|
TSClearSprite 0
|
||||||
TSClearSprite 2
|
TSClearSprite 2
|
||||||
rts
|
rts
|
||||||
|
|
||||||
csfts_1x1 ldx _Sprites+TS_LOOKUP_INDEX,y
|
csfts_1x1 ldx _Sprites+OLD_TS_LOOKUP_INDEX,y
|
||||||
TSClearSprite 0
|
TSClearSprite 0
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ _CalcDirtySprite
|
|||||||
bne mdsOut2
|
bne mdsOut2
|
||||||
|
|
||||||
; Copy the current values into the old value slots
|
; Copy the current values into the old value slots
|
||||||
|
|
||||||
lda _Sprites+TS_COVERAGE_SIZE,y
|
lda _Sprites+TS_COVERAGE_SIZE,y
|
||||||
sta _Sprites+OLD_TS_COVERAGE_SIZE,y
|
sta _Sprites+OLD_TS_COVERAGE_SIZE,y
|
||||||
lda _Sprites+TS_LOOKUP_INDEX,y
|
lda _Sprites+TS_LOOKUP_INDEX,y
|
||||||
@ -173,7 +174,15 @@ _MarkDirtySpriteTiles
|
|||||||
dw :mark3x1,:mark3x2,:mark3x3,mdsOut
|
dw :mark3x1,:mark3x2,:mark3x3,mdsOut
|
||||||
dw mdsOut,mdsOut,mdsOut,mdsOut
|
dw mdsOut,mdsOut,mdsOut,mdsOut
|
||||||
|
|
||||||
:vbuff_mul dw 0,52,104,156,208,260,312,364
|
:vbuff_mul
|
||||||
|
dw 0*VBUFF_STRIDE_BYTES
|
||||||
|
dw 1*VBUFF_STRIDE_BYTES
|
||||||
|
dw 2*VBUFF_STRIDE_BYTES
|
||||||
|
dw 3*VBUFF_STRIDE_BYTES
|
||||||
|
dw 4*VBUFF_STRIDE_BYTES
|
||||||
|
dw 5*VBUFF_STRIDE_BYTES
|
||||||
|
dw 6*VBUFF_STRIDE_BYTES
|
||||||
|
dw 7*VBUFF_STRIDE_BYTES
|
||||||
|
|
||||||
; Pair of macros to make the unrolled loop more concise
|
; Pair of macros to make the unrolled loop more concise
|
||||||
;
|
;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user