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
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
"Thoughts on Flash" hätte die Webplattform retten können
Das Spiel sieht sehr sauber aus
high_impact ist keine "Bibliothek", sondern ein "Framework"
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
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
Als einer von 3000 Lizenzinhabern freue ich mich über die Wiederbelebung von Impact
Sieht nach einer großartigen Game-Engine aus