#include "render.h" #include "SDL.h" #include "game.h" #include "snake.h" #include "food.h" #include "config.h" #include "menu.h" #include "common.h" #include "files.h" #include <stdio.h> void renderGame(){ SDL_SetRenderDrawColor(game.renderer, 0, 0, 0, 255); SDL_RenderClear(game.renderer); SDL_Rect rect; //Rechteck anlegen rect.w = config.blockSizePx; //Breite festlegen rect.h = config.blockSizePx; //Höhe festlegen //_______Head kreieren__________________________________________________ SDL_SetRenderDrawColor(game.renderer, 0, 255, 0, 255); //RGB-Farbe Kopf rect.x = (game.snake.headX * config.blockSizePx); //Abstand links rect.y = (game.snake.headY * config.blockSizePx); //Abstand rechts SDL_RenderFillRect(game.renderer, &rect); //Rechteck rendern //______Tail kreieren_________________________________________________________________ for(int i = 1; i<game.snake.length; i++){ SDL_SetRenderDrawColor(game.renderer, 15, 179, 15, 255); //RGB-Farbe Tail rect.x = (game.snake.tail[i][0] * config.blockSizePx); //Abstand links rect.y = (game.snake.tail[i][1] * config.blockSizePx); //Abstand rechts SDL_RenderFillRect(game.renderer, &rect); //Rechteck rendern } //______Portal kreieren________________________________________________________________________ for (int i = 0; i < game.map.portalCount; i++) { switch(i) { //Farben je nach Start-Portal-Nr. case 0: SDL_SetRenderDrawColor(game.renderer, 90, 150, 255, 255); break; //Start: hellblau case 1: SDL_SetRenderDrawColor(game.renderer, 255, 150, 255, 255); break; //Start: rosa default: SDL_SetRenderDrawColor(game.renderer, 255, 150, 150, 255); break; //Start: hellrot } //Start-Portal rect.x = (game.map.portals[i].posX * config.blockSizePx); rect.y = (game.map.portals[i].posY * config.blockSizePx); SDL_RenderDrawRect(game.renderer, &rect); //Rechteck rendern switch(i) { //Farben je nach Ausgangs-Portal-Nr. case 0: SDL_SetRenderDrawColor(game.renderer, 45, 45, 255, 255); break; //Ausgang: dunkelblau case 1: SDL_SetRenderDrawColor(game.renderer, 204, 0, 204, 255); break; //Ausgang: violett default: SDL_SetRenderDrawColor(game.renderer, 255, 50, 0, 255); break; //Ausgang: rot } //Ausgangs-Portal rect.x = (game.map.portals[i].targetX * config.blockSizePx); rect.y = (game.map.portals[i].targetY * config.blockSizePx); SDL_RenderDrawRect(game.renderer, &rect); //Rechteck rendern } //_______Food kreieren_________________________________________________________________________ SDL_SetRenderDrawColor(game.renderer, 255, 200, 0, 255); //RGB-Farbe Food rect.x = (game.foodX*config.blockSizePx); //Abstand links rect.y = (game.foodY* config.blockSizePx); //Abstand rechts SDL_RenderFillRect(game.renderer, &rect); //Rechteck rendern SDL_SetRenderDrawColor(game.renderer, 255, 140, 0, 255); //RGB-Farbe Food Rahmen SDL_RenderDrawRect(game.renderer, &rect); //Rechteck rendern //______Collisions kreieren_________________________________________________________________________ for(int i = 0; i < game.map.collisionCount; i++){ SDL_SetRenderDrawColor(game.renderer, 112, 128, 144, 255); //RGB-Farbe Wand rect.x = (game.map.collisions[i].posX*config.blockSizePx); //Abstand links rect.y = (game.map.collisions[i].posY* config.blockSizePx); //Abstand rechts SDL_RenderFillRect(game.renderer, &rect); //Rechteck rendern SDL_SetRenderDrawColor(game.renderer, 80, 90, 100, 255); //RGB-Farbe Wand-Rand SDL_RenderDrawRect(game.renderer, &rect); //Rechteck rendern } //_________________Augen___________________________________________________ SDL_SetRenderDrawColor(game.renderer, 255, 255, 255, 255); rect.w = config.blockSizePx/4; //Breite festlegen rect.h = config.blockSizePx/4; //Höhe festlegen if (game.snake.direction == LEFT || game.snake.direction == RIGHT){ //oberes Auge rect.x = (game.snake.headX * config.blockSizePx) + config.blockSizePx/2.5; rect.y = (game.snake.headY * config.blockSizePx) + config.blockSizePx/5; SDL_RenderFillRect(game.renderer, &rect); //Rechteck rendern //unteres Auge rect.x = (game.snake.headX * config.blockSizePx) + config.blockSizePx/2.5; rect.y = (game.snake.headY * config.blockSizePx) + config.blockSizePx/1.7; SDL_RenderFillRect(game.renderer, &rect); //Rechteck rendern } else { //linkes Auge rect.x = (game.snake.headX * config.blockSizePx) + config.blockSizePx/5; rect.y = (game.snake.headY * config.blockSizePx) + config.blockSizePx/2.5; SDL_RenderFillRect(game.renderer, &rect); //Rechteck rendern //rechtes Auge rect.x = (game.snake.headX * config.blockSizePx) + config.blockSizePx/1.7; //Abstand links rect.y = (game.snake.headY * config.blockSizePx) + config.blockSizePx/2.5; SDL_RenderFillRect(game.renderer, &rect); //Rechteck rendern } SDL_RenderDrawRect(game.renderer, &rect); //Rechteck rendern //______Fenster aktualisieren____________________________________________ SDL_RenderPresent(game.renderer); //Fenster aktualisieren } //-------------------------------------------------------------- //-----------------START MENU----------------------------------- //-------------------------------------------------------------- void renderStartMenu() { //=========== only first loop ================ if(ttlStorage.lastTimeStep == 0) { ttlStorage.ptrFont_200 = TTF_OpenFont("assets/fonts/Quirkus.ttf", ttlStorage.fontSize_200); ttlStorage.ptrFont_30 = TTF_OpenFont("assets/fonts/Quirkus.ttf", ttlStorage.fontSize_30); SDL_Color textColor1 = {255, 0, 255}; // rosa Text SDL_Color textColor2 = {255, 200, 0}; // oranger Text SDL_Color textColor3 = {0, 255, 0}; // grüner Text SDL_Color textColor4 = {255, 0, 0}; // rot Text SDL_Color textColor5 = {0, 255, 255}; // türkiser Text SDL_Color textColor6 = {255, 255, 255}; // weißer Text ttlStorage.textColour[0] = textColor1; // rosa ttlStorage.textColour[1] = textColor2; // orange ttlStorage.textColour[2] = textColor3; // grün ttlStorage.textColour[3] = textColor4; // rot ttlStorage.textColour[4] = textColor5; // türkis ttlStorage.textColour[5] = textColor6; // weiß // text in start screen const char* textLines[] = { "Snake++", "In Pixeln bunt, sie schlaengelt flink,", "Durch Mauern, Portale, ohne Blink.", "Starte das Spiel, sei klug und schnell,", "Die Schlange wartet, auf dein Pixel-Ziel!", "-- ENTER --" }; // render game name (SNAKE++) bigger than poem ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_200, textLines[0], ttlStorage.textColour[0]); ttlStorage.textTextures[0] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); // render poem for (int i = 1; i < (MAX_LINES_STARTSCREEN - 1); ++i) { ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_30, textLines[i], ttlStorage.textColour[i]); ttlStorage.textTextures[i] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); } // render ENTER ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_30, textLines[MAX_LINES_STARTSCREEN-1], ttlStorage.textColour[5]); ttlStorage.textTextures[MAX_LINES_STARTSCREEN-1] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); } //=========== is always performerd ================ SDL_RenderClear(game.renderer); int textWidth, textHeight; // print game name ttlStorage.textPrintPosition = (config.windowSize) / 9; // print position for game name (SNAKE++) SDL_QueryTexture(ttlStorage.textTextures[0], NULL, NULL, &textWidth, &textHeight); SDL_Rect dstRect = { (config.windowSize - textWidth) / 2, ttlStorage.textPrintPosition, textWidth, textHeight }; SDL_RenderCopy(game.renderer, ttlStorage.textTextures[0], NULL, &dstRect); // print poem ttlStorage.textPrintPosition = (config.windowSize) / 2.7; // change print position for poem for (int i = 1; i < (MAX_LINES_STARTSCREEN-1); ++i) { SDL_QueryTexture(ttlStorage.textTextures[i], NULL, NULL, &textWidth, &textHeight); SDL_Rect dstRect = { (config.windowSize - textWidth) / 2, ttlStorage.textPrintPosition, textWidth, textHeight }; SDL_RenderCopy(game.renderer, ttlStorage.textTextures[i], NULL, &dstRect); ttlStorage.textPrintPosition += textHeight; // increase print position } //print ENTER every second cycle if(ttlStorage.showEnter) { ttlStorage.textPrintPosition = (config.windowSize / 1.5); // print position for ENTER SDL_QueryTexture(ttlStorage.textTextures[MAX_LINES_STARTSCREEN-1], NULL, NULL, &textWidth, &textHeight); SDL_Rect dstRect1 = { (config.windowSize - textWidth) / 2, ttlStorage.textPrintPosition, textWidth, textHeight }; SDL_RenderCopy(game.renderer, ttlStorage.textTextures[MAX_LINES_STARTSCREEN-1], NULL, &dstRect1); } // update screen SDL_RenderPresent(game.renderer); ttlStorage.lastTimeStep = GET_TIME_MS(); return; } //-------------------------------------------------------------- //-------------------SETTINGS----------------------------------- //-------------------------------------------------------------- void renderSettings() { int textWidth, textHeight; // auxiliary variables for printing // text in menu settings static char* textLinesInMenu[MAX_LINES_SETTINGS] = { "Fuer Infos zum Gameplay, sowie einigen Shortcuts druecken Sie bitte F1", " ", " ", "Bitte geben Sie ihren Nickname ein: ", " ", " ", "Bitte geben Sie ein Schwierigkeitslevel ein:", "1 fuer Beginner - 2 fuer Fortgeschrittener - 3 fuer Profi", " ", " ", "Bitte waehlen Sie eine Map:", "1 fuer Standard - 2 fuer Leer - 3 fuer Intermediate", " ", "-- ENTER --" }; //=========== only first loop ================ if(ttlStorage.lastTimeStep == 0) { printf("In first loop\n"); ttlStorage.ptrFont_20 = TTF_OpenFont("assets/fonts/Prototype.ttf", ttlStorage.fontSize_20); SDL_StartTextInput(); // start text input } //=========dependent of which text is currently entered(userName, difficultyLevel, userSelectedMap) ========= switch(ttlStorage.inputStatus) { //=== no user inputs === case 0: //--- rendering --- for (int i = 0; i < 4; ++i) { ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_20, textLinesInMenu[i], ttlStorage.textColour[5]); ttlStorage.textTextures[i] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); } ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_20, ttlStorage.textInput, ttlStorage.textColour[5]); ttlStorage.textTextures[4] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); SDL_RenderClear(game.renderer); //--- printing --- ttlStorage.textPrintPosition = 0; // first print position for (int i = 0; i < 5; ++i) { SDL_QueryTexture(ttlStorage.textTextures[i], NULL, NULL, &textWidth, &textHeight); SDL_Rect dstRect = { 1, ttlStorage.textPrintPosition, textWidth, textHeight }; SDL_RenderCopy(game.renderer, ttlStorage.textTextures[i], NULL, &dstRect); ttlStorage.textPrintPosition += textHeight; // increase print position } break; // === one user input === case 1: textLinesInMenu[4] = ttlStorage.userName; //--- rendering --- for (int i = 0; i < 8; ++i) { ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_20, textLinesInMenu[i], ttlStorage.textColour[5]); ttlStorage.textTextures[i] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); } ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_20, ttlStorage.textInput, ttlStorage.textColour[5]); ttlStorage.textTextures[8] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); SDL_RenderClear(game.renderer); //---printing --- ttlStorage.textPrintPosition = 0; // first print position for (int i = 0; i < 9; ++i) { SDL_QueryTexture(ttlStorage.textTextures[i], NULL, NULL, &textWidth, &textHeight); SDL_Rect dstRect = { 1, ttlStorage.textPrintPosition, textWidth, textHeight }; SDL_RenderCopy(game.renderer, ttlStorage.textTextures[i], NULL, &dstRect); ttlStorage.textPrintPosition += textHeight; // increase print position } break; //=== two user inputs === case 2: textLinesInMenu[8] = ttlStorage.numbers[0]; //--- rendering --- for (int i = 0; i < 12; ++i) { ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_20, textLinesInMenu[i], ttlStorage.textColour[5]); ttlStorage.textTextures[i] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); } ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_20, ttlStorage.textInput, ttlStorage.textColour[5]); ttlStorage.textTextures[12] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); SDL_RenderClear(game.renderer); //---printing --- ttlStorage.textPrintPosition = 0; // first print position for (int i = 0; i < 13; ++i) { SDL_QueryTexture(ttlStorage.textTextures[i], NULL, NULL, &textWidth, &textHeight); SDL_Rect dstRect = { 1, ttlStorage.textPrintPosition, textWidth, textHeight }; SDL_RenderCopy(game.renderer, ttlStorage.textTextures[i], NULL, &dstRect); ttlStorage.textPrintPosition += textHeight; // increase print position } break; //=== user inputs completely case 3: textLinesInMenu[12] = ttlStorage.numbers[1]; //--- rendering --- for (int i = 0; i < (MAX_LINES_SETTINGS - 1); ++i) { ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_20, textLinesInMenu[i], ttlStorage.textColour[5]); ttlStorage.textTextures[i] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); } ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_20, textLinesInMenu[MAX_LINES_SETTINGS - 1], ttlStorage.textColour[5]); ttlStorage.textTextures[MAX_LINES_SETTINGS - 1] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); SDL_RenderClear(game.renderer); //---printing --- ttlStorage.textPrintPosition = 0; // first print position for (int i = 0; i < (MAX_LINES_SETTINGS - 1); ++i) { SDL_QueryTexture(ttlStorage.textTextures[i], NULL, NULL, &textWidth, &textHeight); SDL_Rect dstRect = { 1, ttlStorage.textPrintPosition, textWidth, textHeight }; SDL_RenderCopy(game.renderer, ttlStorage.textTextures[i], NULL, &dstRect); ttlStorage.textPrintPosition += textHeight; // increase print position } //print ENTER every second cycle if(ttlStorage.showEnter) { ttlStorage.textPrintPosition = (config.windowSize / 1.5); // print position for ENTER SDL_QueryTexture(ttlStorage.textTextures[MAX_LINES_SETTINGS-1], NULL, NULL, &textWidth, &textHeight); SDL_Rect dstRect1 = { (config.windowSize - textWidth) / 2, ttlStorage.textPrintPosition, textWidth, textHeight }; SDL_RenderCopy(game.renderer, ttlStorage.textTextures[MAX_LINES_SETTINGS-1], NULL, &dstRect1); } break; } // update screen SDL_RenderPresent(game.renderer); ttlStorage.lastTimeStep = GET_TIME_MS(); return; } //-------------------------------------------------------------- //-------------------INFO SCREEN-------------------------------- //-------------------------------------------------------------- void renderInfoScreen() { //=========== only first loop ================ if(ttlStorage.lastTimeStep == 0) { // text in start screen const char* textLines[] = { " STEUERUNG: W (nach oben)", " A (nach links)", " S (nach unten)", " D (nach rechts) ", " oder: Pfeiltasten ", " ", " ", " PAUSE: p", " oder: Leertaste", " ", " ", "SPIEL VERLASSEN: q ", " ", " ", " ", "By Jonas Schoenberger, Johannes Graf und Julia Steinberger", "-- ENTER --" }; // render setting screen for (int i = 0; i < MAX_LINES_INFOSCREEN; ++i) { ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_20, textLines[i], ttlStorage.textColour[5]); ttlStorage.textTextures[i] = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_FreeSurface(ttlStorage.textSurface); } } //=========== is always performerd ================ SDL_RenderClear(game.renderer); int textWidth, textHeight; // print settings ttlStorage.textPrintPosition = 0; // first print position for (int i = 0; i < (MAX_LINES_INFOSCREEN - 1); ++i) { SDL_QueryTexture(ttlStorage.textTextures[i], NULL, NULL, &textWidth, &textHeight); SDL_Rect dstRect = { 1, ttlStorage.textPrintPosition, textWidth, textHeight }; SDL_RenderCopy(game.renderer, ttlStorage.textTextures[i], NULL, &dstRect); ttlStorage.textPrintPosition += textHeight; // increase print position } //print ENTER every second cycle if(ttlStorage.showEnter) { ttlStorage.textPrintPosition = (config.windowSize / 1.5); // print position for ENTER SDL_QueryTexture(ttlStorage.textTextures[MAX_LINES_INFOSCREEN-1], NULL, NULL, &textWidth, &textHeight); SDL_Rect dstRect1 = { (config.windowSize - textWidth) / 2, ttlStorage.textPrintPosition, textWidth, textHeight }; SDL_RenderCopy(game.renderer, ttlStorage.textTextures[MAX_LINES_INFOSCREEN-1], NULL, &dstRect1); } // update screen SDL_RenderPresent(game.renderer); ttlStorage.lastTimeStep = GET_TIME_MS(); return; } //-------------------------------------------------------------- //-------------------RENDER LEADERBOARD------------------------- //-------------------------------------------------------------- void renderLeaderboard() { #define NUM_COLUMNS 4 char* menuDescription[] ={"LEADERBOARD"}; char* columnDescriptions[NUM_COLUMNS] = { "Score", "Spieler", "Schwierigkeitslevel", "Map" }; SDL_SetRenderDrawColor(game.renderer, 0, 0, 0, 255); SDL_RenderClear(game.renderer); int rowHeight = config.windowSize / (MAX_PRINTED_SCORES * 10); // Höhe einer Zeile int columnWidth = config.windowSize / NUM_COLUMNS; // Breite einer Spalte int textWidth, textHeight; // rendering 'LEADERBOARD' ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_30, menuDescription[0], ttlStorage.textColour[5]); ttlStorage.textTexture = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_QueryTexture(ttlStorage.textTexture, NULL, NULL, &textWidth, &textHeight); SDL_Rect dstRect = {1 , 0, textWidth, textHeight }; SDL_RenderCopy(game.renderer, ttlStorage.textTexture, NULL, &dstRect); SDL_FreeSurface(ttlStorage.textSurface); SDL_DestroyTexture(ttlStorage.textTexture); // rendering columns description for (int i = 0; i < NUM_COLUMNS; ++i) { ttlStorage.textSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_30, columnDescriptions[i], ttlStorage.textColour[5]); ttlStorage.textTexture = SDL_CreateTextureFromSurface(game.renderer, ttlStorage.textSurface); SDL_Rect textRect; textRect.x = i * columnWidth + (columnWidth - ttlStorage.textSurface->w) / 2 - 30; // Zentrieren textRect.y = 50; // Y-Koordinate für die Spaltenbeschreibung textRect.w = ttlStorage.textSurface->w; textRect.h = ttlStorage.textSurface->h; SDL_RenderCopy(game.renderer, ttlStorage.textTexture, NULL, &textRect); SDL_FreeSurface(ttlStorage.textSurface); SDL_DestroyTexture(ttlStorage.textTexture); } // rendering score data for (int i = 0; i < MAX_PRINTED_SCORES; ++i) { char playerName[50]; // temporary buffer for text char map[50]; // temporary buffer for text strcpy(playerName, topScores[i].playerName); strcpy(map, topScores[i].map); // player name SDL_Surface* playerNameSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_30, playerName, ttlStorage.textColour[5]); SDL_Texture* playerNameTexture = SDL_CreateTextureFromSurface(game.renderer, playerNameSurface); // map name SDL_Surface* mapSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_30, map, ttlStorage.textColour[5]); SDL_Texture* mapTexture = SDL_CreateTextureFromSurface(game.renderer, mapSurface); // score SDL_Surface *scoreSurface = NULL; char numberScore[30]; // buffer for number 'score' snprintf(numberScore, sizeof(numberScore), "%d", topScores[i].score); scoreSurface = TTF_RenderText_Solid(ttlStorage.ptrFont_30, numberScore, ttlStorage.textColour[5]); SDL_Texture *numberTexture1 = SDL_CreateTextureFromSurface(game.renderer, scoreSurface); // difficulty SDL_Surface *difficultySurface = NULL; char numberDifficulty[30]; // buffer for number 'difficulty' snprintf(numberDifficulty, sizeof(numberDifficulty), "%d", topScores[i].difficulty); difficultySurface = TTF_RenderText_Solid(ttlStorage.ptrFont_30, numberDifficulty, ttlStorage.textColour[5]); SDL_Texture *numberTexture2 = SDL_CreateTextureFromSurface(game.renderer, difficultySurface); int numberS = 70; //x distance int textPlayer = 220; //x distance int numberD = 470; //x distance int textMap = 620; //x distance int y = 90 + i*30; //y distance SDL_Rect scoreRect = {numberS, y, scoreSurface->w, scoreSurface->h}; SDL_Rect playerNameRect = {textPlayer, y, playerNameSurface->w, playerNameSurface->h }; SDL_Rect difficultyRect = {numberD, y, difficultySurface->w, difficultySurface->h}; SDL_Rect mapNameRect = {textMap, y, mapSurface->w, mapSurface->h }; SDL_RenderCopy(game.renderer, numberTexture1, NULL, &scoreRect); SDL_RenderCopy(game.renderer, playerNameTexture, NULL, &playerNameRect); SDL_RenderCopy(game.renderer, numberTexture2, NULL, &difficultyRect); SDL_RenderCopy(game.renderer, mapTexture, NULL, &mapNameRect); SDL_FreeSurface(playerNameSurface); SDL_FreeSurface(mapSurface); SDL_FreeSurface(scoreSurface); SDL_FreeSurface(difficultySurface); SDL_DestroyTexture(playerNameTexture); SDL_DestroyTexture(mapTexture); SDL_DestroyTexture(numberTexture1); SDL_DestroyTexture(numberTexture2); } SDL_RenderPresent(game.renderer); } int CreateSDLWindow(){ // Erstelle ein SDL-Fenster game.window = SDL_CreateWindow("Snake", 350, 50, config.windowSize, config.windowSize, SDL_WINDOW_OPENGL); if (game.window == NULL) { printf("Fenster konnte nicht erstellt werden! SDL_Error: %s\n", SDL_GetError()); return 1; } game.renderer = SDL_CreateRenderer(game.window, -1, SDL_RENDERER_ACCELERATED); if (game.renderer == NULL) { printf("Renderer konnte nicht erstellt werden! SDL_Error: %s\n", SDL_GetError()); return 1; } return 0; } void DestroySDLWindow(){ // Zerstöre das Fenster und beende SDL TTF_CloseFont(ttlStorage.ptrFont_20); TTF_CloseFont(ttlStorage.ptrFont_30); TTF_CloseFont(ttlStorage.ptrFont_200); SDL_DestroyRenderer(game.renderer); SDL_DestroyWindow(game.window); TTF_Quit(); SDL_Quit(); }