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);
}