Added background saving to gameobject rendering
This commit is contained in:
parent
3e99f10ec7
commit
3c58aa6232
179
gameobject.s
179
gameobject.s
|
@ -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
|
||||
|
|
BIN
gscats.2mg
BIN
gscats.2mg
Binary file not shown.
15
player.s
15
player.s
|
@ -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
|
||||
|
||||
|
||||
|
|
69
projectile.s
69
projectile.s
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue