Moin,
jetzt bastel ich bei meinem Spielchen gerade an der Tot-und-wieder-aufsteh-Routine und das Sprite-Kollisionsflag ärgert mich:
Ich benutze das echte Kollisionsregister. Wenn der Spieler tot ist, bleibt der erstmal als totes Sprite dort liegen. Wenn er dann den Button drückt und wieder loslässt, dann wird der Level wieder aufgebaut, der Spieler an die Eingangsposition gesetzt und der normale Spielablauf gestartet.
Dummerweise scheint das Sprite-Kollisionsregister aber das nicht mitzubekommen, so dass der Spieler im Grunde direkt nochmal stirbt.
Ich habe ein paar Sachen ausprobiert:
A) Sprite-Kollisionsflag auf 0 gesetzt (lda #0, sta $d015)
B) danach ein paar Frames gewartet (bis zu 40!, Frame über Rasterscan geprüft)
C) alle Sprites bis auf das Spielersprite ausgeschaltet während der Framewarterei
Das müsste der VIC doch spitzkriegen? Oder gibt's da eine bessere Methode?
Hier mal der entsprechende Code:
- ;button loslassen
- dead_button
- LDA #%00010000
- BIT $DC00
- bne dead_button
- ;button drücken
- dead_button2
- LDA #%00010000
- BIT $DC00
- beq dead_button2
- ;button loslassen
- dead_button3
- LDA #%00010000
- BIT $DC00
- bne dead_button3
- ;variablen mit spieler-positionswerten setzen
- lda spieler_start_pos
- sta ENEMYPOS
- lda spieler_start_x
- sta spritex
- lda spieler_start_y
- sta spritey
- ;tatsächliche sprite-positionswerte setzen
- lda spieler_sprite_y
- sta $d001
- lda spieler_sprite_x
- sta $d000
- lda spieler_sprite_x+1
- and #$01
- sta $d010
- ;noch mehr variablen zurücksetzen
- lda #0
- sta spritedx
- sta spritedy
- sta DEAD
- sta $D01E
- ;alle sprites bis auf spieler ausschalten
- lda #1
- sta $d015
- ;viermal einen frame pausieren
- ldx #4
- GLOOP2 LDA $D012
- CMP #$F0
- BNE GLOOP2
- dex
- beq deathloop_done
- GLOOP3 LDA $D012
- CMP #$F0
- BEQ GLOOP3
- jmp GLOOP2
- ;erst jetzt den level nochmal aufbauen, dabei werden auch die monstersprites gesetzt
- deathloop_done
- lda LEVELNR
- sta PARAM1
- inc PARAM1
- jsr MOVELEV
- jmp GAMELOOP