Landung 008

Wo ist die Tankstelle?

C64 Studio

Heute geht es darum, den Spritverbrauch hinzuzufügen. Jede Verwendung der Schubdüsen wird unsere Treibstoffreserve verringern. Sollte alles aufgebraucht sein, dann stürzt das Landungsschiff unweigerlich ab.

Die Tankanzeige

Bisher war der Verbrauch als Text vorgesehen. Ich möchte jetzt aber die Darstellung lieber als Balken am rechten Rand vornehmen. Diesmal allerdings nicht mit dem Zeichensatz, wie beim Zeitbalken fürs Puzzle, sondern mit Sprites. Immerhin haben wir noch drei unbenutzte Sprites zur Verfügung. Daher wurde der bisherige Text für den Verbrauch in „Canyon.charscreen“ entfernt, außerdem habe ich die Optik geringfügig überarbeitet.

Der überarbeitete Canyon.
Der überarbeitete Canyon.

Zunächst habe ich die drei benötigten Sprites im Sprite-Editor entworfen. Dazu habe ich eine neue Datei „Fuel.spriteproject“ hinzugefügt. Das Aussehen ist euch freigestellt, ihr solltet nur beachten, dass wir die volle Höhe von drei Sprites, also 63 Zeilen als gesamten Treibstoffvorrat betrachten. Außerdem solltet ihr die drei Sprites von oben nach unten anordnen. Das folgende Bild zeigt meinen Entwurf.

Die Treibstoffanzeige.
Die Treibstoffanzeige.

Damit die neuen Sprites bei der Programmerstellung überhaupt geladen werden und wir gleich unsere Treibstoffanzeige auf den Bildschirm bringen können, passt die Anweisungen hinter dem Label spriteSpaceship bitte folgendermaßen an:

Fügt direkt dahinter noch die folgenden Anweisungen hinzu:

Wir werden den Treibstoffverbrauch durch das Löschen von Spritezeilen realisieren. Da wir aber für einen neuen Versuch, wieder die kompletten Sprites benötigen, kopieren wir gleich unsere Spritedaten hinter das Label spriteFuelLeft. Dort können wir die Daten dann problemlos löschen und bei Bedarf einfach unsere Musterdaten erneut kopieren. Mit dem Pseudo-OpCode !fill könnt ihr einen Bereich, mit einem festen Wert füllen. Gebt zunächst die Anzahl der Bytes und dann mit einem Komma getrennt, den gewünschten Füllwert an. Natürlich würde hier auch eine !fill 192,0-Anweisung reichen, aber so ist es leichter vorstellbar, wo welches Sprite landet. Die beiden neuen Label spriteFuel und spriteFuelLeft befindet sich bereits durch die vorherigen Anweisungen an einer 64 Byte-Grenze, wir benötigen daher kein zusätzliches !align.

Da wir gerade in der Nähe sind, fügt doch noch zwei neue Variablen z. B. hinter Alive hinzu:

FuelCounter steuert die Geschwindigkeit, mit der der Treibstoff verbraucht wird. In FuelClear finden wir das nächste Byte, dass gelöscht werden soll. Außerdem hilft es uns zu erkennen, wann der Treibstoff aufgebraucht ist.

Um unsere Treibstoffanzeige erstmal auf den Bildschirm zu bekommen, sollten wir jetzt die dazu gehörigen Sprites entsprechend einrichten. Dies machen wir in der Funktion initSprites, die Änderungen sind farblich hervorgehoben.

Hier ist alles alter Kaffee. Denkt daran, dass die Berechnung der Spritepointer ldx #spriteFuelLeft/64 hier nur klappt, da wir den Grafikspeicher im ersten 16KB-Block belassen haben! Die restlichen Anweisungen setzen nur die Spritepointer, die Positionen und Farben, verdoppeln die Breite und Höhe und schalten die Sprites sichtbar.

Falls ihr das Programm nun starten wollt, denkt dran, dass die Sprites noch nicht kopiert wurden. Wir würden also nichts sehen. Daher schnell mal eine Kopierfunktion gebastelt. Ich habe diese vor checkCollision eingefügt.

Wir setzen zu Beginn die Nr. für das nächste Byte, das gelöscht werden soll, auf 0. Dann initialisieren wir den Zähler für den Treibstoffverbrauch mit der neuen Konstanten FUELCOUNTINIT. Anschließend wird das X-Register als Schleifenzähler mit der Anzahl der zu kopierenden Bytes gefüllt. Die drei Sprites haben je 21 Zeilen zu 3 Bytes zzgl. einem Füll-Byte, wir kommen also auf (21 * 3 + 1) * 3 = 192 ($C0) Bytes. Bei .loop kopieren wir dann die Bytes. Da X nie Null wird, verringern wir die Adressen von Quelle und Ziel um 1, damit auch alle Bytes kopiert werden.

Legt nun hinter THRUST_Y die neue Konstante an FUELCOUNTINIT = $08 ;Warteschleife für Spritverbrauch.

Aufrufen müssen wir die eben erstellte Funktion natürlich auch noch, das machen wir in initLander, direkt hinter der Zeile jsr initSprites: ;Sprites initialisieren, mit einem weiteren Sprung: jsr initFuel ;Treibstoffreserve zurücksetzen.

Nun ist es soweit, wir können das Programm zum Test einmal starten…

Die Treibstoffreserve wird angezeigt.
Die Treibstoffreserve wird angezeigt.

Da ist sie endlich, die riesen große 😉 Treibstoffanzeige. Natürlich geschieht noch nichts, wir müssen als nächstes dafür sorgen, dass der Treibstoff auch tatsächlich verbraucht wird.
Dazu begeben wir uns in die Funktion checkInput. Jedes Mal, wenn wir die Düsen anzeigen, werden wir den Treibstoffzähler FuelCounter um eins verringern. Fügt dazu hinter jeder der drei bcc-Anweisungen die Zeile dec FuelCounter ;Treibstoffzähler verringern ein. Dadurch erreichen wir, dass der Verbrauch mit jeder aktivierten Schubdüse zunimmt.

Um jetzt den Verbrauch sichtbar zu machen, wollen wir jedes Mal, sobald FuelCounter kleiner als Null ist, eine Zeile in der Treibstoffanzeige entfernen. Dies machen wir einfach in unserer Hauptschleife. Sucht also das Label gameloop und fügt die folgenden Zeilen direkt dahinter ein:

Gleich als Erstes holen wir FuelCounter in den Akku und kontrollieren, ob dieser noch positiv ist, falls ja geht es direkt bei der Kollisionsprüfung (nun hinter .skip) weiter. Ist er aber negativ, dann müssen wir tätig werden. Wir sollten den Counter zurücksetzen, dazu addieren wir die Konstante FUELCOUNTINIT einfach zum Akku und speichern das Ergebnis wieder bei FuelCounter. Um dann eine Zeile im Sprite zu löschen, füllen wir den Akku mit 0 und holen uns das zulöschende Byte aus FuelClear ins X-Register. Wir speichern als nächstes den Akku-Inhalt einfach an der Startadresse, der von uns kopierten Sprites zzgl. dem X-Register. X wird anschließend um eins erhöht. Dies wiederholen wir noch zwei mal und speichern zum Schluß den Wert des X-Registers wieder bei FuelClear.

Probiert ihr das Programm jetzt, dann sieht zunächst alles gut aus, aber erreicht ihr beim Verbrauch den gelben Abschnitt wird ein Versatz sichtbar.

Das sieht noch unschön aus…
Das sieht noch unschön aus…

Der Grund ist recht simpel, wir löschen das Sprite zeilenweise, aber ein Sprite hat nur 63 Bytes. Wir müssen das Füll-Byte beachten. Also passt die obige Funktion zwischen dem letzten inx und dem stx FuelClear  ;nächstes zulöschendes Byte merken noch etwas an (s. gelb hervorgehobenen Zeilen):

Wir kopieren das X-Register in den Akku und kontrollieren einfach, ob bereits 63 Bytes kopiert wurden. Falls ja erhöhen wir X nochmal um 1, bevor wir den Wert bei .skip2 speichern.

Jetzt sollte der Verbrauch ohne Umbruch angezeigt werden. Eine letzte Kleinigkeit fehlt aber noch, sobald der gesamte Treibstoff aufgebraucht ist, wollen wir die Steuerung unterbinden. Dies können wir durch drei kleine Zeilen in checkInput erreichen. Fügt diese hinter dem tax am Funktionsbeginn ein.

Wir kontrollieren einfach, ob bereits alle Zeilen der Treibstoffanzeige gelöscht wurden. Dies ist der Fall, wenn FuelClear 192 oder größer ist. Sobald diese Grenze überschritten wurde, springen wir einfach direkt zu noFire. Das hat zur Folge, dass keine Joystickabfrage mehr stattfindet und das Schiff gnadenlos von der Gravitation ins Verderben gezogen wird.
Wobei es nicht ganz stimmt. Kommt der Spieler mit dem letzten Tropfen zur Landezone, dann kann immer noch eine saubere Landung gelingen. Er darf nur nicht zu schnell aufsetzen.

Jetzt könnt ihr euch an der Landung versuchen. Über FUELCOUNTINIT beeinflusst ihr die Geschwindigkeit des Treibstoffverbrauchs und somit ebenfalls den Schwierigkeitsgrad. Mit meinen beschränkten Fähigkeiten empfinde ich den von mir verwendeten Wert 8 schon äußerst hart.

Das vorläufige Endergebnis.
Das vorläufige Endergebnis.

Wieder eine Etappe geschafft. Level 2 – Die Landung nähert sich nun langsam seinem Ende. Die spielerischen Herausforderungen wurden alle implementiert. Jetzt fehlt nur noch etwas Kosmetik.



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

Loading...


ZurückWeiter

3 Gedanken zu „Landung 008“

  1. Wir werden leider auf ein Update von Arthur warten bis wir hiermit weitermachen können, da es manchmal reicht nur ein Zeichen zu ersetzen, und schon meldet CMB Prg Studio lauter invalid branches (zB beq doRasterIRQ_Laser: und beq doRasterIRQ_Laser1:), zB schon nur wenn man die Konstante FUELCOUNTINIT von $08 in $0F umwandelt.
    Die Cheap Labels scheint er nicht zu vertragen. 🙁
    Ps.: die gleichen Fehler erscheinen auch mit deiner Source Datei wenn man etwas editieren möchte.

    1. Hallo,
      auf erste Probleme mit den Cheap-Label bin ich am 27.05.14 schon mal eingegangen -> ‚CBM prg Studio 3.0.0: Probleme‚.
      Ich stehe heute schon den ganzen Tag mit Arthur in Kontakt und hoffe es wird in Kürze ein Update geben. Ich hatte auch auf eine zügigere Behebung gehofft, aber Arthur braucht auch eine kleine Auszeit.

      Mit der aktuellen Beta 3.1 kann ich jedenfalls FUELCOUNTINIT ändern, ohne dass es zu Problemen kommt.

Schreibe einen Kommentar

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

Protected by WP Anti Spam