partiall working sprites

This commit is contained in:
Dagen Brock 2014-04-30 07:39:12 -05:00
parent 2590a8d2ca
commit 82a8a1b406
2 changed files with 114 additions and 208 deletions

View File

@ -1,52 +1,97 @@
BIRD_X db #$38 ; (0-79)
BIRD_Y db #$22 ; (0-47)
BIRD_X db #20 ; (0-79)
BIRD_Y db #5 ; (0-47)
BIRD_FLAP db #0 ; 0=down 1=up
DrawBird
* lda #10
* sta SPRITE_W ; all birds are same width
*
* lda BIRD_Y
* lsr
* bcs :oddHeight
*:evenHeight asl
* sta SPRITE_Y
* lda #3
* sta SPRITE_H
* lda BIRD_FLAP
* beq :flapDownEven
*:flapUpEven CopyPtr #BIRD_WUP_MAIN;SPRITE_MAIN_P
* CopyPtr #BIRD_WUP_AUX;SPRITE_AUX_P
* CopyPtr #BIRD_WUP_MASK;SPRITE_MASK_P
* CopyPtr #BIRD_WUP_IMASK;SPRITE_IMASK_P
* jmp :drawSprite
*:flapDownEven CopyPtr #BIRD_WDN_MAIN;SPRITE_MAIN_P
* CopyPtr #BIRD_WDN_AUX;SPRITE_AUX_P
* CopyPtr #BIRD_WDN_MASK;SPRITE_MASK_P
* CopyPtr #BIRD_WDN_IMASK;SPRITE_IMASK_P
* jmp :drawSprite
*:oddHeight asl
* sta SPRITE_Y
* lda #4
* sta SPRITE_H
* lda BIRD_FLAP
* beq :flapDownOdd
*:flapUpOdd CopyPtr #BIRD_WUP_O_MAIN;SPRITE_MAIN_P
* CopyPtr #BIRD_WUP_O_AUX;SPRITE_AUX_P
* CopyPtr #BIRD_WUP_O_MASK;SPRITE_MASK_P
* CopyPtr #BIRD_WUP_O_IMASK;SPRITE_IMASK_P
* jmp :drawSprite
*:flapDownOdd CopyPtr #BIRD_WDN_O_MAIN;SPRITE_MAIN_P
* CopyPtr #BIRD_WDN_O_AUX;SPRITE_AUX_P
* CopyPtr #BIRD_WDN_O_MASK;SPRITE_MASK_P
* CopyPtr #BIRD_WDN_O_IMASK;SPRITE_IMASK_P
* jmp :drawSprite
*:drawSprite
* jsr DrawSpriteC
rts
*** "Even" / base sprites
BIRD_WDN_MAIN
hex 00,50,D5,D5,D5,A5,FF,0F,F0,00
hex 55,DD,DD,5D,DD,0A,0F,00,0F,00
hex A0,5D,5D,55,50,50,00,00,00,00
hex 00,50,D5,D5,D5,A5,FF,0F,F0,00
hex 55,DD,DD,5D,DD,0A,0F,00,0F,00
hex A0,5D,5D,55,50,50,00,00,00,00
BIRD_WDN_AUX
hex 00,A0,EA,EA,EA,5A,FF,0F,F0,00
hex AA,EE,EE,AE,EE,05,0F,00,0F,00
hex 50,AE,AE,AA,A0,A0,00,00,00,00
hex 00,A0,EA,EA,EA,5A,FF,0F,F0,00
hex AA,EE,EE,AE,EE,05,0F,00,0F,00
hex 50,AE,AE,AA,A0,A0,00,00,00,00
BIRD_WDN_MASK
hex FF,0F,00,00,00,00,00,00,0F,FF
hex 00,00,00,00,00,00,00,00,00,0F
hex 00,00,00,00,00,00,F0,F0,F0,FF
hex FF,0F,00,00,00,00,00,00,0F,FF
hex 00,00,00,00,00,00,00,00,00,0F
hex 00,00,00,00,00,00,F0,F0,F0,FF
BIRD_WDN_IMASK
hex 00,F0,FF,FF,FF,FF,FF,FF,F0,00
hex FF,FF,FF,FF,FF,FF,FF,FF,FF,F0
hex FF,FF,FF,FF,FF,FF,0F,0F,0F,00
hex 00,F0,FF,FF,FF,FF,FF,FF,F0,00
hex FF,FF,FF,FF,FF,FF,FF,FF,FF,F0
hex FF,FF,FF,FF,FF,FF,0F,0F,0F,00
BIRD_WUP_MAIN
hex 00,50,D5,D5,D5,A5,FF,0F,F0,00
hex 55,D5,D5,55,DD,0A,0F,00,0F,00
hex 0A,05,50,5D,50,50,00,00,00,00
hex 00,50,D5,D5,D5,A5,FF,0F,F0,00
hex 55,D5,D5,55,DD,0A,0F,00,0F,00
hex 0A,05,50,5D,50,50,00,00,00,00
BIRD_WUP_AUX
hex 00,A0,EA,EA,EA,5A,FF,0F,F0,00
hex AA,EA,EA,AA,EE,05,0F,00,0F,00
hex 05,0A,A0,AE,A0,A0,00,00,00,00
hex 00,A0,EA,EA,EA,5A,FF,0F,F0,00
hex AA,EA,EA,AA,EE,05,0F,00,0F,00
hex 05,0A,A0,AE,A0,A0,00,00,00,00
BIRD_WUP_MASK
hex FF,0F,00,00,00,00,00,00,0F,FF
hex 00,00,00,00,00,00,00,00,00,0F
hex F0,F0,00,00,00,00,F0,F0,F0,FF
hex FF,0F,00,00,00,00,00,00,0F,FF
hex 00,00,00,00,00,00,00,00,00,0F
hex F0,F0,00,00,00,00,F0,F0,F0,FF
BIRD_WUP_IMASK
hex 00,F0,FF,FF,FF,FF,FF,FF,F0,00
hex FF,FF,FF,FF,FF,FF,FF,FF,FF,F0
hex 0F,0F,FF,FF,FF,FF,0F,0F,0F,00
hex 00,F0,FF,FF,FF,FF,FF,FF,F0,00
hex FF,FF,FF,FF,FF,FF,FF,FF,FF,F0
hex 0F,0F,FF,FF,FF,FF,0F,0F,0F,00
*** "Odd" / shifted sprites
BIRD_WUP_O_MAIN
@ -64,41 +109,41 @@ BIRD_WUP_O_AUX
BIRD_WUP_O_MASK
hex FF,FF,0F,0F,0F,0F,0F,0F,FF,FF
hex 0F,00,00,00,00,00,00,00,00,FF
hex 00,00,00,00,00,00,00,00,00,F0
hex FF,FF,F0,F0,F0,F0,FF,FF,FF,FF
hex FF,FF,0F,0F,0F,0F,0F,0F,FF,FF
hex 0F,00,00,00,00,00,00,00,00,FF
hex 00,00,00,00,00,00,00,00,00,F0
hex FF,FF,F0,F0,F0,F0,FF,FF,FF,FF
BIRD_WUP_O_IMASK
hex 00,00,F0,F0,F0,F0,F0,F0,00,00
hex F0,FF,FF,FF,FF,FF,FF,FF,FF,00
hex FF,FF,FF,FF,FF,FF,FF,FF,FF,0F
hex 00,00,0F,0F,0F,0F,00,00,00,00
hex 00,00,F0,F0,F0,F0,F0,F0,00,00
hex F0,FF,FF,FF,FF,FF,FF,FF,FF,00
hex FF,FF,FF,FF,FF,FF,FF,FF,FF,0F
hex 00,00,0F,0F,0F,0F,00,00,00,00
IRD_WDN_O_MAIN
hex 00,00,50,50,50,50,F0,F0,00,00
hex 50,D5,DD,DD,DD,AA,FF,00,FF,00
hex 05,DD,DD,55,0D,00,00,00,00,00
hex 0A,05,05,05,05,05,00,00,00,00
BIRD_WDN_O_MAIN
hex 00,00,50,50,50,50,F0,F0,00,00
hex 50,D5,DD,DD,DD,AA,FF,00,FF,00
hex 05,DD,DD,55,0D,00,00,00,00,00
hex 0A,05,05,05,05,05,00,00,00,00
BIRD_WDN_O_AUX
hex 00,00,A0,A0,A0,A0,F0,F0,00,00
hex A0,EA,EE,EE,EE,55,FF,00,FF,00
hex 0A,EE,EE,AA,0E,00,00,00,00,00
hex 05,0A,0A,0A,0A,0A,00,00,00,00
hex 00,00,A0,A0,A0,A0,F0,F0,00,00
hex A0,EA,EE,EE,EE,55,FF,00,FF,00
hex 0A,EE,EE,AA,0E,00,00,00,00,00
hex 05,0A,0A,0A,0A,0A,00,00,00,00
BIRD_WDN_O_MASK
hex FF,FF,0F,0F,0F,0F,0F,0F,FF,FF
hex 0F,00,00,00,00,00,00,00,00,FF
hex 00,00,00,00,00,00,00,00,00,F0
hex F0,F0,F0,F0,F0,F0,FF,FF,FF,FF
hex FF,FF,0F,0F,0F,0F,0F,0F,FF,FF
hex 0F,00,00,00,00,00,00,00,00,FF
hex 00,00,00,00,00,00,00,00,00,F0
hex F0,F0,F0,F0,F0,F0,FF,FF,FF,FF
BIRD_WDN_O_IMASK
hex 00,00,F0,F0,F0,F0,F0,F0,00,00
hex F0,FF,FF,FF,FF,FF,FF,FF,FF,00
hex FF,FF,FF,FF,FF,FF,FF,FF,FF,0F
hex 0F,0F,0F,0F,0F,0F,00,00,00,00
hex 00,00,F0,F0,F0,F0,F0,F0,00,00
hex F0,FF,FF,FF,FF,FF,FF,FF,FF,00
hex FF,FF,FF,FF,FF,FF,FF,FF,FF,0F
hex 0F,0F,0F,0F,0F,0F,00,00,00,00

View File

@ -31,163 +31,6 @@ Main
lda #$77
jsr DL_Clear
sec
bcs SKIP
lst on
SPRITE_X db 0
SPRITE_Y db 0
SPRITE_W db 0
SPRITE_H db 0 ; <- in bytes
SPRITE_MAIN da 0
SPRITE_AUX da 0
SPRITE_MASK da 0
SPRITE_IMASK da 0
SPRITE_COLLISION db 0
SPRITE_Y_IDX dw 0
SPRITE_X_IDX dw 0
SPRITE_SCREEN_P equz $00
SPRITE_MAIN_P equz $02
SPRITE_AUX_P equz $04
SPRITE_MASK_P equz $FA
SPRITE_IMASK_P equz $FC
SPRITE_SCREEN_IDX db 0
AUX_BG_COLOR db #$BB
MAIN_BG_COLOR db #$77
lst off
SKIP
lda BIRD_X
sta SPRITE_X
lda BIRD_Y
sta SPRITE_Y
lda #10
sta SPRITE_W
lda #3
sta SPRITE_H
CopyPtr BIRD_WDN_MAIN;SPRITE_MAIN_P
CopyPtr BIRD_WDN_AUX;SPRITE_AUX_P
CopyPtr BIRD_WDN_MASK;SPRITE_MASK_P
CopyPtr BIRD_WDN_IMASK;SPRITE_IMASK_P
jsr DrawSpriteC
sec
bcs GameLoop
** Doesn't handle odd horizontal displacement, but vertical works.
DrawSpriteC
lda SPRITE_W
lsr
sta SPRITE_W ; /2
:yLoop lda SPRITE_Y ;
lsr
asl
lda LoLineTable,y
sta SPRITE_SCREEN_P+1
lda LoLineTable+1,y
sta SPRITE_SCREEN_P
lda SPRITE_X
lsr
clc
adc SPRITE_SCREEN_P
sta SPRITE_SCREEN_P
bcc :noCarry
inc SPRITE_SCREEN_P+1
* FANCYCOLLISION ; "pixel" level
* load SCREEN,x
* and IMASK,x
* cmp BGNIB1
* beq :NOCOLLISION
* cmp BGNIB2
* beq :NOCOLLISION
* lda 1
* sta COLLISION
* bra :DRAWMASKEDPIXEL
:noCarry sta TXTPAGE2 ; start with even pixels on aux
lda #0
sta SPRITE_SCREEN_IDX
tax ;\_ x/y = 0
tay ;/
:lineLoop
lda (SPRITE_IMASK_P),y
beq :noPixel
cmp #$FF
beq :simpleCollision
lda (SPRITE_SCREEN_P),y
pha
txa
tay
pla
pha ; store one more time
and (SPRITE_IMASK_P),y
cmp #$B0
beq :noFancyCollision
cmp #$0B
beq :noFancyCollision
lda #1
sta SPRITE_COLLISION
:noFancyCollision
pla
and (SPRITE_MASK_P),y ;woops.. cut out sprite shape
ora (SPRITE_AUX_P),y
ldy SPRITE_SCREEN_IDX
sta (SPRITE_SCREEN_P),y
:simpleCollision
lda (SPRITE_SCREEN_P),y
cmp #$BB ; AUX BCG
bne :noSimpleCollision
lda #1
sta SPRITE_COLLISION
:noSimpleCollision
txa
tay
lda (SPRITE_AUX_P),y
ldy SPRITE_SCREEN_IDX
sta (SPRITE_SCREEN_P),y
:noPixel
inx
inx
inc SPRITE_SCREEN_IDX
ldy SPRITE_SCREEN_IDX
cpy SPRITE_W
bcc :lineLoop
rts
* for y
* SETLINEPTRS()
* for x
* load imask,x
* beq :NOPIXEL
*
* FANCYCOLLISION ; "pixel" level
* load SCREEN,x
* and IMASK,x
* cmp BGNIB1
* beq :NOCOLLISION
* cmp BGNIB2
* beq :NOCOLLISION
* lda 1
* sta COLLISION
* bra :DRAWMASKEDPIXEL
* SIMPLECOLLISION
* load SCREEN,x
* cmp #BGCOLOR
* beq :NOCOLLISION
* lda 1
* sta COLLISION
*:NOCOLLISION
*:DRAWMASKEDPIXEL
* load SCREEN,(IDX)X
* and MASK,x ; can I reuse (IDX)X?
* or MAIN/AUX,x
* sta SCREEN,(IDX)X
*:NOPIXEL advance ptrs
GameLoop
; handle input
@ -197,9 +40,21 @@ GameLoop
; update pipes / draw
; update player / draw (w/collision)
; update score
lda #1
sta STATE
jsr UpdatePipes
lda #2
sta STATE
jsr BirdTest
lda #3
sta STATE
;jsr DrawBird
jsr DrawScore
lda #4
sta STATE
jsr UpdateGrass
lda #5
sta STATE
jsr VBlank
*jsr WaitKey
@ -211,6 +66,9 @@ GameLoop
:noKey bpl GameLoop
lst on
STATE dw 0 ; 1=pipes, 2=bird
lst off
Quit jsr MLI ; first actual command, call ProDOS vector
dfb $65 ; with "quit" request ($65)
@ -268,6 +126,8 @@ ScoreLo db 0
ScoreHi db 0
**************************************************
* Grass
**************************************************
@ -440,3 +300,4 @@ VBlankNormal
use pipes
use bird
use numbers
use sprite ; this is getting to be a lot