Dungeon Crawler v1.7
Über das Projekt
Was ist der Dungeon Crawler?
Der Dungeon Crawler war mein erstes größeres C-Projekt. Ziel war es, ein vollständig spielbares Spiel mit Standard-C zu bauen.
Die Karte wird aus einem zweidimensionalen Array aufgebaut. Wände, freie Felder, Gegner und Items haben jeweils eigene Zeichen. Der Spieler bewegt sich mit den Pfeiltasten und muss Gegnern ausweichen, während er Schätze einsammelt.
Features
Was kann das Spiel?
- Grafisches Rendering: Das Spiel läuft in einem raylib-Fenster (1280×720); Karte, Spieler, Gegner und Effekte werden GPU-beschleunigt gezeichnet.
- Spielerbewegung: Steuerung mit WASD oder Pfeiltasten, Kollisionserkennung mit Wänden, Fallen und anderen Objekten.
- Gegner-KI: Gegner verfolgen aktiv den Spieler (Pathfinding entlang X/Y-Achse); bei Kontakt stirbt der Spieler. Gegner können per Taste ein- und ausgeschaltet werden.
- Rundenbasiertes Fortschrittssystem: Jede Runde besteht aus einer prozedural generierten Karte. Der Schatz beendet die Runde; ein Portal überspringt direkt zur nächsten.
- Münzen & Fallen: Münzen erhöhen den Punktestand. Fallen töten den Spieler sofort, sofern kein Schild aktiv ist.
- Partikeleffekte & Kamera: Explosionen, Münzfunken und Todeseffekte werden als Partikelsystem dargestellt; die Kamera folgt dem Spieler weich durch die Karte.
- Highscore & Persistenz: Beste Runde, meiste Schätze, meiste Münzen und gesamte Lifetime-Coins werden in einer Datei gespeichert und im Menü angezeigt.
- Game Over & Neustart: Nach dem Tod kann das Spiel neu gestartet oder ins Hauptmenü gewechselt werden.
- Item-System (6 Typen, upgradebar): Bis zu 3 Items können im Inventar liegen und mit den Tasten 1-5 genutzt werden. Jedes Item lässt sich im Shop aufwerten.
- Achievements: Ein eigenes Menü zeigt 21 Erfolge, darunter gespielte Runden, gesammelte Münzen und Kills. Jeder Erfolg hat 6 Stufen mit Fortschrittsbalken.
- 43 Skins in 5 Rarity-Stufen: Common, Uncommon, Rare, Epic und Legendary sind im Shop und durch das Erreich
- Musiksystem: Hintergrundmusik und Soundeffekte wurden über raylib AudioStream eingebunden.
- Settings-Menü:Audioregler, Toggle-Enemies, Fullscreen, und visuelle Einstellungen können verändert werden.
- Bossekämpfe: Ein Boss, der Feuer spuckt, Gegner beschwört und alle 10 Levelbezwungen werden muss
- Alternative Level: DER BODEN IST LAVA, Fallenräume ohne Gegner, Münzräume und dunkele Räume bieten ein alternatives Erlebnis
In der Zukunft
Was wird noch kommen?
- v1.7 Webversion Das Spiel wird für das Web kompelliert
- v1.7 Handyversion Das Spiel wird für mobile Geräte kompelliert
Screenshots
Einblicke ins Spiel
Die Karte mit Spieler, Gegnern und Items
Links: Startmenü | Rechts: Game Over
Technisches
Wie wurde es gebaut?
Das gesamte Projekt besteht weiterhin aus einer einzigen .c-Datei, mittlerweile auf ~5.350 Zeilen Code angewachsen. Gebaut ist es mit raylib, einer C-Bibliothek für 2D/3D-Grafik.
Die Karte ist ein statisches 2D-Array aus char-Zeichen (char map[MAP_ROWS][MAP_COLS]),
wird zur Laufzeit prozedural erzeugt und ist nicht fest im Quelltext hinterlegt.
for (int y = 0; y < mh; y++)
for (int x = 0; x < mw; x++) {
int r = GetRandomValue(0,99);
map[y][x] = (r < tp) ? '#' : (r < xp) ? '+' : '.';
}
/* Tile-Map-Konstanten */
'#' = Wand, '.' = Boden, '+' = Falle
'T' = Schatz, 'O' = Portal, '$' = Münze
'I' = Item, 'X' = Gegner
Rendering mit raylib: Jedes Tile wird als 32×32 Pixel gerendert. Wände bekommen 3D-Bevel-Effekte, Items und Gegner sind animierte Formen/Kreise. Die Kamera folgt dem Spieler weich; Partikeleffekte werden pro Frame aktualisiert.
Eingabe mit raylib: Tasteneingaben erfolgen über IsKeyPressed() und IsKeyDown(). Die Eingabe funktioniert plattformübergreifend ohne spezielle Anpassungen.
Spiellogik: Eine State Machine (`GState`: MENU → PLAY → DEAD/NEXT) steuert den Flow. Die Hauptschleife nutzt Delta-Time (`GetFrameTime()`) für konstante Physik bei 60 FPS. Gegner-KI, Partikel, Timer und Kamerabewegung werden alle frame-unabhängig mit `dt` aktualisiert.
Persistenz: Highscores (beste Runde, Schätze, Münzen) werden in eine Datei geschrieben und geladen (`STATS_FILE`).
Shop & Fortschritt: Jedes der 5 Items hat ein eigenes Upgrade-Level, das per Array (Dauer/Reichweite pro Stufe) ausgelesen wird; Skin-Besitz, Levels und Coins werden separat gespeichert (`SHOP_FILE`). Die 30 Skins sind nach Seltenheit gestaffelt und werden je nach Stufe mit eigenen Zeichenfunktionen gerendert: von einfarbigen Common-Skins bis zu animierten Epic-Skins. Achievements laufen über dieselben Stats-Werte und werden live mit Zielwerten je Stufe abgeglichen.
Rückblick
Was ich gelernt habe
Mit C, Zeigern und Arrays habe ich die Spiellogik umgesetzt. Mit Raylib habe ich eine grafische Oberfläche aufgebaut.
Später habe ich mit Emscripten eine Web-Integration umgesetzt. Das Spiel läuft dadurch auch im Browser. Für WebAssembly und unterschiedliche Build-Ziele waren zusätzliche Anpassungen nötig.
Mit dem Projekt habe ich meine C-Kenntnisse vertieft und gelernt, den Code zu strukturieren, wenn neue Mechaniken dazukommen. Außerdem kann ich besser nachvollziehen, wie Spiellogik, Rendering und Benutzereingaben zusammenspielen.
Versionshistorie