Dungeon Crawler v1.5
Ü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 (5 Typen, upgradebar): Bis zu 3 Items können im Inventar liegen und mit den Tasten 1, 2 und 3 ausgerüstet werden. Jedes Item lässt sich im Shop in bis zu 6 Stufen aufwerten:
- SPD: Erhöht die Bewegungsgeschwindigkeit; die Dauer steigt mit dem Upgrade-Level.
- SHD: Das Schild absorbiert Treffer für begrenzte Zeit und ist ab der höchsten Stufe dauerhaft aktiv.
- BMB: Die Bombe zerstört Fallen im Umkreis; der Radius wächst mit dem Level.
- WLK: Mit Ghostwalk geht der Spieler durch Wände; die Dauer steigt mit dem Level.
- SWD: Das Schwert tötet Gegner im Umkreis; die Reichweite wächst mit dem Level.
- Achievements: Ein eigenes Menü zeigt 21 Erfolge, darunter gespielte Runden, gesammelte Münzen und Kills. Jeder Erfolg hat 6 Stufen mit Fortschrittsbalken.
- 36 Skins in 5 Rarity-Stufen: Common, Uncommon, Rare, Epic und Legendary sind im Shop und durch das Erreichen von Achievements erhältlich.
- Musiksystem: Hintergrundmusik und Soundeffekte wurden über raylib AudioStream eingebunden.
- Settings-Menü:Audioregler, Toggle-Enemies, Fullscreen, und visuelle Einstellungen können verändert werden.
Zukünftige Features
Was wird noch kommen?
- v1.6 Chambers of Chaos: Es wird 5 neue Leveltypen hinzugefügt.
- Bossekämpfe Ein Boss, der Feuer spuckt, Gegner beschwört und bezwungen werden muss
- Alternative Level DER BODEN IST LAVA, Fallenräume ohne Gegner und dunkele Räume werden hinzugefügt
- Mehr Musik4+ Neue Tracks werden hinzugefügt
- Skin ReworkBlade Legend, Ascendant & Constellation bekommen ein neues Design
- Neue Skins, Achievements & StatsDurch die neuen Leveltypen werden zusätzliche Skins, Achievements und Statistiken hinzugefügt
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