👾Mehrere Sprites – flimmerfrei und steuerbar
Eine kleine Spielszene: zehn Figuren in vier Größen fliegen über den Hintergrund, prallen an den Rändern ab und überlappen sich. Alles läuft als Z80-Programm im Emulator – und die gemessene Rechenzeit zeigt ehrlich, wann ein 50-Hz-Bild nicht mehr reicht.
🎮Die Szene im Emulator
work_end markiert das Ende der Arbeit eines Bildes. Hinweis: Die Bildschirmanzeige springt zwischen &4000 und &C000 – im Speicher-Fenster lassen sich beide Bilder ansehen.🔁Die Hauptschleife
┌──────────────────────────────────────────────┐
│ frame: │
▼ │
1. Hintergrund zurück (Liste des unsichtbaren Bildes, │
letzter Eintrag zuerst) │
▼ │
2. Tasten lesen (KM TEST KEY) · bewegen · abprallen │
▼ │
3. Kollision Objekt 0 ↔ andere → Rand rot, Zähler │
▼ │
4. nach y sortieren (Maleralgorithmus) │
▼ │
5. je Sprite: Hintergrund sichern, maskiert zeichnen │
▼ ── work_end ── │
6. warten: VSYNC-Ende, dann VSYNC-Beginn (PPI Port B) │
▼ │
7. CRTC R12 umschalten (&10 ↔ &30), Listen tauschen ───┘; ================= Hauptschleife: ein Durchlauf = ein Bild =================
frame:
call restore_all ; 1. Hintergrund zurück (umgekehrte Zeichenreihenfolge)
; (kein Spieler – alle Sprites bewegen sich selbst)
call move_all ; 2. Positionen: x += dx, y += dy, an den Rändern abprallen
call collide ; 3. Kollision Objekt 0 ↔ andere (Rechtecke)
call sort_y ; 4. nach y sortieren (Maleralgorithmus)
call draw_all ; 5. Hintergrund sichern + maskiert zeichnen
work_end:
call wait_frame ; 6. auf den Beginn des nächsten Strahlrücklaufs warten
call flip ; 7. unsichtbares Bild zeigen (CRTC R12), Puffer tauschen
ld hl,(frames)
inc hl
ld (frames),hl ; Bildzähler
jp frame🖌️Zeichenreihenfolge: der Maleralgorithmus
⏱️Warum es ohne Double Buffering flackert
Mit Double Buffering: 0 – gezeichnet wird ausschließlich im unsichtbaren Bild, umgeschaltet wird im Strahlrücklauf.
📊Das Zeitbudget: wie viele Sprites passen in 19 968 µs?
| Sprites | Rechenzeit je Bild (µs) | Anteil | Bilder/s | Budget |
|---|
messe … (0/16) Messung im Emulator: Mittel über 10 Bilder, Balken bis 3 Bildzeiten. Die Sprite-Mischung ist fest (Geist, Rakete, Münze, Käfer …).
🚀Wie man mehr Sprites schafft
| Pixelgeist (4 × 16 Bytes) | Szene (µs) | schneller (µs) | wie |
|---|---|---|---|
| Hintergrund wiederherstellen | 1.178 | 695 | Schleife mit DJNZ → LDI entrollt (Routine a) |
| Hintergrund sichern | 1.178 | 695 | ebenso mit LDI |
| maskiert zeichnen | 1.562 | 565 | Breite aus Variable → kompiliertes Sprite (Routine f) |
| Summe je Bild | 3.918 | 1.955 | 5 bzw. 10 Geister passen rechnerisch in 19 968 µs (ohne Verwaltung) |
Alle Werte sind im Emulator gemessene Routinen (inkl. CALL/RET). Die Szene selbst verwendet bewusst die einfachen, allgemeinen Schleifen (Breite und Höhe aus Variablen), damit ein Programm alle Größen zeichnen kann – das kostet. Zum Vergleich die einfache Maskenroutine mit festen Maßen (Routine c): 1.511 µs.
⌨️Tastatur: vom Browser zur CPC-Tastennummer
KM TEST KEY (&BB1E) erwartet in A eine Tastennummer 0–79 und meldet mit dem Zero-Flag, ob die Taste gedrückt ist (SOFT 968). Achtung: in C liefert sie den Zustand von Shift und Control – C ist danach verändert.| Taste | Nummer | Matrix |
|---|---|---|
| Cursor hoch | 0 | Zeile 0, Bit 0 |
| Cursor rechts | 1 | Zeile 0, Bit 1 |
| Cursor runter | 2 | Zeile 0, Bit 2 |
| Cursor links | 8 | Zeile 1, Bit 0 |
| P | 27 | Zeile 3, Bit 3 |
| O | 34 | Zeile 4, Bit 2 |
| Leertaste | 47 | Zeile 5, Bit 7 |
| W | 59 | Zeile 7, Bit 3 |
| S | 60 | Zeile 7, Bit 4 |
| D | 61 | Zeile 7, Bit 5 |
| Q | 67 | Zeile 8, Bit 3 |
| A | 69 | Zeile 8, Bit 5 |
| Joystick 0 hoch / runter / links / rechts | 72 | Zeile 9, Bits 0–3 → 72–75 |
Tastennummer = 8 × Matrixzeile + Bit. Matrix nach K. Thacker, „Reading the keyboard and Joysticks“ (cpctech); SOFT 968: gültige Tastennummern 0–79.