Beiträge von Kiri im Thema „Sprite-Animation / Farbwechsel“

    Es läuft schon, nach der erwähnten Änderung, aber es läuft viel zu schnell ab!

    Bei $6200 scheint der IRQ für die Musik und das Blinken zu liegen.
    Dort wird anscheinend (nach der Musik) gleich 4x zur Blink-Routine gesprungen.

    Code
    .C:620d  20 03 10    JSR $1003
    .C:6210  20 00 82    JSR $8200
    .C:6213  20 00 82    JSR $8200
    .C:6216  20 00 82    JSR $8200
    .C:6219  20 00 82    JSR $8200


    Damit wird diese also bei PAL 200x in der Sekunde aufgerufen. Selbst wenn sie nur 1x aufgerufen wird, würde das Blinken in ca. 0,25 Sek durchlaufen.

    Setze mal unter VICE einen Breakpoint bei $8225 (müsste die BPL-Prüfung für die Farben sein), dann kannst zu sehen, dass alle Farben verwendet werden.
    Wenn du das Blinken anders 'timest', sollte es eher deinen Vorstellungen entsprechen.


    Außerdem gibt es noch ein zweites Problem:
    Hier setzt du spr_ColorPointers zwar auf 0...

    Code
    lda #$00 // Sonst
                        sta spr_ColorPointers,y // Color-Pointer und
                        sta spr_FlashActive,y // Blink-Flag auf 0 setzen

    ...läufst dann aber direkt weiter in den folgenden Abschnitt...

    Code
    spr_SetColor:
                        sta $d027,y // Farbe setzen
                        inx // Color-Pointer +1
                        txa // X -> A
                        sta spr_ColorPointers,y // Neuen Color-Pointer speichern


    ...hier wird spr_ColorPointers dann auf einen ungültigen Wert gesetzt! Da X immer noch aufs Tabellenende zeigt und nun auch noch um 1 erhöht wird.

    Ich denke, Squidward und Mac Bacon haben schon recht, das Problem ist deine Y-Abfrage.

    Vertausche hier mal die Abfragen...

    Code
    //***************** Blink-Routine
                        cmp spr_BorderBottom // Unterer Rand erreicht?
                        bne spr_NoFlashing // Nein? Dann Sprung
    
    
                        lda spr_FlashActive,y // Blink-Flag laden
                        bne spr_DoFlashing // 0? Nein? Dann Sprung


    Sonst greift dein spr_FlashActive-Pointer nur in dem Moment, wenn Y = unterer Rand ist.
    Achte aber darauf, dass du den Akku für das cmp nicht veränderst!

    Code
    //***************** Blink-Routine
                        ldx spr_FlashActive,y // Blink-Flag laden
                        bne spr_DoFlashing // 0? Nein? Dann Sprung
    
    
                        cmp spr_BorderBottom // Unterer Rand erreicht?
                        bne spr_NoFlashing // Nein? Dann Sprung