Landung 004

Das Lasernetz stabilisieren

C64 Studio

Kümmern wir uns endlich darum, dass der Himmel nicht mehr flackert, sobald sich das Sprite dem Lasernetz nähert. Dazu verwenden wir einen stabilen Rasterzeileninterrupt.

Vorausgesetzt wird das Wissen aus den weiterführenden Rasterzeilen-Interrupt Beiträgen: Raster-IRQ: PAL oder NTSC, Raster-IRQ: Timing-Probleme und Raster-IRQ: Endlich stabil!!!.

Um das Problem nachzuvollziehen, achtet bitte darauf, dass SPACESHIP_STARTY noch den Wert = $32 hat. Am besten benutzt ihr einfach den vorangegangenen Beitrag Landung 003 als Ausgangsbasis.

Wie ihr euch als zukünftige Raster-Profis denken könnt, haben wir hier ein Timing-Problem. Um darauf besser reagieren zu können, benutzen wir zwei Raster-IRQs. Einen für den Himmel und den zweiten für den Laser. Für diesen verwenden wir einen stabilen Rasterzeileninterrupt. Also, „Frisch Gesellen, seid zur Hand…

Ändert erstmal RASTERIRQ_LASER, wie oben zu sehen. Da der stabile Raster-IRQ etwas Vorlauf benötigt, startet der Laser-Interrupt nun in Zeile 46 $2e. RASTERIRQ_CANYON kann gelöscht werden, die Konstante benötigen wir nicht mehr.

Da wir uns vom Timer-IRQ nicht mehr stören lassen wollen, fügt noch folgende Zeilen zur Interrupt-Einrichtung hinzu, um diesen zu deaktivieren.
Wie wäre es zwischen sta VIC_CONTROLREG1 und cli.

Jetzt entsorgen wir unseren bisherigen Interrupthandler (also die komplette landerIRQ-Routine löschen) und beginnen damit die Funktion komplett neu zu schreiben:

Da wir nun getrennte Interrupts verwenden, setzten wir jetzt direkt ohne Prüfung die Farbe für den Himmel, tragen dann die Zeile für den nächsten Raster-IRQ ein und biegen den RAM-Vector auf doRasterIRQ um. Dann springen zum Ende des Interrupts, um ihn zu bestätigen und zu verlassen.

Schon kommen wir zum zweiten Interrupt. Dieser verwendet einen stabilen Raster-IRQ und sorgt somit dafür, dass unser Laser immer an der selben Position beginnt.

Mit dem !align 255,0 sorgen wir wieder dafür, dass uns keine Page-Grenze das Timing zerschießt. Den Rest kennt ihr aus Raster-IRQ: Endlich stabil!!!, außer bei der Zeile lda LaserFlash und einigen Label, sowie Kommentaren hat sich nichts dramatisch geändert. Der lda verwendet jetzt die absolute Adressierung, also mussten wir darauf achten, dass das Timing noch passt.

Nachdem für Stabilität gesorgt wurde, machen wir uns jetzt endlich an die eigentliche Arbeit und sorgen für das Lasernetz.

Wir beginnen damit, die Hintergrundfarbe auf die vom Laser zu setzen und erhöhen dann für den nächsten Durchlauf die Laserfarbe. Dann verbummeln wir mal wieder etwas Zeit, damit der Laser sich über zwei Rasterzeilen erstreckt.
Danach wird der Rahmen auf die Canyon-Farbe gesetzt, im RAM-Vector wieder die Adresse vom Laser-IRQ hinterlegt und schließlich der IRQ bestätigt und verlassen.

Ein Start zeigt uns, dass der Himmel endlich nicht mehr flackert, auch wenn ihr alle Sprites aktiviert ändert sich daran nichts, oder??

Links gibt es noch ein kleines Problem.
Links gibt es noch ein kleines Problem.

Es gibt einen kleinen Grafikfehler ganz links! Bei bestimmten Kombinationen von Sprites verlieren wir wohl etwas Zeit. Auch hierfür gibt es eine Erklärung, die aber mal wieder auf später vertagt wird. Wir könnten das Problem zwar einfach ignorieren, aber wir lösen es durch eine kleine zusätzliche Prüfung. Ersetzt einfach die bisherige Zeile lda #$15 kurz hinter dem Label .laser durch folgenden Block.

Wir verkürzen unsere Warteschleife einfach um eins und prüfen dann, ob sich das Raumschiff direkt unter dem Laser befindet. Falls ja verringern wir die Warteschleife um zwei Durchläufe.

Jetzt kommt der Laser nur noch aus dem Tritt, wenn sich das Sprite noch weiter nach oben bewegt. Dass kommt aber nicht vor, da das Raumschiff dann zerstört wird und wir z. B. das Lasernetz deaktivieren und eine Explosion anzeigen.

Das Lasernetz ist endlich stabil. (Screenshot Emu64 Beta 5.0.8 mit Simulation der Bildschirmkrümmung und Unschärfe)
Das Lasernetz ist endlich stabil.
Screenshot Emu64 Beta 5.0.8 mit Simulation der Bildschirmkrümmung und Unschärfe

Wie euch im Source evtl. aufgefallen ist, habe ich hier komplett auf das Anspringen der Timer-IRQ-Routine verzichtet. Da wir diese zur Zeit nicht benötigen, können wir sie auch ganz ignorieren. Außerdem habe ich die Hintergrundfarbe auf normal Grau gesetzt, es war mir sonst doch zu dunkel.


Das wäre es auch schon wieder.

Vielleicht fragt ihr euch jetzt, ob der ganze Aufwand hier wirklich notwendig war. Wir hätten das Landungsschiff doch auch einfach etwas tiefer starten lassen können. Die Wahrscheinlichkeit, dass sich der Spieler später dem Laser nochmal so sehr nähert, dass es zum Anzeigefehler kommt ist dann doch eher unwarscheinlich und ob er im Eifer des Gefechtes die Probleme bemerkt wäre ebenfalls fragwürdig.

Meine zwei Cent:
Als Entwickler sollte es immer der eigene Anspruch sein, alles so gut wie möglich umzusetzen. Man sollte also alle Probleme, die man bemerkt oder die einem mitgeteilt werden, abstellen und nicht einfach davon ausgehen, dass kein Anderer darüber stolpert. Diese Annahme ist in der Regel falsch, irgendwer wird es bemerken.
Also behebt alle Fehler und Probleme die ihr findet, auch wenn ihr Auftreten sehr unwahrscheinlich ist.

Beim nächsten Mal kümmern wir uns endlich um die Steuerung.


Schrott!!Naja...Geht so...Ganz gut...SUPER! (3 Bewertungen | Ø 5,00 von 5 | 100,00%)

Loading...


ZurückWeiter

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Protected by WP Anti Spam