#include #include #include #include #include #include #include #include #include "breakout.h" #include "vector.h" #include "startmenu.h" #include "gamestate.h" #include "highscores.h" #ifndef __nullptr__ #define Nullptr(type) (type *)0 #endif // __nullptr__ #define ae "\204" #define oe "\224" #define ue "\201" #define ss "\341" void INITIALIZE(); void QUIT(); void HandleSDLEvents(); void DrawBackground(SDL_Renderer * renderer); void printFontStyle(TTF_Font * ffont); void mousePress(SDL_MouseButtonEvent b); void keyPress(SDL_KeyboardEvent b); void windowChanged(SDL_WindowEvent b); void toggleFullscreen(); int readIntFromIO(char * m1, char * m2, char * m3, int min, int max); const int width = 1920; const int height = 1080; float XScale = 1.0f, YScale = 1.0f; int numKeys; const Uint8 * keystate; // TODO: export all this into scenery and enemy waves SDL_Window * window; SDL_Renderer * renderer; SDL_Event event; bool running = true, fullscreen = false; GameState gameState = Game; Scenery scenery; int main(int argc, char * args[]){ printf("Spielbereiche\n\t- 1: Hauptmen"ue "\n\t- 2: Spiel\n\t- 3: Level Select\n\t- 4: Settings\n\t- 5: Highscores\n"); gameState = readIntFromIO("W"ae "hle einen Spielbereich aus, den du testen m"oe "chtest:", "Fehlerhafte Eingabe!\n", "%d ist kein g"ue "ltiger Spielbereich!\n", 1, 5); INITIALIZE(); while (running) { // Gameloop HandleSDLEvents(); DrawBackground(renderer); switch (gameState) { case Game: BREAKOUT_Update(&scenery, keystate); BREAKOUT_Draw(&scenery, renderer); break; case MainMenu: // Startmenu_Update(keystate); Startmenu_Draw(renderer); break; case Highscores: HIGHSCORES_Draw(renderer); break; default: printf("Unknow state was updated: %d\n", gameState); } // DrawText(renderer, "FICK DICH"); SDL_RenderPresent(renderer); } QUIT(); return 0; } /* main */ void HandleSDLEvents(){ while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: printf("NOTICE: User manually quit window!\n"); running = false; break; case SDL_KEYDOWN: if (event.key.keysym.scancode == SDL_SCANCODE_ESCAPE) running = false; else keyPress(event.key); break; case SDL_MOUSEBUTTONDOWN: mousePress(event.button); break; case SDL_WINDOWEVENT: windowChanged(event.window); break; } } } void mousePress(SDL_MouseButtonEvent b){ // Debug prop if (b.button == SDL_BUTTON_LEFT) { printf("Left mouse pressed at %d, %d\n", b.x, b.y); } else if (b.button == SDL_BUTTON_RIGHT) { printf("Right mouse pressed...\n"); } else { printf("Unknown mouse button pressed: %d\n", b.button); } } void keyPress(SDL_KeyboardEvent b){ // Debug prop printf("Key pressed: ID is %d\n", b.keysym.scancode); if (b.keysym.scancode == SDL_SCANCODE_F11 || b.keysym.scancode == SDL_SCANCODE_5) { toggleFullscreen(); } } void toggleFullscreen(){ if (fullscreen) { SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP); } else { SDL_SetWindowFullscreen(window, 0); } fullscreen = !fullscreen; } void windowChanged(SDL_WindowEvent b){ // Debug prop switch (b.event) { case SDL_WINDOWEVENT_SIZE_CHANGED: printf("Window was resized to (%d|%d)!\n", event.window.data1, event.window.data2); // BREAKOUT_ChangeSize(event.window.data1, event.window.data2); XScale = ((double)(event.window.data1) / (double)width); YScale = ((double)(event.window.data2) / (double)height); SDL_RenderSetScale(renderer, XScale, YScale); break; } } void DrawBackground(SDL_Renderer * renderer){ SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_RenderClear(renderer); } /* DrawFrame */ void INITIALIZE() { printf("Initializing started...\n"); srand(time(NULL)); if (SDL_Init(SDL_INIT_EVERYTHING) != 0) printf("SDL could not initialize! Error: %s\n", SDL_GetError()); else printf("SDL was successfully initialized!\n"); keystate = SDL_GetKeyboardState(&numKeys); if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG) printf("IMG could not initialize! Error: %s\n", IMG_GetError()); else printf("IMG was successfully initialized!\n"); if (TTF_Init() == -1) printf("TTF could not initialize! Error: %s\n", TTF_GetError()); else printf("TTF was successfully initialized!\n"); window = SDL_CreateWindow("BreakING", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL); SDL_SetWindowResizable(window, true); printf("Window was created!\n"); renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); printf("Renderer was created!\n"); BREAKOUT_INITIALIZE(renderer, width, height); scenery = BREAKOUT_CreateDefault(); Load_Textures(renderer); HIGHSCORES_Initialize(); printf("Initializing finished!\n"); } /* INITIALIZE */ void QUIT(){ printf("De-initializing started...\n"); HIGHSCORES_Deinitialize(); BREAKOUT_DestroyObject(&scenery); BREAKOUT_DEINITIALIZE(); TTF_Quit(); IMG_Quit(); printf("Quitting SDL_IMG finished!\n"); SDL_DestroyRenderer(renderer); printf("De-initializing renderer finished!\n"); SDL_DestroyWindow(window); printf("De-initializing window finished!\n"); SDL_Quit(); printf("Quitting SDL finished!\n"); printf("De-initializing finished!\n"); } /* QUIT */ int readIntFromIO(char * m1, char * m2, char * m3, int min, int max){ int nitems, num; while (1) { while (1) { printf(m1); nitems = scanf("%d", &num); if (nitems == 0) { printf(m2); fflush(stdin); continue; } else { break; } } if ((num < min) || (num > max)) { printf(m3, num); } else { break; } } fflush(stdin); return(num); } /* readIntFromIO */