Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
gameLoop.c 3.30 KiB
#include "gameLoop.h"


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
bool 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,
            .w = 60,
            .h = 70
    };

    player = &character;

    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;
    bool quit_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:
                      end_game = true;
                      quit_game = true;
                      break;
                // any key input starts game and takes player input
                case SDL_KEYDOWN:
                    start_game = true;
                    jump(e.key.keysym.scancode);
                    break;
                default:
                    break;
            }
        }

        // Wenn der Spieler weit oben ist, dann soll sich 
        // die Kammera schneller bewegen
        // Solange der Spieler sich noch nicht bewegt hat, bewegt sich die Karte nicht
        if (start_game){
            if (player->y < SCREEN_WIDTH - 5*ROW_SIZE){
                speed = 7;  
            }else{
              speed = 1;
            }
        }

        // Die Map wird bewegt und gezeichnet (inklusive Fahrzeuge)
        // Bei einer ungültigen Kollision wird das Spiel beendet
        if (!end_game) 
            end_game = move_map(theme,speed,map,renderer);
    
        // Wenn der Spieler nicht im Fenster zu sehen ist, dann wird das Spiel beendet
        if(player->y >= SCREEN_HEIGHT || player->x >=SCREEN_WIDTH || player->x <= -60){
            end_game = true;
        }

        //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(quit_game);
}