5 Punkte von GN⁺ 2024-08-05 | 1 Kommentare | Auf WhatsApp teilen

high_impact: Eine JavaScript-Spiel-Engine nach C portieren

Zusammenfassung

  • high_impact ist eine kleine Spiel-Engine für 2D-Actionspiele, die in C geschrieben ist und für Windows, Mac, Linux sowie als WASM für das Web kompiliert werden kann
  • Sie ist von der JavaScript-Spiel-Engine Impact aus dem Jahr 2010 inspiriert und wird unter der MIT-Lizenz angeboten
  • Quellcode: GitHub

Alte Geschichte

  • Im April 2010 kündigte Steve Jobs in einem offenen Brief mit dem Titel "Thoughts on Flash" an, dass iOS Flash nicht unterstützen werde
  • Flash war ein äußerst wichtiges Browser-Plugin im Web, und viele Websites waren auf Flash-Spiele und -Animationen angewiesen
  • Android unterstützte Flash, aber die Performance war schlecht, und Apples Entscheidung war ein Signal für das Ende von Flash
  • Um zu beweisen, dass sich Webspiele auch ohne Flash mit der JavaScript-Canvas2D-API erstellen lassen, wurde Biolab Disaster entwickelt

Warum C?

  • C ist eine einfache und zugleich tiefgehende Sprache und eignet sich gut für die Spieleentwicklung
  • Durch das Portieren eines JavaScript-MPEG1-Decoders nach C, die Implementierung von VR sowie die Entwicklung von Bild- und Audioformaten wurde die Begeisterung für C wiederentdeckt
  • Impact in C neu zu schreiben, wäre eine unterhaltsame Übung

Konzept

  • high_impact ist mit minimalem Code umgesetzt und bietet Funktionen zum Laden von Tilemaps, zum Erzeugen von Spielobjekten sowie für Update und Rendering
  • Es verarbeitet Physik und Kollisionserkennung und enthält einfache Sprite-Sheet-Animationen, Text-Rendering, Soundeffekte und Musikwiedergabe
  • high_impact ist keine Bibliothek, sondern ein Framework, daher müssen Nutzer die Business-Logik selbst schreiben
  • Es kann mit SDL- oder Sokol-Plattform-Backends kompiliert werden

Entitäten

  • Alle Entitäten teilen dieselbe entity_t-Struktur und besitzen Eigenschaften wie Position, Geschwindigkeit und Größe
  • Über Makros lässt sich die Basis-Entitätsstruktur erweitern
  • Jeder Entitätstyp muss ein entity_vtab_t bereitstellen, das Funktionszeiger liefert
  • Es können bis zu 64k aktive Entitäten verarbeitet werden

Kollisionserkennung und -behandlung

  • Kollisionen mit der Tilemap werden berechnet, um den exakten Kollisionspunkt zu finden
  • Kollisionen zwischen Entitäten werden separat behandelt, und jede Entität definiert, wie sie mit anderen Entitäten kollidiert

Rendering

  • Es werden OpenGL und ein Software-Renderer bereitgestellt
  • Das gesamte Rendering erfolgt über einen einzelnen Funktionsaufruf, wobei ein Texture Atlas zum Kombinieren von Texturen verwendet wird

Sound

  • Die Soundausgabe wird mit SDL2 oder Sokol verarbeitet
  • Es kann eine feste Anzahl von Quellen laden und eine feste Anzahl von Sounds gleichzeitig abspielen
  • Sounds werden automatisch verworfen und können dadurch wiederverwendet werden

Speicherverwaltung

  • Der Speicher wird über ein einzelnes Byte-Array namens "hunk" verwaltet
  • Für die Speicherallokation werden ein Bump Allocator und ein Temp Allocator verwendet
  • Das Freigeben von Speicher wird automatisch behandelt, sodass sich Nutzer nicht selbst darum kümmern müssen

Level-Editor

  • Der ursprüngliche Impact-Level-Editor "Weltmeister" ist enthalten
  • Er wurde in JavaScript geschrieben und für moderne Browserfunktionen aktualisiert
  • Über die File System API werden Dateien geladen und gespeichert

Demo-Spiele

  • Die beiden Spiele Biolab Disaster und Drop wurden nach C portiert, um die Funktionen von high_impact zu validieren

Erweiterbarkeit

  • high_impact ist eine traditionelle Spiel-Engine, bei der spielspezifischer Code zusätzlich geschrieben wird
  • Plattform und Renderer lassen sich erweitern, um andere Systeme zu unterstützen

Zusammenfassung von GN⁺

  • high_impact ist eine in C geschriebene 2D-Spiel-Engine, die einfache, aber leistungsfähige Funktionen bietet
  • Als Nachfolger der JavaScript-Spiel-Engine Impact kann sie auf verschiedenen Plattformen ausgeführt werden
  • Kernfunktionen für die Spieleentwicklung wie Speicherverwaltung und Kollisionserkennung sind einfach umgesetzt
  • Mit dem Level-Editor und den Demo-Spielen werden reale Anwendungsfälle gezeigt
  • Im Vergleich zu großen Engines wie Unity oder Unreal eignet sie sich für leichtere und einfachere Projekte

1 Kommentare

 
GN⁺ 2024-08-05
Hacker-News-Kommentare
  • Viele Webspiele wurden mit der Impact-Game-Engine entwickelt und bildeten die Grundlage für kommerzielle plattformübergreifende Titel wie Cross Code, Eliot Quest und XType Plus

    • Cross Code ist ein hervorragendes Spiel, und der Einsatz von Webtechnologien war beeindruckend
    • Ich denke, dass diese Engine dazu beigetragen haben dürfte, auf der Nintendo-Switch-Hardware eine hohe Leistung zu erzielen
  • "Thoughts on Flash" hätte die Webplattform retten können

    • Es dürfte Frust darüber gegeben haben, dass Adobe die Unterstützung der MacOS-Plattform aufgegeben hat
    • Die Mac-Version hinkte der Windows-Version immer hinterher
    • Jobs könnte gedacht haben, dass Adobe ohne Apple nicht existieren würde
  • Das Spiel sieht sehr sauber aus

  • high_impact ist keine "Bibliothek", sondern ein "Framework"

    • Die Geschäftslogik muss innerhalb des Frameworks geschrieben werden
    • Frameworks wurden oft abwertend als "Bibliotheken" beschrieben, die nicht gut mit anderen Dingen zusammenspielen
    • Es ist schön, dazu einmal eine positive Formulierung zu hören
  • Es freut mich, mich nach langer Zeit wieder bei meinem HN-Konto eingeloggt zu haben und Biolab Disaster erneut zu entdecken

  • Es war beeindruckend, mithilfe von UNION eine polymorphe Datenstruktur für Entitäten erstellt zu haben

    • Ich mag C immer noch sehr, es war die erste Sprache, die ich gelernt habe
    • C ist eine knappe Sprache, lässt sich aber sehr tiefgehend einsetzen
    • Das Spiel vermittelt ein Gefühl wie Commander Keen, und ich mochte dieses Franchise sehr
  • In Kombination mit 7Zip liefert das verlustfreie Dateiformat QOI eine bessere Leistung als verlustfreies PNG

  • Vielleicht, um die Akkulaufzeit der Spieler zu respektieren

  • Eine interessante Idee, Open Source für maximalen Lernwert, perfekte Umsetzung, klare Schreibe ohne Eitelkeit — ein großartiger Beitrag

    • Schon so etwas zu sehen, fühlt sich wie ein Privileg an
  • Als einer von 3000 Lizenzinhabern freue ich mich über die Wiederbelebung von Impact

    • Ich frage mich, ob es gut zu Zig passt
  • Sieht nach einer großartigen Game-Engine aus

    • Ich frage mich, warum im Artikel erwähnt wird, dass sie fast am Ende ihrer Lebensdauer sei
    • Ich frage mich, ob es neuere und bessere Engines gibt