diff --git a/Makefile b/Makefile index c1eed559bbfedbb2e225a1dab9ef2b04b31c9d65..99cab8ffc4956b6e5f9d65116ef0da1f4babd221 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CFLAGS=$(shell pkg-config --cflags sdl2 SDL2_image SDL2_ttf) -std=c99 -Wall -Wextra -pedantic -g -O0 CPPFLAGS=-MMD -MF $*.d # Generate dependency files LDLIBS=$(shell pkg-config --libs sdl2 SDL2_image SDL2_ttf) -lm -OBJ=output.o map.o rows.o auto.o charac.o main.o init.o +OBJ=output.o map.o rows.o auto.o charac.o main.o init.o gameLoop.o CC=gcc all: main diff --git a/gameLoop.c b/gameLoop.c new file mode 100644 index 0000000000000000000000000000000000000000..b26f4f22a363fc4162c173922b0a1b55338626a6 --- /dev/null +++ b/gameLoop.c @@ -0,0 +1,73 @@ +#include "header.h" +#include <time.h> +#include <stdbool.h> + +void gameLoop(SDL_Renderer* renderer, SDL_Window* window) { + // Anfangskoordinaten für den Spieler und dessen Größe + SDL_Rect player = { + .x = 420, + .y = 820, + .w = 60, + .h = 60}; + + bool run = true; + int input; + SDL_Event e; + bool start_game = false; + // Character + SDL_Rect *character = &player; + // erzeuge verkettete Liste, welche die Karte speichert + struct LinkedList *list = init_map(character); + Uint32 start = SDL_GetTicks(); + + while (run) { + while (SDL_PollEvent(&e)) { + switch (e.type){ + case SDL_QUIT: // Fenster Schließen + run = false; + break; + case SDL_KEYDOWN: // Keystroke ? + input = e.key.keysym.scancode; + start_game = true; // könnte man auch später für das Menü benutzten + jump(input, character); + break; + default: + break; + } + } + + // Wenn der Spieler weit oben ist, dann soll sich + // die Kammera schneller bewegen + int speed; + if (run){ + if (!start_game){ + speed = 0; + }else if (character->y < 400){ + speed = 8; + } + else{ + speed = 1; + } + run = !move_map(speed,list,character,renderer); + } + + //update Character + update_character(speed,character, renderer); + paste_score (renderer, playerhighscore, font); + + SDL_RenderPresent(renderer); + SDL_UpdateWindowSurface(window); + + if(character->y >= 965){ + run = false; + } + + // Spiel bekommt eine feste Aktuallisierungsrate von ~60 fps + Uint32 end = SDL_GetTicks(); + while (end - start < 16) { + end = SDL_GetTicks(); + } + } + free_map(list); + return; +} diff --git a/header.h b/header.h index 924116f7ce281ff41bafc091c6df77c5dda53654..3d5b1955d5965837f619e134ef62c4f285c5d85d 100644 --- a/header.h +++ b/header.h @@ -50,8 +50,8 @@ struct LinkedList_Auto{ //Declarations of Functions -struct Node* init_row(struct Node*); -struct LinkedList* init_map(); +struct Node* init_row(struct Node*, SDL_Rect *player); +struct LinkedList* init_map(SDL_Rect *player); int move_map(int,struct LinkedList*,SDL_Rect*,SDL_Renderer*); int paste_row(SDL_Renderer*, int , enum row); void free_map(struct LinkedList*); @@ -70,9 +70,11 @@ void move_character(int,SDL_Rect*); void start_screen(void); void end_screen(int); int init(SDL_Renderer*); -int exitGame(struct LinkedList*, SDL_Renderer*, SDL_Window*); +int exitGame(SDL_Renderer*, SDL_Window*); +void gameLoop(SDL_Renderer*, SDL_Window*); extern SDL_Rect player; +extern TTF_Font* font; extern int playerscore; extern int playerhighscore; diff --git a/init.c b/init.c index 797112201c54007ca2d469406b602520f2c9a4e0..a067facac4c479b34992a320e873faaaf310da24 100644 --- a/init.c +++ b/init.c @@ -1,5 +1,6 @@ #include "header.h" #include <SDL_image.h> +#include <SDL_ttf.h> SDL_Texture *img_grassDark; SDL_Texture *img_grassBright; @@ -12,11 +13,19 @@ SDL_Texture *img_waterDarkSingle; SDL_Texture *img_waterDarkMultiple; SDL_Texture *img_finishlineBright; SDL_Texture *img_finishlineDark; +TTF_Font* font; int playerscore = 0; int playerhighscore = 0; int init(SDL_Renderer* renderer) { + + //Initiiere Text + TTF_Init(); + //this opens a font style and sets a size + TTF_Font* font = TTF_OpenFont("Go-Mono.ttf", 50); + if (font == NULL) printf("Font Loading failed: %s\n", TTF_GetError()); + // Lade alle Bilder die benötigt werden img_grassDark = IMG_LoadTexture(renderer,"images/dark_grass.jpg"); img_grassBright = IMG_LoadTexture(renderer,"images/bright_grass.jpg"); @@ -49,9 +58,7 @@ int init(SDL_Renderer* renderer) { } -int exitGame(struct LinkedList* list, SDL_Renderer* renderer, SDL_Window* window) { - free_map(list); - +int exitGame(SDL_Renderer* renderer, SDL_Window* window) { SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_DestroyTexture(img_grassDark); diff --git a/main.c b/main.c index 5be5fd86ea5c60c2066258078fe86111640346e9..c145b0d380bb0b09f50145fb63ada1be691dba43 100644 --- a/main.c +++ b/main.c @@ -2,14 +2,6 @@ #include <SDL_image.h> #include <stdbool.h> #include <time.h> -#include <SDL_ttf.h> - -// Anfangskoordinaten für den Spieler und dessen Größe - SDL_Rect player = { - .x = 420, - .y = 820, - .w = 60, - .h = 60}; int main(void) { @@ -43,73 +35,13 @@ int main(void) { } init(renderer); - - //Initiiere Text - TTF_Init(); - //this opens a font style and sets a size - TTF_Font* font = TTF_OpenFont("Go-Mono.ttf", 50); - if (font == NULL) printf("Font Loading failed: %s\n", TTF_GetError()); - // erzeuge verkettete Liste, welche die Karte speichert - struct LinkedList *list = init_map(); - - // Character - SDL_Rect *character = &player; - int input; - SDL_Event e; bool quit = false; - bool start_game = false; while (quit == false) { - Uint32 start = SDL_GetTicks(); - while (SDL_PollEvent(&e)) { - switch (e.type){ - case SDL_QUIT: // Fenster Schließen - quit = true; - break; - case SDL_KEYDOWN: // Keystroke ? - input = e.key.keysym.scancode; - start_game = true; // könnte man auch später für das Menü benutzten - jump(input, character); - break; - default: - break; - } - } - - // Wenn der Spieler weit oben ist, dann soll sich - // die Kammera schneller bewegen - int speed; - if (!quit){ - if (!start_game){ - speed = 0; - }else if (character->y < 400){ - speed = 8; - } - else{ - speed = 1; - } - quit = move_map(speed,list,character,renderer); - } - - //update Character - update_character(speed,character, renderer); - paste_score (renderer, playerhighscore, font); - - SDL_RenderPresent(renderer); - SDL_UpdateWindowSurface(window); - - if(character->y >= 965){ - quit = true; - } - - // Spiel bekommt eine feste Aktuallisierungsrate von ~60 fps - Uint32 end = SDL_GetTicks(); - while (end - start < 16) { - end = SDL_GetTicks(); - } + gameLoop(renderer, window); } - - exitGame(list, renderer, window); + + exitGame(renderer, window); return(0); } diff --git a/map.c b/map.c index d7277c7554254343dd3aaa6aaa734e3b7bdb3e19..35cd6e9c8df54d5db451d0811456e88c6defcec4 100644 --- a/map.c +++ b/map.c @@ -9,7 +9,7 @@ // WICHTIG: Bei jeder Reihe OHNE Autos muss der Wert autos auf NULL // gesetzt werde, da es sonts zu Fehlern kommt -struct LinkedList* init_map(void){ +struct LinkedList* init_map(SDL_Rect* character){ struct LinkedList *list = malloc(sizeof(*list)); @@ -24,7 +24,7 @@ struct LinkedList* init_map(void){ // erzeuge 9 weitere Knoten mit zufälligem Typ for(int i = 0;i<9;i++){ - struct Node *m = init_row(n); + struct Node *m = init_row(n, character); n->next = m; n = m; @@ -39,7 +39,7 @@ struct LinkedList* init_map(void){ // Wenn die unterste Reihe aus dem Fenster geschoben wurde, dann wird diese gelöscht // Gleichzeitig wird ein neue Reihe erzeugt, welche am Ende der verketteten Liste eingefügt wird -int move_map(int delta_y,struct LinkedList *list,SDL_Rect *character,SDL_Renderer* renderer){ +int move_map(int delta_y,struct LinkedList *list,SDL_Rect *character, SDL_Renderer* renderer){ int water; struct Node *cur = list->head; @@ -92,7 +92,7 @@ int move_map(int delta_y,struct LinkedList *list,SDL_Rect *character,SDL_Rendere // Das Schachbrettmuster bleibt erhalten if (newNode){ - struct Node *n = init_row(cur); + struct Node *n = init_row(cur, character); cur->next = n; n->next = NULL; } diff --git a/rows.c b/rows.c index a7341d168391d759edf632024a635be19c4ba1dc..bd4102d4d81ed72fcbd470b5fe7713d67c5f6d80 100644 --- a/rows.c +++ b/rows.c @@ -102,12 +102,12 @@ struct Node* water(bool first,bool dark,int y_pos){ // Initalisert alle Werte für eine neu erzeugte Reihe // WICHTIG: Bei jeder Reihe OHNE Autos muss der Wert autos auf NULL // gesetzt werde, da es sonst zu Fehlern kommt -struct Node* init_row(struct Node *m){ +struct Node* init_row(struct Node *m, SDL_Rect *character){ struct Node *n; int p; // Ziellinie erscheint alle 100 Punkte - if((playerhighscore + (player.y/100)) % 100 == 99){ + if((playerhighscore + (character->y/100)) % 100 == 99){ if (m->row_type != grassDark && m->row_type != waterDarkSingle && m->row_type != waterDarkMultiple){ n = grass(true,true,m->y_pos - 100); }else{ @@ -141,7 +141,7 @@ struct Node* init_row(struct Node *m){ // Es wird verhindert, dass nur eine Flussreihe erzeugt wird, // da jedes 100. Feld durch eine goldene Grasreihe ersetzt wird - }else if (p == 2 && ((playerhighscore + (player.y/100)) % 100 != 98)){ + }else if (p == 2 && ((playerhighscore + (character->y/100)) % 100 != 98)){ if (m->row_type == grassDark ){ n = water(true,false,m->y_pos - 100); }else{