Da ich nicht weiß, wie man einen Custom Sprite kurz nach seinem Tod wieder auf dem Bildschirm erscheinen lassen kann (z. B. Lakitu, Boss Bass), habe ich mich eines Custom Sprite Generators bedient und ihn entsprechend umfunktioniert. Hier der Code:
Code;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; main sprite code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EXTRA_BITS = $7FAB10
NEW_SPRITE_NUM = $7FAB9E
TBL_B2D0 dcb $FF,$FF
TBL_B2D2 dcb $00,$00
TBL_B2D4 dcb $F0,$F0
SPRITE_CODE_START JSR Count
BEQ RETURN
LDA $13
CMP #$4F
BCC RETURN
JSL $02A9DE
BMI RETURN
TYX
JSL $01ACF9 ; random value routine
AND #$01 ; 2 possible values
STA $00 ; store to scratch RAM
LDA $18B9 ; check if first extra bit is set
AND #$40
BNE SecondTable
PHY ; preserve Y register
LDY $00 ; load random value into Y
LDA Status1,y ; store sprite status
STA $14C8,x
LDA Sprites1,y ;
BRA SharedCode
SecondTable:
PHY ; preserve Y register
LDY $00 ; load random value into Y
LDA Status2,y ; store sprite status
STA $14C8,x
LDA Sprites2,y ;
BRA SharedCode
SharedCode:
PLY
STA NEW_SPRITE_NUM,x
JSL $07F7D2 ; reset sprite properties
JSL $0187A7 ; get table values for custom sprite
LDA #$08 ; mark as initialized
STA EXTRA_BITS,x
LDA #$1F
STA $D8,x
LDA $1D
ADC #$00
STA $14D4,x
LDA $148E
AND #$01
TAY
LDA TBL_B2D0,y
CLC
ADC $1A
STA $E4,x
LDA $1B
ADC TBL_B2D2,y
STA $14E0,x
LDA TBL_B2D4,y
STA $B6,x
RETURN RTS
Count: STZ TEMP ;TEMP will be the sprite counter
LDY #$00
LOOP
PHX
TYX ;Y into X
LDA $7FAB9E,x ;look into sprite type table for custom sprites
PLX
TYX ;Y->X, for long indexed
LDA $14C8,y ;load status
BEQ NOINCC ;if sprite is dead, don't increment
INC TEMP ;else increment
LDA TEMP ;compare TEMP to count
LDA NEW_SPRITE_NUM,x ;original sprite index
CMP #$93
BNE NOINCC
LDX $15E9 ;original sprite index
CMP #$01 ;if count is reached....
BCS RETURN2 ;just return
NOINCC
LDX $15E9 ;restore sprite index
INY ;advance index
CPY #$0C ;if some left to check...
BNE LOOP ;loop again
LDA #$01 ;Z = 0
RTS
RETURN2
LDA #$00 ;Z = 1
RTS
Dazu habe ich zwei Fragen:
Der Sprite taucht sofort nach seinem Ableben wieder auf. Wie kann ich einstellen, dass erst paar Sekunden bis zum erneuten Auftauchen vergehen?
Ich habe eine exakte y-Position festgelegt, in der der Sprite erscheinen soll:
Code LDA #$FF
STA $D8,x
LDA $1D
ADC #$00
STA $14D4,x
#$FF ist bekanntermaßen die höchste Zahl. Je niedriger die Zahl ist, umso höher erscheint der Sprite auf dem Bildschirm. D. h., #$FF ist am tiefsten, was aber nicht die tiefstmögliche Position auf dem Bildschirm ist. Wie kriege ich die Sprite-Position noch niedriger als #$FF? Muss ich da irgendwas subtrahieren oder so?