Spiel: Sternenschwarm

Hallo zusammen,

gerne möchte ich mein Spiel “Sternenschwarm” für den CPC6128 vorstellen, welches ich vor einiger Zeit programmiert hatte. Ich habe ca. 2023 damit begonnen… Trotz bereits damaliger KI-Unterstützung saß ich fast 2 Jahre dran… Wobei die LLMs lediglich geholfen haben, die Umsetzung zum Ende zu bringen. Die meiste Arbeit erfolgte aus Spaß an der Freude aus eigener Feder (= Tastatur) etwas zu programmieren.

STERNE.DSK (190,3 KB)
(run"sterne")

Eckpunkte:

  • Computer: CPC 6128. Ich nutze das gesamte RAM (Bank-Switching)
  • Man kann es mit den Cursorsteuertasten spielen.
  • Das Spiel wird von Level zu Level schwerer. Um dies auszugleichen, kann man auf dem Startbildschirm das Spiel “cheaten”. Mit den Tasten 1 bis 8 kann man festlegen, wieviele Schüsse man direkt hintereinander abfeuern kann…
  • Gelegentlich bewegen sich die Feinde NICHT hin und her. Das liegt daran, dass das Programm fortlaufend misst, wieviele Objekte es bewegen kann. Das Spiel läuft mit festen 25 Bildern pro Sekunde. Es arbeitet mit Doppelpufferung und schaltet alle zwei VSYNCs (je 20 ms bei 50 Hz) um. Das Bildbudget beträgt damit 40 ms. Ein gleichmäßiges Tempo ruckelt weniger als wechselnde Raten, deshalb ist die Rate fest gewählt und nicht maximiert.
  • Entwicklungsplattform: “Retro Virtual Maschine 2.1”. Leider habe ich meinen CPC vor 30 Jahren verkauft. :frowning:
  • Zum Erstellen der Grafiken habe ich einen eigenen Editor geschrieben. Er kann in verschiedenen File-Formaten und Byte-Anordnungen die Bilder und Sprites speichern. Bei Interesse werde ich diesen hier bereitstellen.
  • Ein Paar Statistiken:
    • Assembler: 7356 Zeilen ohne die Leerzeilen und Kommentare.
    • Python-Tools: 8

Aber ich will nicht langweilen mit weiteren Coding-Berichten und -Details…

Ich bin übrigens noch nie über 61.000 Punkte hinausgekommen… Wer schafft zuerst die 100.000?

Grüße
S.D.

8 „Gefällt mir“

Das ist wirklich sehr schön.

Besonders die Sprite-Rotationen sind richtig gut gelungen.

Das ist hervorragend! Ich liebe die flüssigen Bewegungen. Das Einzige, was mir aufgefallen ist: Die Gegner, die sich bereits auf dem Bildschirm befinden, bleiben stehen, sobald die nächste Welle hereinfliegt – das macht es ziemlich leicht, sie abzuschießen. Andererseits habe ich deinen Highscore noch nicht geknackt, vielleicht ist es also ganz hilfreich!

(Könntest du es bitte auch auf 64k reduzieren, damit ich es auf meiner GX4000 spielen kann, da ich meinen 6128 nicht mehr habe :slight_smile: )

Nice, im ersten Run direkt 40k… Ohne groß darauf zu achten, „um jeden Preis zu überleben“.

Wenn du noch einen Boss hinzufügst, der einen „einfängt“ (Gegner der obersten Stufe), kannst du es sogar in den Galaga-Thread packen :slight_smile:

Kleiner Bug: Wenn eine Stage beendet ist (Text auf dem Bildschirm), frieren die Geschosse (sowohl von den Gegnern als auch vom Spieler) ein und fliegen dann einfach weiter, sobald die nächste Stage beginnt. Während des Einfrierens sind sie ungefährlich, aber ich weiß nicht, ob sie es nach dem Weiterspielen wieder sind.

Das Spiel hat jetzt schon ein echt gutes Niveau. Schicke Grafik / Animationen / Challenge. Besser als viele Kaufspiele von damals. Es fehlen nur noch Kleinigkeiten zur absoluten Spitzenklasse: ein kleiner Jingle zwischen den Stages oder Hintergrundsound während der Stage, vielleicht noch ein paar mehr Bewegungsmuster bei den Gegnern.

Hallo zusammen,

vielen Dank für die Rückmeldungen. Hier ein paar Einblicke in die Umsetzung des Spieles und damit ein paar “Besonderheiten” zum Spieldesign nachvollziehbar sind.

  • Platzbedarf: Um die “Feinde” drehen zu können, sind diese in allen Bewegungsphasen im Speicher abgegelegt. Diese sind genau so im Programmcode enthalten.


    Alleine diese Bilder benötigen rund 38KB. Damit die Animationen flüssig sind, nutze ich Double-Buffering. Hierzu sind weitere 16kb notwendig. Die Verwaltung aller Objekte benötigt 792 Bytes (über eine eigene Tabelle).
    Alles in allem: Ich muss die zusätzlichen 64kb des CPC 6128 nutzen.

  • Bildwiederholrate (liegt strikt bei 25 Bilder / Sekunde): Ich hatte einmal ein Asteroids-Spiel für den CPC geschrieben. Es war an der Anzahl der bewegten Objekte “gestorben”. (Wenn ich es noch finde, so werde ich es hier veröffentlichen.) So entstand die Idee, dass sich die Anzahl der bewegten Objekte an der Bildwiederholfrequenz orientieren muss. Ein Asteroids-Spiel ist hierzu nicht geeignet, denn es spielt sich unschön, wenn einzelne Asteroiden ruckeln. Dieses Spiel (Sternenschwarm) hingegen erkennt intern, ob es noch ein Objekt bewegen kann, bevor es vom Rasterstrahl eingeholt wird. Die Priorität liegt bei den Objekten, die ihren Platz in der Formation nicht erreicht haben. Gelegentlich kann man sehen, dass nur einzelne Objekte in der Formation bewegt werden und die anderen später folgen.

  • Schlussmonster / Boss: Das Spiel hat kaum noch Platz im Rechner. Auch habe ich Angst vor großen Objekten die ich auf dem Bildschirm handhaben muss… Das Projekt ist eigentlich abgeschlossen. (Auch habe ich keine Idee für einen Boss).

  • Fehler mit der Schrift: Ist mir aktuell nicht bekannt, dass dieses Fehlverhalten noch vorhanden ist. Dies hatte ich tatsächlich einmal in der Anfangsphase der Entwicklung. Ein Copy&Paste-Fehler hatte einen Call mitgebracht. Ich werde den Fehler bei Gelegenheit suchen. Danke für den Hinweis.

Grüße
S.D.

2 „Gefällt mir“

Ziemlich cool! Ich muss gestehen, das wäre sicher ein Lieblingsspiel gewesen, hätte es das damals gegeben.

Ich bin eh großer Galaga-Fan und das Spiel ist klar davon inspiriert - die meisten von Galaga inspirierten Spiele sind eher mies - aber das hier ist richtig gut und es macht Freude es zu spielen.

Wenn es doch noch mal was gibt, was du anpasst hätte ich einen Wunsch:

Es sieht so aus, als wenn die Formationen am Anfang immer exakt gleich ablaufen. Galaga hat da zumindest ein wenig Variation, so dass jeder Level ein eigenes Aufbaumuster hat. Das würde dem Spiel hier, glaube ich, sehr gut tun, und die Motivation erhöhen, es doch nochmal zu probieren.

Noch eine Frage: Ist es in der Challenging-Stage überhaupt machbar, dass man alle Geschwader eliminiert? Ich hatte den Eindruck, dass ich mich gar nicht so positionieren kann, dass ich wirklich alle Gegner erwische. In Galaga ist das ja grundsätzlich machbar. Allerdings darf das Spiel hier natürlich auch anders sein…

Hi eto,

ja, die Formationen laufen immer exakt gleich ab. In meinem ersten Post zu diesem Spiel habe ich die Bewegungsmuster auf 2 Bildern vorgestellt. Diese zu variieren finde ich eine interessante Idee.

Tatsächlich habe ich zwei vergleichsweise einfache Ideen diese neuen Mustert potenziell umzusetzen. Etwas nach links / rechts zu verschieben (2, 4 oder 6 Pixel) oder einfach ein paar mehr Bewegungsmuster statisch bereitstellen. Die Idee, die Bewegungsmuster aus vielen Teilstücken zusammenzusetzen muss ich erst prüfen, was es für den Code im Detail bedeuten würde… So wie möchte ich aktuell nicht mehr einsteigen, da ich derzeit an einem andere Softwareprojekt arbeite.

Über die “optimalen Postion” habe ich mir nie Gedanken gemacht.

Danke für Deine Hinweise! Ich behalte diese im Hinterkopf. Vielleicht habe ich einmal die Muße mich erneut in dieses Spiel zu begeben.

Ne, Teilstücke meinte ich gar nicht. Schon statische Bewegungsmuster, aber mehr davon, z.B. 15 oder so - und dann gibt es für jeden Lebel ein Mapping von Wave/Formation auf eines der 15 Bewegungsmuster.

Level 1: Formation 1 kommt in Bewegungsmuster A, Formation 2 in Bewegungsmuster B, …
Level 2: Formation 1 kommt in Bewegungsmuster G, Formation 2 in Bewegungsmuster A, …
Level 3: Formation 1 kommt in Bewegungsmuster B, Formation 2 in Bewegungsmuster K, …
usw.

Das dürfte schon ausreichen um die Highscore-Jagd spannender zu gestalten, weil man dann je nach Level andere Positionen einnimmt um möglichst viele beim Einfliegen zu erwischen und weniger Risiko eingeht.

Ok. Danke für den Hinweis / Tipp :slight_smile:
Ich werde es mir in den kommenden Tagen einmal anschauen. Ich gebe eine Rückmeldung.

1 „Gefällt mir“

Aktueller Stand und Ausblick, was kommen wird:

  1. Es wird weitere Flugbahnen (Bewegungsmuster) der Objekte (ich möchte nicht immer “Feind” schreiben) geben:
    Zum Erstellen der Flugbahnen hatte ich mir in Python einen Flugbahneditor geschrieben.
    Grausam zu bedienen, aber er funktioniert… Auf dem Bild sieht man, dass die Flugbahnen aus definierten Punkten bestehen. Jeder dieser Punkte beschreibt seine relative Position zum Vorhergehenden im Spielfeld, die Sprite bzw. Bewegung-Phase des “Objektes”, welches dem Pfad folgt. Ich habe viele derartiger Bewegungen definiert und darauf geachtet dass sich diese “harmonisch” aneinanderfügen lassen. Ausnahme: Wenn das Objekt seine Zielposition anfliegt, da ich hierzu die bestehende “Wegfindungs-Routine” weiterhin nutze. Je nachdem wieviele Flugbahnen-Teilstücke ich erstellen (ca. 10-15?) und im Spiel aneinanderfügen werde (1-3) ergeben sich ggf. interessante Formationen. Anzahl der denkbaren Flugmuster (bei 10 Teilstücken): 10 + 10x10 + 10x10x10 = 1.110. Um den Einstieg für den Spieler einfacher zu machen, werden diese erst ab Level 9 aktiviert.
  2. Schluss-Monster wird kommen!
    Das Spiel war nie dafür ausgelegt, große Objekte zu bewegen. Also werde ich das Schluss-Monster aus kleinen Sprites zusammenfügen…

    (das werden sie sein.. Zusammengesetzt aus einzelnen nebeneinanderliegenden Sprits. Eine Animation bekomme ich jedoch voraussichtlich nicht hin)
    Die Rechenzeit die noch übrig ist, verwende ich um ein paar bekannte Objekte zur Verteidigung herumfliegen zu lassen. Immer wenn diese alle abgeschossen sind, kommt ein Satz Neuer hinzu.
  3. Fangstrahl
    Er wird kommen. Aber aus technischen Gründen sehr selten! (Das hat technische Gründe… dazu vielleicht später einmal mehr.) Lasst euch einmal einfangen. Es lohnt sich :wink:. Beendet dann aber den Level ohne ein Leben zu verlieren!!!
  4. Musik und Soundeffekte
    Es kommen ein paar weitere dazu, jedoch keine weitere Musik.

Dies ist nur ein kleines Blitzlicht um zu zeigen, dass ich daran arbeite.

1 „Gefällt mir“

PUNKTLANDUNG: Urlaub zu Ende. Spiel fertig. Total übermüdet aber glücklich. :slight_smile:
(Nun ist die Arbeit eine Pause von der Programmierung)

STERNE_21.DSK (190,3 KB)
(run"sterne")

Viel Spaß damit. Ich freue mich über Rückmeldungen. Egal ob gut oder schlecht.

4 „Gefällt mir“

Ziemlich nettes Spiel. Damals hätte ich es geliebt!

Ooooh, das ist wirklich süß und authentisch!

Ich würde mir nur ein anderes Sprite wünschen, wenn sich das Schiff bewegt, damit man sieht, wie es sich nach links und rechts neigt :slight_smile:

PS: Sollte das nicht eigentlich in die KI-Kategorie?

Folgende Inhalt sind KI-generiert:

  • Der Startbildschirm: Mehrfarbige Schrift.
  • Das Python-Programm (auf meiner Entwicklungsumgebung), um die Flugbahnen der Objekte zu zerlegen und deren Koordinaten als Byte-Code zu generieren.
  • Die Melodien zwischen den Leveln wurden mittels ChatGPT als Sequenzen der Töne bereitgestellt.
  • Sprite-Editor, mit dem ich die Sprits gezeichnet und rotiert habe. Hierbei handelt es sich um ein Python-Programm, welches ebenfalls auf meinem Arbeitsplatz läuft.

Ich denke, dass man am “game play” erkennen kann, dass das Spiel liebevoll von Hand erstellt wurde.

Wenn du der Meinung bist, dass es unter KI einzuordnen ist. So nehme diese Änderung gerne vor. Ich bin hierbei leidenschaftslos → im positiven Sinne. Ich schreibe die Software eigentlich für mich, just for fun.

1 „Gefällt mir“

Auf jeden Fall bedeutet es nicht, dass das Spiel komplett „vibe-coded“ ist, nur weil es in dieser Kategorie gelandet ist (eigentlich muss ich den Kategorietitel mal ändern) – sondern lediglich, dass KI darin verwendet wurde.

Es sieht wirklich klasse aus und spielt sich auch super!