From facde12002422cbfa02f5eae8e3d52d7c9971a07 Mon Sep 17 00:00:00 2001 From: Leander Scherer Date: Mon, 9 Mar 2026 01:02:44 +0100 Subject: feat(game): add global settings and debug mode --- include/game.h | 5 --- include/globals.h | 13 ++++++++ src/main.c | 99 ++++++++++++++++++++++++++++++++++++------------------- 3 files changed, 78 insertions(+), 39 deletions(-) create mode 100644 include/globals.h diff --git a/include/game.h b/include/game.h index 9cdcf71..6b37293 100644 --- a/include/game.h +++ b/include/game.h @@ -8,9 +8,4 @@ typedef enum GameScreen { SCREEN_GAME_OVER } GameScreen; -#define SCREEN_WIDTH 1280 -#define SCREEN_HEIGHT 720 - -#define BACKGROUND_COLOR (Color){ 88, 68, 34, 255 } - #endif // GAME_H diff --git a/include/globals.h b/include/globals.h new file mode 100644 index 0000000..e7830de --- /dev/null +++ b/include/globals.h @@ -0,0 +1,13 @@ +#ifndef GLOBALS_H +#define GLOBALS_H + +#include "raylib.h" + +#define TILE_SIZE 16 +#define SCREEN_WIDTH 1280 +#define SCREEN_HEIGHT 720 +#define BACKGROUND_COLOR (Color){ 88, 68, 34, 255 } + +extern bool debugMode; + +#endif diff --git a/src/main.c b/src/main.c index 6e34985..c50669c 100644 --- a/src/main.c +++ b/src/main.c @@ -1,81 +1,110 @@ // src/main.c #include "raylib.h" #define RAYTMX_IMPLEMENTATION -#include "raytmx.h" - #include "game.h" +#include "player.h" +#include "map_manager.h" +#include "entity.h" +#include "globals.h" + +bool debugMode = false; int main(void) { InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Dungeon Crawler"); - SetTargetFPS(60); + SetTargetFPS(280); GameScreen currentScreen = SCREEN_TITLE; - TmxMap *map = LoadTMX("assets/maps/debug.tmx"); - if (map == NULL) { - CloseWindow(); + MapManager mapMgr = LoadGameMap("assets/maps/debug.tmx"); + + EntityManager entityMgr = InitEntityManager(100); + if (mapMgr.map) { + SpawnEntitiesFromMap(&entityMgr, mapMgr.map); } + + RaytmxExternalTileset elfTS = LoadTSX("assets/tilesets/elf.tsx"); + Player player = { + .position = { 200, 200}, + .speed = 120.0f, + .bounds = { 204, 204, 12, 12 }, + .tileset = elfTS.tileset, + .currentFrame = 0, + .frameTime = 0.0f, + .state = 0, // idle + .facingRight = true + }; - Camera2D camera; - camera.target.x = (float)(map->width * map->tileWidth) / 2.0f; - camera.target.y = (float)(map->height * map->tileHeight) / 2.0f; + Camera2D camera = { 0 }; camera.offset.x = (float)SCREEN_WIDTH / 2.0f; camera.offset.y = (float)SCREEN_HEIGHT / 2.0f; - camera.rotation = 0.0f; + camera.target = player.position; camera.zoom = 4.0f; - const float panSpeed = 20.0f; /* Pixel per second */ - while (!WindowShouldClose()) { + if (IsKeyPressed(KEY_B)) debugMode = !debugMode; + if (IsKeyPressed(KEY_R)) { + // Reload map and entities + UnloadGameMap(&mapMgr); + UnloadEntityManager(&entityMgr); + + mapMgr = LoadGameMap("assets/maps/debug.tmx"); + entityMgr = InitEntityManager(100); + if (mapMgr.map) { + SpawnEntitiesFromMap(&entityMgr, mapMgr.map); + } + + // Reset player position + player.position = (Vector2){ 200, 200 }; + player.bounds = (Rectangle){ 204, 204, 12, 12 }; + } + switch (currentScreen) { case SCREEN_TITLE: if (IsKeyPressed(KEY_ENTER)) currentScreen = SCREEN_PLAYING; break; case SCREEN_PLAYING: - if (IsKeyDown(KEY_UP)) - camera.target.y += panSpeed * GetFrameTime(); - if (IsKeyDown(KEY_DOWN)) - camera.target.y -= panSpeed * GetFrameTime(); - if (IsKeyDown(KEY_RIGHT)) - camera.target.x += panSpeed * GetFrameTime(); - if (IsKeyDown(KEY_LEFT)) - camera.target.x -= panSpeed * GetFrameTime(); if (IsKeyDown(KEY_ESCAPE)) currentScreen = SCREEN_PAUSED; + UpdatePlayer(&player, &mapMgr); + UpdateEntities(&entityMgr, &player, &mapMgr); + camera.target = player.position; break; case SCREEN_PAUSED: if (IsKeyDown(KEY_ESCAPE)) currentScreen = SCREEN_PLAYING; break; - case SCREEN_GAME_OVER: - if (IsKeyDown(KEY_ENTER)) - currentScreen = SCREEN_PLAYING; - break; + case SCREEN_GAME_OVER: + if (IsKeyDown(KEY_ENTER)) + currentScreen = SCREEN_PLAYING; + break; }; // --- DRAW --- BeginDrawing(); - ClearBackground(BLACK); - - + switch (currentScreen) { case SCREEN_TITLE: + ClearBackground(BLACK); DrawText("DUNGEON CRAWLER", 20, 20, 40, DARKGRAY); break; - case SCREEN_PAUSED: - DrawText("PAUSED", 20, 20, 40, DARKGRAY); + case SCREEN_PAUSED: + ClearBackground(BLACK); + DrawText("PAUSED", 20, 20, 40, DARKGRAY); break; case SCREEN_PLAYING: + ClearBackground(BACKGROUND_COLOR); BeginMode2D(camera); { - ClearBackground(BACKGROUND_COLOR); - AnimateTMX(map); - DrawTMX(map, &camera, NULL, 0, 0, WHITE); + DrawMap(&mapMgr); + DrawEntities(&entityMgr, mapMgr.map); + DrawPlayer(&player); } EndMode2D(); - break; + if (debugMode) DrawFPS(10, 10); + break; case SCREEN_GAME_OVER: + ClearBackground(BLACK); DrawText("GAME OVER", 20, 20, 40, RED); break; } @@ -83,7 +112,9 @@ int main(void) { EndDrawing(); } - UnloadTMX(map); + UnloadGameMap(&mapMgr); + UnloadEntityManager(&entityMgr); + UnloadTexture(player.tileset.image.texture); CloseWindow(); return 0; } -- cgit v1.3.1