#include "raylib.h" #include "string.h" #include #include #include "Sprite/sprite.h" #include "Input/inputHandler.h" #include "Entity/entity.h" #include "raymath.h" #include "IsometricMap/isometricMap.h" #include "game.h" #include "Ui/button.h" #include "Ui/uiContainer.h" #include "Ui/debug.h" #include "definitions.h" // TODO: Variable die den Maus Input freigibt solange nichts mit der Maus gemacht wurde // Sobald ein Button gedrückt wurde in diesem Frame oder rect gezogen wird oder so ist sind Maus Funktionen gesperrt // verhindert Spawnen von entities wenn man UI Elemente Drückt etc // Alternativ: Flag MouseOnHUD, aber nicht so universal einsetzbar, löst nur meine Probleme mit dem Spawnen bei klicks aufs HUD int main(){ InitWindow(1280, 720, "basic window"); Game *game = GameInit(); // Hides the operating systems own cursor HideCursor(); //SetTargetFPS(50); double frame = 0; while(!WindowShouldClose()){ // Drawen wir einfach immer den UI Container vom aktuellen Screen? Aktuell hat ja jeder Screen einen, es sollte also keine Probleme geben // Kann man natürlich auch noch oben in die einzelnen Cases schieben falls es mal Probleme machen sollte game->mouseOnUI = 0; UiContainerUpdateUiContainer(game->UiContainers[game->screen], game); // Moving cursor Sprite to Mouse Pos game->cursorSprite->x = GetMousePosition().x; game->cursorSprite->y = GetMousePosition().y; BeginDrawing(); // Drawing ist grundsätzlich immer aktiviert ClearBackground(RAYWHITE); // Screen wird in jedem Frame gecleared switch(game->screen){ // Screenspecific Code case SCREEN_EXIT: printf("EXIT \n"); return 0; case SCREEN_MAINMENU: // MainMenu hat aktuell nur paar Buttons, die unten gedrawed werden break; case SCREEN_OPTIONS: printf("OPTIONS \n"); return 0; case SCREEN_GAME: // Updating Entities frame += GetFrameTime(); if(frame >= ACT_TIME){ EntityListActAllEntities(game); frame = 0; } // Drawing IsometricMap BeginMode2D(*(game->camera)); // Sorgt dafür, dass die Kameraposition beachtet wird IsometricMapDraw(game); SpriteListDrawAllSprites(game->sprites, game->map, game->camera); EndMode2D(); // User Input Handling mouseInput(game); keyboardInput(game); break; case SCREEN_PAUSE: int halfScreenHeight = GetScreenHeight()/2; // Still drawing isometric map, which is not updated atm BeginMode2D(*(game->camera)); // Sorgt dafür, dass die Kameraposition beachtet wird IsometricMapDraw(game); SpriteListDrawAllSprites(game->sprites, game->map, game->camera); EndMode2D(); UiContainerDrawUiContainer(game->UiContainers[SCREEN_GAME]); // darkened background + "Paused" Text DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), (Color){0, 0, 0, 150}); int textWidthHalf = (MeasureText("Paused", 28)/2); DrawText("Paused", GetScreenWidth()/2 - textWidthHalf, (halfScreenHeight/2) - 14, 28, WHITE); // Controls lol DrawText("I: Zoom in", 5, halfScreenHeight, 16, WHITE); DrawText("K: Zoom out", 5, halfScreenHeight + 16, 16, WHITE); DrawText("P: Pause", 5, halfScreenHeight + 32, 16, WHITE); DrawText("WASD: Move Camera", 5, halfScreenHeight + 48, 16, WHITE); DrawText("ESC: Exit Game", 5, halfScreenHeight + 64, 16, WHITE); if(IsKeyPressed(KEY_P)){ game->screen = SCREEN_GAME; } break; default: printf("\n\n\n\n\n\n Wir haben ein problematisches Problem! Die Screen-ID [%d] ist nicht definiert. Hmmpf... früher bescheid wisse!\n\n\n\n\n\n", game->screen); return 1; break; } // Drawen wir einfach immer den UI Container vom aktuellen Screen? Aktuell hat ja jeder Screen einen, es sollte also keine Probleme geben // Kann man natürlich auch noch oben in die einzelnen Cases schieben falls es mal Probleme machen sollte UiContainerDrawUiContainer(game->UiContainers[game->screen]); // Dinge die grundsätzlich immer gedrawed werden sollen // Debug Menu, FPS anzeige, Cursor DebugDraw(game); DrawSpriteToScreen(game->cursorSprite); EndDrawing(); } CloseWindow(); return 0; }