Added background saving to gameobject rendering

This commit is contained in:
blondie7575 2017-08-26 22:34:49 -07:00
parent 3e99f10ec7
commit 3c58aa6232
4 changed files with 181 additions and 82 deletions

View File

@ -12,47 +12,123 @@ GAMEOBJECTHEIGHT = 8
gameobjectData:
.word 40 ; X pos in pixels (from left terrain edge)
.word 38 ; Y pos in pixels (from bottom terrain edge)
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Saved background
GO_POSX = 0 ; Byte offsets into gameobject data structure
GO_POSY = 2
GO_BACKGROUND = 4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; renderGameobject
; RENDER_GAMEOBJECT
;
; PARAML0 = Pointer to gameobject data
; ptr = Pointer to gameobject data
; Trashes SCRATCHL
;
renderGameobject:
.macro RENDER_GAMEOBJECT ptr
.scope
SAVE_AXY
; Find gameobject location in video memory
ldy #0
; X
lda (PARAML0),y
lda ptr+GO_POSX,y
lsr
sec
sbc leftScreenEdge
bmi renderGameobjectDone ; Gameobject is off left edge of screen
bmi renderGameobjectSkip ; Gameobject is off left edge of screen
cmp #320 - GAMEOBJECTWIDTH
bpl renderGameobjectDone ; Gameobject is off right edge of screen
bpl renderGameobjectSkip ; Gameobject is off right edge of screen
sta SCRATCHL
; Y
iny
iny
sec
lda #200
sbc (PARAML0),y
bmi renderGameobjectDone ; Gameobject is off top edge of screen
sbc ptr+GO_POSY,y
bmi renderGameobjectSkip ; Gameobject is off top edge of screen
cmp #200 - GAMEOBJECTHEIGHT
bpl renderGameobjectDone ; Gameobject is off bottom edge of screen
bpl renderGameobjectSkip ; Gameobject is off bottom edge of screen
asl
tax
lda vramYOffset,x
clc
adc SCRATCHL
tax
tax ; X now contains the VRAM offset of the upper left corner
phx
bra renderGameobjectBackground
; X now contains the VRAM offset of the upper left corner
renderGameobjectSkip:
jmp renderGameobjectDone
renderGameobjectBackground:
; Save background
lda VRAM,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+2,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160+2,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*2,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*2+2,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*3,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*3+2,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*4,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*4+2,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*5,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*5+2,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*6,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*6+2,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*7,x
sta ptr+GO_BACKGROUND,y
iny
iny
lda VRAM+160*7+2,x
sta ptr+GO_BACKGROUND,y
plx
; Draw sprite
lda #$FFFF
sta VRAM,x
sta VRAM+2,x
@ -73,66 +149,105 @@ renderGameobject:
renderGameobjectDone:
RESTORE_AXY
rts
.endscope
.endmacro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; unrenderGameobject
; UNRENDER_GAMEOBJECT
;
; PARAML0 = Pointer to gameobject data
; ptr = Pointer to gameobject data
; Trashes SCRATCHL
;
unrenderGameobject:
.macro UNRENDER_GAMEOBJECT ptr
.scope
SAVE_AXY
; Find gameobject location in video memory
ldy #0
; X
lda (PARAML0),y
lda ptr+GO_POSX,y
lsr
sec
sbc leftScreenEdge
bmi unrenderGameobjectDone ; Gameobject is off left edge of screen
cmp #320 - GAMEOBJECTWIDTH
bpl unrenderGameobjectDone ; Gameobject is off right edge of screen
sta SCRATCHL
; Y
iny
iny
sec
lda #200
sbc (PARAML0),y
bmi unrenderGameobjectDone ; Gameobject is off top edge of screen
cmp #200 - GAMEOBJECTHEIGHT
bpl unrenderGameobjectDone ; Gameobject is off bottom edge of screen
sbc ptr+GO_POSY,y
asl
tax
lda vramYOffset,x
clc
adc SCRATCHL
tax
tax ; X now contains the VRAM offset of the upper left corner
; X now contains the VRAM offset of the upper left corner
lda #$0000
lda ptr+GO_BACKGROUND,y
sta VRAM,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+2,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160+2,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*2,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*2+2,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*3,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*3+2,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*4,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*4+2,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*5,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*5+2,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*6,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*6+2,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*7,x
iny
iny
lda ptr+GO_BACKGROUND,y
sta VRAM+160*7+2,x
unrenderGameobjectDone:
RESTORE_AXY
rts
.endscope
.endmacro

Binary file not shown.

View File

@ -10,14 +10,13 @@ playerData:
; gameobject data
.word 40 ; X pos in pixels (from left terrain edge)
.word 38 ; Y pos in pixels (from bottom terrain edge)
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Saved background
.word 45 ; Angle in degrees from +X
.word 50 ; Power
PD_POSX = 0 ; Byte offsets into player data structure
PD_POSY = 2
PD_ANGLE = 4
PD_POWER = 6
PD_ANGLE = 36
PD_POWER = 38
.macro PLAYERPTR_Y
tya ; Pointer to player structure from index
@ -68,9 +67,9 @@ playerFire:
SAVE_AY
PLAYERPTR_Y
lda playerData+PD_POSX,y
lda playerData+GO_POSX,y
sta projectileParams
lda playerData+PD_POSY,y
lda playerData+GO_POSY,y
clc
adc #GAMEOBJECTHEIGHT
sta projectileParams+2
@ -89,9 +88,7 @@ playerFire:
;
;
renderPlayers:
lda #playerData
sta PARAML0
jsr renderGameobject
RENDER_GAMEOBJECT playerData
rts

View File

@ -7,29 +7,26 @@
projectileData:
; gameobject data
; gameobject data (we're a subclass, effectively)
.word -1 ; Pos X in pixels (from left terrain edge)
.word 0 ; Pos Y in pixels (from bottom terrain edge)
.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Saved background
.word 0 ; Pos X (12.4 fixed point)
.word 0 ; Pos Y (12.4 fixed point)
.word 0 ; Velocity X (8.8 fixed point)
.word 0 ; Velocity Y (8.8 fixed point)
.word 0,0 ; Padding
JD_POSX = 0 ; Byte offsets into projectile data structure
JD_POSY = 2
JD_PRECISEX = 4
JD_PRECISEY = 6
JD_VX = 8
JD_VY = 10
JD_PRECISEX = 36 ; Byte offsets into projectile data structure
JD_PRECISEY = 38
JD_VX = 40
JD_VY = 42
GRAVITY = $ffff ; 8.8 fixed point
.macro PROJECTILEPTR_Y
tya ; Pointer to projectil structure from index
tya ; Pointer to projectile structure from index
asl
asl
asl
@ -55,50 +52,39 @@ fireProjectile:
SAVE_AXY
; Set up projectile structure
ldy #0
lda #projectileData ; Only one active at a time for now
sta SCRATCHL
ldy #0 ; Only one active at a time for now
PROJECTILEPTR_Y
lda projectileParams ; X pos
sta (SCRATCHL),y
iny
iny
sta projectileData+GO_POSX,y
lda projectileParams+2 ; Y pos
sta (SCRATCHL),y
iny
iny
sta projectileData+GO_POSY,y
lda projectileParams ; Fixed point version of X pos
asl
asl
asl
asl
sta (SCRATCHL),y
iny
iny
sta projectileData+JD_PRECISEX,y
lda projectileParams+2 ; Fixed point version of Y pos
asl
asl
asl
asl
sta (SCRATCHL),y
iny
iny
sta projectileData+JD_PRECISEY,y
lda projectileParams+4 ; Convert angle to vector
asl
tax
lda angleToVectorX,x ; Velocity X
sta (SCRATCHL),y
iny
iny
sta projectileData+JD_VX,y
lda projectileParams+4 ; Convert angle to vector
asl
tax
lda angleToVectorY,x ; Velocity Y
sta (SCRATCHL),y
sta projectileData+JD_VY,y
RESTORE_AXY
rts
@ -111,7 +97,7 @@ fireProjectile:
;
updateProjectiles:
SAVE_AY
lda projectileData+JD_POSX
lda projectileData+GO_POSX
bmi updateProjectilesDone
; Integrate gravity over velocity
@ -140,7 +126,7 @@ updateProjectiles:
lsr
lsr
lsr
sta projectileData+JD_POSX
sta projectileData+GO_POSX
bmi updateProjectilesDelete
cmp #TERRAINWIDTH-GAMEOBJECTWIDTH-1
bpl updateProjectilesDelete
@ -165,7 +151,8 @@ updateProjectiles:
lsr
lsr
lsr
sta projectileData+JD_POSY
sta projectileData+GO_POSY
cmp #GAMEOBJECTHEIGHT-1
bmi updateProjectilesDelete
cmp #201
bpl updateProjectilesDelete
@ -189,7 +176,7 @@ updateProjectilesDelete:
deleteProjectile:
PROJECTILEPTR_Y
lda #-1
sta projectileData+JD_POSX,y
sta projectileData+GO_POSX,y
rts
@ -200,11 +187,11 @@ deleteProjectile:
renderProjectiles:
pha
lda projectileData
bmi renderProjectilesDone
bpl renderProjectilesDoIt
jmp renderProjectilesDone
lda #projectileData
sta PARAML0
jsr renderGameobject
renderProjectilesDoIt:
RENDER_GAMEOBJECT projectileData
renderProjectilesDone:
pla
@ -218,11 +205,11 @@ renderProjectilesDone:
unrenderProjectiles:
pha
lda projectileData
bmi unrenderProjectilesDone
bpl unrenderProjectilesDoIt
jmp unrenderProjectilesDone
lda #projectileData
sta PARAML0
jsr unrenderGameobject
unrenderProjectilesDoIt:
UNRENDER_GAMEOBJECT projectileData
unrenderProjectilesDone:
pla