diff --git a/charac.c b/charac.c index f7bd49794083c6da66af7c5d1f9a9aeb35b1b121..518fc22a5682490794820fcde2e6e2008ada5863 100644 --- a/charac.c +++ b/charac.c @@ -6,31 +6,36 @@ Vorbedingung: Es wurde eine Taste gedrückt Nachbedingung: Position des Characters hat sich je nach Tasteneingabe verändert. Wenn keine Steuertaste gedrückt wird, dann passiert nichts. */ +// playerscore = interne Darstellung der ingesamt gelaufenen Schritte minus der zurückgelaufenen Schritte +// playerhighscore = externe Darstellung; höchste Anzahl an nach oben gelaufenen Schritten +// ROW_SIZE = 100 +// SDL_SCANCODE_X = MACRO von SDL anstall "magic numbers" zu verwenden + void jump(int input){ switch(input) { case SDL_SCANCODE_D: //right - if(player->x < 770){ - player->x += ROW_SIZE; //ROW_SIZE == 100 + if(player->x < 770){ // Überprüfe Grenzen + player->x += ROW_SIZE; } break; case SDL_SCANCODE_A: //left - if(player->x > 30){ + if(player->x > 30){ // Überprüfe Grenzen player->x -= ROW_SIZE; } break; case SDL_SCANCODE_S: //down - if(player->y < 820){ + if(player->y < 820){ // Überprüfe Grenzen playerscore--; player->y += ROW_SIZE; } break; case SDL_SCANCODE_W: //up - if(player->y >120){ + if(player->y >120){ // Überprüfe Grenzen playerscore++; - if(playerscore > playerhighscore){ + if(playerscore > playerhighscore){ // Überprüfe, ob Spieler weiter gelaufen ist als vorheriger Highscore playerhighscore = playerscore; } player->y -= ROW_SIZE; @@ -38,9 +43,9 @@ void jump(int input){ break; case SDL_SCANCODE_Q: // Taste q => gehe nach oben links - if(player->y >120 && player->x > 30){ + if(player->y >120 && player->x > 30){ // Überprüfe Grenezen playerscore++; - if(playerscore > playerhighscore){ + if(playerscore > playerhighscore){ // Überprüfe, ob Spieler weiter gelaufen ist als vorheriger Highscore playerhighscore = playerscore; } player->y -= ROW_SIZE; @@ -49,10 +54,10 @@ void jump(int input){ break; case SDL_SCANCODE_E: // Taste e => gehe nach oben rechts - if(player->y >120 && player->x < 770){ + if(player->y >120 && player->x < 770){ // Überprüfe Grenzen playerscore++; - if(playerscore > playerhighscore){ - playerhighscore = playerscore; + if(playerscore > playerhighscore){ // Überprüfe, ob Spieler weiter gelaufen ist als vorheriger Highscore + playerhighscore = playerscore; // Update playerhighscore, wenn playerscore größer ist } player->y -= ROW_SIZE; player->x += ROW_SIZE; @@ -71,9 +76,10 @@ Nachbedingung: Der Character bewegt sich mit der Map mit. */ int update_character(int speed, SDL_Renderer *renderer){ - // Bewege die Spielfigur um speed Pixel nach unten - player->y +=speed; + + player->y +=speed; // Bewege den Spieler um speed pixel nach unten + // Fehlerbehandlung if (SDL_RenderCopy(renderer, img_duck, NULL,player) != 0) { SDL_Log("Bild konnte nicht kopiert werden! SDL_Error Error: %s\n",SDL_GetError()); return(1); diff --git a/gameLoop.c b/gameLoop.c index a9acf3b3eccafd3fb2d1abad476c318f305bb703..6303bb7f02741b384795ddfc16b41ab123525319 100644 --- a/gameLoop.c +++ b/gameLoop.c @@ -5,11 +5,15 @@ SDL_Rect *player; int playerscore; int playerhighscore; +//V: enum vehicle exists with 4 correct themes, Renderer exists +//N: renderer still exists, all objects are still exist or have been correctly removed +//E: game has been played for one round, which was at least 16ms long void gameLoop(enum vehicle theme,SDL_Renderer* renderer) { SDL_Event e; int speed = 0; + // Character wird in der Mitte des vorletzten Feldes gestartet SDL_Rect character = { .x = 420, .y = 810, @@ -22,23 +26,30 @@ void gameLoop(enum vehicle theme,SDL_Renderer* renderer) { playerscore = 0; playerhighscore = 0; + //start_game prevents game start before player input has been received bool start_game = false; + //ends game if game over criteria have been met bool end_game = false; + //used to implement rows and allows to remove rows out of view struct LinkedList *map = init_map(theme); + //every at least 16ms this loop is called while (!end_game) { + //prevents overlap of menu and game SDL_RenderClear(renderer); + //used to standardize time to at least 16ms per tick Uint32 start_time = SDL_GetTicks(); while (SDL_PollEvent(&e)) { - + switch (e.type){ - + // if user closes window exit frees all used space case SDL_QUIT: exit(0); + // any key input starts game and takes player input case SDL_KEYDOWN: start_game = true; jump(e.key.keysym.scancode); @@ -70,17 +81,22 @@ void gameLoop(enum vehicle theme,SDL_Renderer* renderer) { //Position des Spielers wird aktualisiert und gezeichnet update_character(speed, renderer); + //Der aktuelle Score wird oben rechts angezeigt paste_score (renderer); + //Hier wird der aktuelle Stand des Spiels dem Spieler angezeigt SDL_RenderPresent(renderer); // Spiel bekommt eine feste Aktuallisierungsrate von ~60 fps + // Tick dauert mindestens 16ms Uint32 end_time = SDL_GetTicks(); while (end_time - start_time < 16) { end_time = SDL_GetTicks(); } } + //Wenn das Spiel game over ist schreiben wir den aktuellen Score in die score.txt write_table(theme); + //wir löschen die map free_map(map); return; } diff --git a/menu2.c b/menu2.c index 8784362247b24b945fe28c257b47487a0947834e..ff31ea71d2b4b59ff3d7e22b1b7c85a364cd5416 100644 --- a/menu2.c +++ b/menu2.c @@ -1,7 +1,7 @@ #include "menu2.h" -// Die Funktion zeigt die möglichen Reihen des Spiels -// Wenn man auf eine Reihe klickt, dann wir das Spiel mit einer bestimmten +// Vorb.: Die Funktion zeigt die möglichen Reihen des Spiels +// Nachb.: Wenn man auf eine Reihe klickt, dann wir das Spiel mit einer bestimmten // Konfiguration gestartet enum vehicle startscreen(SDL_Renderer* renderer){ // Definiere rect @@ -203,7 +203,8 @@ enum vehicle startscreen(SDL_Renderer* renderer){ /* - +Vorb.: Das Spiel ist angehalten und es wird "Nochmal (y)/(n)" angezeigt +Nachb.: Das Spiel wird erneut gestartet, wenn y gedrückt wird. Wenn n gedrückt wird, wird die Levelauswahl geöffnet */ bool end_screen(SDL_Renderer* renderer) { @@ -241,76 +242,8 @@ bool end_screen(SDL_Renderer* renderer) { SDL_Texture* Message = SDL_CreateTextureFromSurface(renderer, surfaceMessage); - SDL_RenderCopy(renderer, Message, NULL, &rect); - -/* - // Ausgabe Highscore der entsprechenden Karte - - int map = theme; - FILE *my_file; - //FILE *my_wfile = fopen("Highscore2.txt","w"); - - switch(map) { // Öffne die entsprechende Datei für den Highscore der Karte theme - case coin: - my_file = fopen("HighscoreCoin.txt","r+"); - break; - case car: - my_file = fopen("HighscoreCar.txt","r+"); - break; - case boat: - my_file = fopen("HighscoreBoat.txt","r+"); - break; - case train: - my_file = fopen("HighscoreTrain.txt","r+"); - break; - } - - bool notEOF = true; - - while (notEOF) { // Lese bis Datei leer - - char buf[64]; // initialise buffer - - size_t n = fread(buf,sizeof buf[0], sizeof buf, my_file); - //printf("n = %zu\n",n); - - if (n == 0) { - - notEOF = false; - - } else { - - //printf("Read text: \n %s\n",buf); - //fwrite(buf,sizeof buf[0], n, my_file); - // Definiere rect - - // Erstelle Rechteck für das Schreiben des Highscores - SDL_Rect rect2 = { - .x = 0, - .y = 900, - .w = 600, - .h = 200 }; - - if (SDL_RenderFillRect(renderer,&rect2)!=0) { - SDL_Log("Malen des Rechtecks fehlgeschlagen! SDL_Error %s\n",SDL_GetError()); - return(-1); - } - - SDL_Surface* surfaceMessage2 = TTF_RenderText_Blended_Wrapped (font, buf, (SDL_Color) {255, 255, 255, 255}, 200); - - if (surfaceMessage2 == NULL) - printf("Text Surface loading failed: %s\n", TTF_GetError()); - - SDL_Texture* Message2 = SDL_CreateTextureFromSurface(renderer, surfaceMessage2); - - SDL_RenderCopy(renderer, Message2, NULL, &rect2); - - } - - } + SDL_RenderCopy(renderer, Message, NULL, &rect); - //fclose(my_file); - */ SDL_Event e; int input; bool quit = false; @@ -343,7 +276,6 @@ bool end_screen(SDL_Renderer* renderer) { } } } - //fclose(my_file); return(true); }