Angepinnt Project J - Wir schreiben ein C64 Spiel in mehreren Schritten

  • Hi,
    schreib doch mal Thorsten an. Ich glaube mich zu erinnern, das die Frage beim Vortrag auf der BCC#5 kam und er meinte, so was sei
    in Arbeit oder er plane es.
    Das laufende Programm an zu halten und genau in der Darstellung zu sehen wo der Rasterstrahl ist, kannte ich vom VICE nicht.

    Gruß Höp
    8 Bit sind genug, sonst komme ich morgens nicht aus dem Bett. %)

    „Nous sommes dans un pot de chambre et nous y serons emmerdés.“
    („Wir sitzen in einem Nachttopf und wir werden darin zugeschissen werden“)
    2.9.1870, Auguste-Alexandre Ducrot

    www.emu64-projekt.de/acme The home of ACME win32 compile.
  • Und noch mehr Kleinigkeiten: Score/Leben/Level-Anzeige

    Da wir schon eine Text-Anzeige-Funktion haben plazieren wir einen neuen Default-Text für die Score-Anzeige mit anfänglichen 00000-Werten. Man beachte: Die Score-Werte passen nicht so ganz in ein Byte. Wir updaten nur die Zahlen (bzw. Characters) auf dem Bildschirm, der Score wird nicht noch in einer anderen Weise abgespeichert.

    Das vereinfacht das Updaten ungemein. Für jeden Score-Step beginnen wir mit dem rechts-äußersten Zeichen und erhöhen es. Steht es auf dem Zeichen nach '9', setzen wir es auf '0' und wiederholen den Vorgang ein Zeichen weiter links. Um der guten alten Zeiten willen, fangen wir nicht wirklich beim letzten, sondern beim vorletzten Zeichen an (Scores erhöhen sich so mindestens um 10 Punkte, aber das macht gleich viel mehr her).

    Dateien
    • step16.zip

      (14,57 kB, 66 mal heruntergeladen, zuletzt: )
  • Keine große Aktion, aber macht gleich Einiges mehr aus: Wir statten den Spieler mit Animation und besseren Sprung-Fähigkeiten aus.

    Die meiste Arbeit wurde in PlayerControl investiert. Bei jeder Bewegung wird das Sprite mit Berücksichtigung diverser Stati wie Springen, Rückstoß, Fallen, etc. upgedatet.
    Für den Sprung wurde lediglich die PLAYER_JUMP_TABLE angepaßt.

    Und schon sieht es Ecken besser aus :)

    Dateien
    • step17.zip

      (16,9 kB, 66 mal heruntergeladen, zuletzt: )
  • In diesem Schritt animieren wir (endlich) auch mal die Gegner und bauen gleich einen neuen Typ ein, der einem Bewegungspfad folgt. Die Bewegungstabellen sind nach delta X und delta Y aufgeteilt. Ist das höchste Bit gesetzt, wird der Wert negativ behandelt.

    Die Animation (drei Frames im Ping-Pong-Loop) wird ebenfalls in einem Table abgelegt.

    Jedes Objekt bekommt einen Animationsverzögerungszähler, einen Animationsframe-Zähler und einen Bewegungspositionszähler verpaßt.

    Dateien
    • step18.zip

      (17,5 kB, 60 mal heruntergeladen, zuletzt: )
  • Diesmal nichts großartig Neues. Ein neuer Gegner, die Mumie, die langsam hin- und herwackelt. Und mehr Schüsse aushält als die Fledermäuse.

    Ein neues Behaviour wird zum Table hinzugefügt, und extra Code stellt sicher, daß die Mumie nicht in Lücken tritt.

    Dateien
    • step19.zip

      (18,6 kB, 57 mal heruntergeladen, zuletzt: )
  • Noch mehr Verfeinerung von existierendem Code, dieses Mal mit mehr Einfluß auf den Spielablauf.

    Zum einen muß die Schrotflinte nachgeladen werden (indem man ruhig stehen bleibt). Zum anderen haben die aufgenommenen Items jetzt auch einen Effekt, nämlich schnelleres Aufladen und Unverwundbarkeit.

    Dateien
    • step20.zip

      (19,76 kB, 67 mal heruntergeladen, zuletzt: )
  • Jetzt mal etwas technisch Interessantes:

    Wir bauen einen Titel-Screen mit einem Bitmap Logo ein. Es wird ein einfacher Rasterzeileninterrupt benutzt, um das Logo in den ersten 8 Zeilen und Textmodus in den restlichen Zeilen anzuzeigen.
    Für die Pingel: Ein einfache Rasterzeileninterrupt ist nicht ganz genau, d.h. es gibt da einen nicht stabilen Übergang nach den ersten 8 Zeilen. Wenn man in dem Bereich einfach nichts anzeigt, merkt man es aber nicht.

    Die Bitmap wurde mit einem Lua-Script aus einer PC-Grafik konvertiert (ist ja auch wahnsinnig aufwendig). Aus den erzeugten Daten wurden nur die benötigten Daten ausgeschnitten. So werden nicht die vollen 8K für die Grafik verbraten.

    Dateien
    • step21.zip

      (20,33 kB, 61 mal heruntergeladen, zuletzt: )
  • Der Titelscreen sieht etwas leer aus, nicht? Dann packen wir da mal Highscores rein. Faul wie ich bin sind die Highscore Scores und Namen in zwei Textblöcken zur Anzeige abgelegt. Dadurch lassen sich die beiden Blöcke mit der Standardroutine anzeigen.

    Nach dem Spielende prüfen wir ob es für einen Eintrag reicht. Falls ja, schieben wir alle niedrigeren Einträge runter. Im Moment passiert das noch automatisch und es betrifft nur die Punkte. Die Namenseingabe folgt im nächsten Step.

    Dateien
    • step22.zip

      (20,76 kB, 61 mal heruntergeladen, zuletzt: )
  • Highscore-Anzeige, wie toll! Aber es sind immer die selben Werte. In diesem Schritt wird die Highscore-Eingabe eingebaut. Dazu wird die Kernal-Tastaturabfrage benutzt.

    Zusätzlich zum Score-Verschieben aus dem vorherigen Schritt werden jetzt auch die Namen verschoben. Der Spieler-Name wird dann direkt in den Textblock eingesetzt.

    Aus äh.. taktischen Gründen findet die Eingabe derzeit noch direkt auf dem Spielfeld statt. Das wird dann auch in Kürze behoben.

    Dateien
    • step24.zip

      (22,92 kB, 45 mal heruntergeladen, zuletzt: )
  • Na toll, ich sollte nicht im Halbschlaf posten: Also, offenbar war schon der Code für diesen Step in der letzten Woche angehängt. Dafür diesmal angehängt der Code des letzten Schrittes :)
    Und bei Step #21 handelt es sich NICHT um ein Bitmap-Logo, sondern noch um Charset. Das Bitmap-Logo ist erst nächstes Mal dran. Leider kann ich da nicht mehr rückwirkend editieren.

    Weiteres zum Highscore: Highscores sind gut und schön, aber sie gehören gespeichert. Mit diesem Step werden die Scores gespeichert und geladen, und zwar auf dem zuletzt benutzten Gerät (Kassette oder Disk). Beim Start wird das benutzte Device gespeichert, und ab da wird mit den Kernal-Routinen darauf zugegriffen.
    Visuell daher dieses mal kein Unterschied.

    Dateien
    • step24.zip

      (22,92 kB, 53 mal heruntergeladen, zuletzt: )
    • step23.zip

      (21,88 kB, 49 mal heruntergeladen, zuletzt: )
  • Wie schon angekündigt, diesmal wirklich ein Bitmap Logo.

    Das Titellogo wird mit dem Bitmapmodus dargestellt. Es wird ein Rasterzeilen-Interrupt benutzt, um zwischen Bitmap- und Text-Modus umzuschalten.

    Die Bitmap wurde mit einem Lua-Script aus einer PC-Grafik konvertiert (ist ja auch wahnsinnig aufwendig). Aus den erzeugten Daten wurden nur die benötigten Daten ausgeschnitten. So werden nicht die vollen 8K für die Grafik verbraten.

    Jetzt wartet nur noch auf die Schritte, wenn Smilas Grafiken eingesetzt werden ;)

    Dateien
    • step25.zip

      (22,44 kB, 56 mal heruntergeladen, zuletzt: )
  • Und nun wieder etwas Spiel-relevantes, ein neuer Gegner. Da bietet sich doch der allseits beliebte Zombie an.

    Der Zombie taucht aus dem Boden auf und stolpert langsam vorwärts. Wird er getroffen, verschwindet er wieder im Boden. Wo er dann auch die Position ändern kann. Bis er wieder auftaucht...

    Dateien
    • step26.zip

      (27,17 kB, 68 mal heruntergeladen, zuletzt: )
  • Die Level sind im Moment noch eher simpel gehalten. Um da etwas mehr Schwung reinzubringen, werden neue Level-Elemente ermöglicht:

    Als Erstes ein Flächenelement (mit Zeichen, Farbe, Breite und Höhe). Dazu horizontale und vertikale Linien, die das verwendete Zeichen immer um +/- 1 abändern. Und noch ein Element für 2x2 Tiles.

    Dateien
    • step28.zip

      (29,33 kB, 57 mal heruntergeladen, zuletzt: )
  • Hi Endurion

    Finde deine Arbeit hier sehr gut. Es ist leicht verständlich und gut erklärt.

    Mal eine Frage:
    Würdes du so was auch mal für ein Intro oder Demo machen mit allen was dazu gehört?
    Ja, ich weis im Netz gibt es schon zick Erklärungen über solche Dingen. Aber die sind meisten immer kurz und bündig. Wenn man bei so einen Kurs kein Hintergrundswissen besitz, steht man ganz schön auf den Schlauch.

    Gruss Drachen :thumbsup: :thumbsup:
    :D :D Ich liebe den Sound vom C64ér :thumbsup: :thumbsup: :thumbsup: