Fahrt 005

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

C64 Studio
Sanftes Scrolling

Eben bei ‚Fahrt 004‚ haben wir unsere Strecke einmal grob durchscrollen lassen. Jetzt wollen wir dafür sorgen, dass wir ein sanftes Softscrolling erhalten, so wie es eigentlich geplant war.

Ihr sollte euch zunächst den Beitrag ‚Scrolling – Laufschrift‚ ansehen!

 

Schreiten wir zu Tat
Im vorangegangenen Beitrag haben, wir das ‚Scrolling‚ einfach durch wiederholtes Zeichnen (siehe jsr drawroad) der gesamten Strecke erreicht. Dabei wurde immer um ein gesamtes Tile ‚gescrollt. So macht das für unsere geplante Fahrt zur Basis natürlich keinen Sinn. Wir werden daher nun den Bildschirm pixelweise verschieben, um ein sanftes Scrolling zu erhalten. Dies machen wir, wie unter ‚Scrolling – Laufschrift‚ beschrieben, durch regelmäßiges verändern der unteren drei BITs des VIC-II Register Nr. 22 $D016.

Denkt daran, dass die Basis wieder der Download aus dem letzten Beitrag ist:

Jetzt wollen wir erstmal eine kleine Routine schreiben, die den Bildschirm pixelweise verschieb. Fügt dazu die folgende Funktion hinter dem  jmp * ein.

Die Funktion verringert einfach scrollroadfinepos. Die Variable legen wir gleich an, dort merken wir uns um wieviele Pixel der Bildschirm bereits verschoben wurde. Wenn scrollroadfinepos positiv ist, springen wir einfach weiter und füllen die unteren drei BITs von $D016 mit unserer aktuellen Scrollposition. Sobald unsere Variable aber negativ wird, haben wir den Bildschirm um 8 Pixel verschoben. Dann setzen wir scrollroadfinepos wieder auf den Startwert von 7 (wir wollen ja von rechts nach links scrollen, also müssen wir mit dem Maxium beginnen) und laufen danach automatisch zum Setzen von $D016 weiter.

Legt die benötigte Variable jetzt an. Ihr könnt dafür einfach roadfirstvisibletile mit dem Label scrollroadfinepos ersetzen. Außerdem solltet ihr noch die !byte-Anweisung in !byte 7 ändern.

Jetzt müssen wir noch unsere Routine regelmäßig aufrufen. Ändert dazu, die Schleife zwischen jsr initroad ;Strecke initialisiere und jmp * ;Endlosschleife am Anfang des Programms wie hier zu sehen.

Die Änderungen sind minimal! Wir zeichnen zunächst den Anfang der Strecke  jsr drawroad komplett auf den Bildschirm. Dann rufen wir nur unsere neue Funktion scrollroad auf und verringern unsere Warteschleife auf lda #1. Synchronisiert wird alles weiterhin durch das Warten auf die Rasterzeile 250.
Falls ihr das Programm nun startet, zuckt die Ausgabe immer um 8 Pixel hin und her.

 

Die Strecke umkopieren
Damit unsere Strecke nun weiter gescrollt wird, müssen wir diese immer um ein ganzes Zeichen nach links umkopieren, sobald wir die Anzeige um 8-Pixel gescrollt haben. Fügen wir dazu, hinter scrollroad, eine weitere Funktion ein.

Wir wollen nur die vier Zeilen, die die Strecke am unteren Bildschirm einnimmt, um ein ganzes Zeichen von rechts nach links umkopieren. Als Schleifenzähler dient das X-Register, dass wir mit 0 initialisieren. Dann holen wir uns das Zeichen von der Position X+1 und kopieren es an die durch X bestimmte Position (also eins nach links). Dies wiederholen wir für alle vier Zeilen. Anschließend erhöhen wir den Schleifenzähler X um eins und wiederholen den gesamten Block solange, bis X = 39 ist, dann haben wir alle benötigten Zeichen um eins nach links kopiert.

Jetzt müssen wir natürlich noch von rechts ein neues Zeichen für jede Zeile nachschieben. Dazu greifen wir einfach auf unsere Tiles zurück. ZP_NEXTTILE zeigt weiterhin auf den nächsten Streckenabschnitt aus roadtobase. Setzen wir die Funktion also fort…

Die Variable ZP_NEXTTILE holen wir ins X-Register, um damit die nächste Tile-Nr. von roadtobase in den Akku zu laden. Diese Nr. verschieben wir dann ins X-Register, da wir aus der Hilfstabelle tileoffsettable den Offset für das Tile benötigen. (Ihr erinnert euch? Dieser Offset zeigt auf den Block mit den einzelnen Zeichen des jeweiligen Tiles tile_1  bis tile_4.) Da wir immer eine Zeichenspalte nach der anderen benötigen, verwenden wir eine weitere Hilfsvariable scrollroadtilepos. Diese zeigt nun auf die nächste Spalte, innerhalb des Tiles, die auf den Bildschirm ausgegeben werden soll. Damit wir die richtige Position erhalten, müssen wir scrollroadtilepos noch zum aktuellen Offset addieren. Das Ergebnis kopieren wir wieder ins X-Register. Damit holen wir uns das entsprechende Zeichen aus dem Tile und geben es ganz rechts auf den Bildschirm aus. Dies wiederholen wir für alle vier Zeilen der Strecke. Dann laden wir scrollroadtilepos ins X-Register, erhöhen es um eins und kontrollieren, ob wir die gesamte Breite eines Tiles verarbeitet haben. Falls ja setzen wir scrollroadtilepos wieder auf 0 und erhöhen ZP_NEXTTILE um eins. Zum Schluß (hier landen wir auch, wenn noch nicht das ganze Tile verarbeitet wurde) speichern wir den Inhalt des X-Registers bei scrollroadtilepos und verlassen die Funktion.

Die neue Variable  scrollroadtilepos legt ihr am besten direkt hinter scrollroadfinepos an.

 

Jetzt muss die neue Funktion nur noch aufgerufen werden. Kehrt zu scrollroad zurück. Fügt den Aufruf direkt hinter sta scrollroadfinepos ;zurücksetzen ein.

 

Nach einem Start sieht das Ergebnis schon recht gut aus, bis auf eine Kleinigkeit…

Da 'tut' sich eine Lücke auf ;-)
Da ‚tut‚ sich eine Lücke auf 😉

Am linken Rand ist immer eine Lücke zu erkennen. Wir müssen abschließend noch die Anzahl der sichtbaren Spalten auf 38 ändern. Bei der Gelegenheit können wir auch dafür sorgen, dass $D016 mit der max. Scrollposition initialisiert wird. Begebt euch an den Programmanfang und ändert den Block

in

 

Jetzt sollte das Scrolling endlich annehmbar sein.

Beachtet bitte, dass dieses Mal das Ende der Strecke nicht geprüft wird! Wir landen also nie bei der Endlosschleife und es wird ‚Müll‚ auf dem Bildschirm erscheinen, sobald wir über das Ende der Strecke hinaus scrollen.

Das Ergebnis könnt ihr euch im Java-Emulator anschauen oder herunterladen:


Jetzt sind wir so weit, dass wir den Rover in die ‚Szene‚ einzufügen können. Damit beschäftigen wir uns dann beim nächsten Mal, dort prüfen wir auch wieder, ob die komplette Strecke ‚abgefahren‚ wurde.


Schrott!!Naja...Geht so...Ganz gut...SUPER! (6 Bewertungen | Ø 4,50 von 5 | 90,00%)

Loading...


 

<<< zurück | weiter >>>

 

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

Schreibe einen Kommentar

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

Protected by WP Anti Spam