Puzzle 009

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

CBM prg StudioMal verliert man, mal gewinnen die Anderen ūüėČ

Wir wollen nun einen Timer einbauen. Ich habe mich entgegen der ersten Planung gegen die Verwendung von Interrupts beim Puzzle entschieden, wir werden uns selbst um alles k√ľmmern.

 

Vorbereitung
Als Erstes habe ich unseren Puzzle-Bildschirm so ge√§ndert, dass wir rechts einen Zeitbalken erhalten. Dazu einfach die Datei „puzzle.sdd„ mit dem Screen Designer √§ndern. Mein Zeitbalken ist vier Zeichen breit und 20 Zeilen hoch. Ganz unten wird darauf hingewiesen, was passiert, wenn die Zeit abgelaufen ist.

Der Zeitbalken
Der Zeitbalken

 

Um sp√§ter Sieg oder Niederlage anzuzeigen, f√ľgen wir einfach zwei Funktionen zu unserem Programm, hinter der Routine¬† puzzlemain:, hinzu.

Wie ihr seht machen die beiden Funktionen erstmal nichts Anderes als den Rahmen gr√ľn beim L√∂sen des Puzzles bzw. rot bei Ablauf der Zeit einzuf√§rben. Stutzig werdet ihr evtl. beim Befehl jmp *. Wer sich mal die Hilfe des CBM prg Studios ansieht, findet die Erkl√§rung. Nach dem¬† * folgt normalerweise eine vorzeichenbehaftete Zahl, die die Sprungweite angibt. So k√∂nnt ihr z. B. Label sparen, in dem ihr direkt die gew√ľnschte Anzahl BYTES f√ľr den Sprung angebet. Meistens wird dies mit bedingten Spr√ľngen verwendet, diese ben√ľtzen bekanntlich die relative Adressierung.
Achtung: Bei der aktuellen Version 2.6.0 des CBM prg Studios funktioniert dies nicht, wenn man hinter dem¬† * noch weitere Angaben macht, es f√ľhrt zu einem Fehler beim assemblieren!
Mit * ohne weitere Angaben greift man auf die Adresse des Befehls zu, wir springen hier also direkt wieder zum jmp * und produzieren eine Endlosschleife. Die Verwendung von * kann nat√ľrlich zu Problemen f√ľhren. F√ľgt ihr Zeilen hinzu oder entfernt / √§ndert welche m√ľsst ihr daran denken auch diese Spr√ľnge zu kontrollieren und ggf. die BYTE-Anzahl anzupassen.

 

Die Zeit läuft ab
Wir wollen nun den Zeitbalken in regelm√§√üigen Abst√§nden verringern, dazu ben√∂tigen wir zun√§chst zwei neue Variablen. F√ľgt diese einfach, wie gewohnt, hinter¬† calc16Bit: ein.

In¬† timer: steht unsere verbleibende ‚Restzeit‚. Da unser Zeitbalken 20 Zeilen hoch ist, lassen wir¬† timer: auch mit 20 beginnen. Um flexibler zu sein, f√ľgen wir noch die Variable timerStep: ein. Wir pr√ľfen gleich, ob die hier hinterlegte Anzahl Sekunden verstrichen ist, um dann unseren timer: herunterzuz√§hlen.

Wir benötigen noch zwei neuen Konstanten, am Besten hinter CIA1_B:

Diese Konstanten zeigen auf die Speicherstellen f√ľr die Sekunden und zehntel Sekunden der internen Uhr des C64 aus dem CIA1. Man kann diese nicht nur lesen, sondern auch setzen. Genau dies machen wir gleich. Wir setzen die Uhr auf Null und pr√ľfen, ob die von uns gew√ľnschte Zeit verstrichen ist. Da wir nur die Sekunden ben√∂tigen, setzen wir auch nur die Werte f√ľr die Sekunden und zehntel auf Null.
 

F√ľgen wir als n√§chstes hinter die Routinen f√ľrs Gewinnen / Verlieren eine weitere drawtimer:, zum Zeichnen unseres Zeitbalkens, ein.

Wenn ihr euch die Funktion anseht, sollte als Erstes auffallen, dass wir den Zeitbalken √ľberhaupt nicht zeichnen. Er wird mit unserem Spielfeld ausgegeben, wir √§ndern nur die Farbe, aber schauen wir uns dass mal im Detail an.

Zu n√§chst holen wir uns die Sekunden in den Akku und vergleichen diese mit dem in¬† timerStep: hinterlegten Wert. Stimmen die nicht √ľberein, dann sind wir erstmal fertig. Ist das Intervall erreicht, dann legen wir die Adresse des Farb-RAMs auf der Zero-Page ab. Dabei addieren wir gleich 32, damit unsere Startadress eine Zeile √ľber dem Beginn des Farbbalkens liegt. Als n√§chstes berechnen wir, wie viele Intervalle bereits verstrichen sind. Dazu holen wir die max. Anzahl (20) in den Akku und ziehen den Wert aus timer: ab. Dann kopieren wir die errechnete Anzahl ins X-Register f√ľr unsere folgende Schleife. Vorher verringern wir timer: und springen zu gameover: , falls die Zeit abgelaufen ist. Wenn noch Zeit √ľbrig ist, addieren wir f√ľr jedes verstrichene Intervall 40 auf die Zero-Page-Adresse, um unsere zu √§ndernde Zeile zu finden. Sobald wir diese haben, laden wir den Akku mit der neuen Farbe und das Y-Register mit 3 (wir pr√ľfen auf positiv und √§ndern so vier Zeichen). Mit der Y-nach-indizierten Adressierung, √§ndern wir jetzt die Farbe der vier Zeichen des Balkens (das gilt auch f√ľr die Spitze, obwohl dort nur zwei Zeichen verwendet werden). Zum Schlu√ü setzen wir die Sekunden wieder auf Null und verlassen dann die Funktion.

Den Aufruf der drawtimer:-Funktion f√ľgt ihr direkt vor das jmp puzzlemainloop: in puzzlemainloop: ein (s. gelbe Zeile).

 

Damit unsere Uhr korrekt startet, sollten wir vor  puzzlemainloop: die Sekunden und zehntel Sekunden auf Null setzen.

 

Bevor wir das Programm testen, sollten wir noch eine letzte Kleinigkeit ändern. Sucht das Label  checkinput_exit: und ändert den Abschnitt wie hier markiert:

 

Damit haben wir es mal wieder geschafft, wenn ihr nun das Programm startet, dann sollte die Zeit ablaufen und das Programm aufs Gewinnen / Verlieren reagieren.

Die Zeit läuft ab...
Die Zeit l√§uft ab…

 


Das Puzzle ist nun fast fertig. Im n√§chsten Beitrag werden wir noch daf√ľr sorgen, dass der Spieler es nochmal versuchen kann.


 

Start im Java Emulator



Schrott!!Naja...Geht so...Ganz gut...SUPER! (4 Bewertungen | √ė 5,00 von 5 | 100,00%)

Loading...


 

<<< zur√ľck | weiter >>>

 

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

2 Gedanken zu „Puzzle 009“

  1. Servus!

    Ich muss zuerst mal ein Kompliment f√ľr deine Arbeit aussprechen. Das ist mit Abstand das Beste, das ich je gesehen habe. Wenn es so was auch noch f√ľr den Amiga g√§be, dann w√§ren die langweiligen Sonntag Nachmittage Geschichte ūüėČ

    Ich habe da eine Frage, der Timer sollte ja eigentlich warten, bis der Sekundenz√§hler auf 2 steht, so wie es unser timer Intervall vorgibt, das w√§ren dann gesamt 40 Sekunden. Bei mir l√§uft das aber derart schnell ab, dass in ca. 10 Sekunden alles vorbei ist…
    Liegt das daran, dass Vice viel schneller läuft als ein originaler C64?

    Ich schaffe es nicht, den Monitor von Vice geschickt mit Breakpoints aus CBM prg Studion zu beschicken. Wenn du mal Zeit hast, mit der du nicht wei√üt was anzufangen ūüėČ k√∂nntest du dar√ľber berichten. Ich denke da w√§re nicht nur mir geholfen.

    Nochmals Danke f√ľr deine Arbeit, schlichtweg GEWALTIG!!!!

    1. Danke f√ľr die ‚Blumen‚.

      VICE kann zwar schneller laufen, das musst du aber im Men√ľ einstellen. Normalerweise steht in der Titelleiste die Geschwindigkeit. Dort sollte 100% 50fps stehen (es kann durchaus mal um 3% schwanken). Tritt das Problem mit deinem eigenen Source oder auch mit ‚meinem‘ D64-Image auf?

      Ich ziehe mittlerweile das C64 Studio vor. Dort kannst du direkt in der IDE tracen, das erleichtert vieles.

Schreibe einen Kommentar

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

Protected by WP Anti Spam