diff --git a/auto.c b/auto.c index 27d3bca97846b2512f58f627f77e6b66d9603b51..97007d696a4aee18d73dbf3bfbb67ce500df1d83 100644 --- a/auto.c +++ b/auto.c @@ -3,7 +3,7 @@ #include "header.h" // Es wird ein Auto/Boot mit den Parametern erzeugt und zurückgegeben -struct Auto* init_car(int speed,int width,int height,int pred_pos,int pred_width){ +struct Auto* init_car(int speed,int width,int height,int pred_pos,int pred_width,enum vehicle t){ struct Auto *b = malloc(sizeof(*b)); if (b == NULL){ @@ -11,34 +11,31 @@ struct Auto* init_car(int speed,int width,int height,int pred_pos,int pred_width } int p = rand() % 10; - // Münze 10 % - if (p != 0){ - b->coin = 0; - b->width = width; - b->height = height; - + if (p == 0 && t == car){ + b->width = 50; + b->height = 50; + b->type = coin; if (pred_width == 0){ b->x_pos = pred_pos; }else{ - int min_distance = 100 * abs(speed); - int distance = (rand() % 300) + min_distance; + int distance = 25; if (speed < 0){ b->x_pos = pred_pos + pred_width + distance; }else{ b->x_pos = pred_pos - b->width - distance; } - } - }else{ // Initialisierung einer Münze - b->coin = 1; - b->width = 50; - b->height = 50; + }else{ + b->width = width; + b->height = height; + b->type = t; if (pred_width == 0){ b->x_pos = pred_pos; }else{ - int distance = 25; + int min_distance = 100 * abs(speed); + int distance = (rand() % 300) + min_distance; if (speed < 0){ b->x_pos = pred_pos + pred_width + distance; @@ -52,19 +49,19 @@ struct Auto* init_car(int speed,int width,int height,int pred_pos,int pred_width } // erzeugt eine verkettete Liste an Autos -struct LinkedList_Auto* init_car_list(int speed,int length,int width,int start_pos){ +struct LinkedList_Auto* init_car_list(int speed,int length,int width,int start_pos,enum vehicle t){ struct LinkedList_Auto *list = malloc(sizeof(*list)); if (list == NULL){ perror("kein Speicherplatz"); } - struct Auto *a = init_car(speed,length,width,start_pos,0); + struct Auto *a = init_car(speed,length,width,start_pos,0,t); list->head = a; for(int i = 0;i<5;i++){ - struct Auto *b = init_car(speed,length,width,a->x_pos,a->width); + struct Auto *b = init_car(speed,length,width,a->x_pos,a->width,t); a->next = b; a = b; @@ -79,42 +76,48 @@ struct LinkedList_Auto* init_car_list(int speed,int length,int width,int start_p // und ruft die Ausgabe-Funktion auf // Es wird 0 zurückgegeben, wenn es keine Kollision moit einem aut gab oder eine Kollision mit einem Boot // Sonst wird 1 zurückgegeben und das Spiel wird beendet -int car_move(SDL_Renderer* renderer,struct Node *n,SDL_Rect *character,bool water){ +int car_move(SDL_Renderer* renderer,struct Node *n,SDL_Rect *character){ int length; int height; - int boat = false; + int onBoat = false; struct LinkedList_Auto *list = n->autos; struct Auto *cur = list->head; bool newAuto = false; + enum vehicle newAutotype; if ((cur->x_pos < -(cur-> width) && n->speed < 0) || (cur->x_pos > SCREEN_WIDTH && n->speed > 0)){ struct Auto *temp = cur; cur = cur->next; list->head = cur; newAuto = true; + newAutotype = cur->type; free(temp); } while (true){ if (n->y_pos <=character->y && character->y <=n->y_pos + 100 && kollision(character,cur->x_pos,cur->width)){ - if (!water){ + if (cur->type == car || cur->type == train){ return(1); - }else{ - boat = true; + }else if (cur -> type == boat){ + onBoat = true; + }else if(cur ->type == coin){ + playerscore += 5; + playerhighscore += 5; + paste_score (renderer); + cur->type = coin_gathered; } } - cur->x_pos += n->speed; - paste_auto(renderer,cur->x_pos,n->y_pos,cur->width,cur->height,water); + paste_auto(renderer,cur->x_pos,n->y_pos,cur->width,cur->height,cur->type); if (cur->next == NULL){ break; } - cur = cur->next; - } + cur = cur->next; + } if (newAuto){ @@ -128,13 +131,14 @@ int car_move(SDL_Renderer* renderer,struct Node *n,SDL_Rect *character,bool wate length = 200; height = 60; } - struct Auto *new = init_car(n->speed,length,height,cur->x_pos,cur->width); + struct Auto *new = init_car(n->speed,length,height,cur->x_pos,cur->width,newAutotype); cur->next = new; new->next= NULL; } - if (water){ - return(!boat); + if (n->row_type == waterDarkSingle || n->row_type == waterBrightSingle || + n->row_type == waterDarkMultiple || n->row_type == waterBrightMultiple){ + return(!onBoat); }else{ return(0); } diff --git a/gameLoop.c b/gameLoop.c index 3d02328a1ad143efaf36329e6d071f5026b6bcff..7580046a16b545cc7d230ab4cea85f2e0ad273d4 100644 --- a/gameLoop.c +++ b/gameLoop.c @@ -19,16 +19,19 @@ void gameLoop(SDL_Renderer* renderer, SDL_Window* window) { bool start_game = false; // Character SDL_Rect *character = &player; + + enum vehicle theme = train; // bestimme das Map-Thema + // erzeuge verkettete Liste, welche die Karte speichert - struct LinkedList *list = init_map(character); + struct LinkedList *list = init_map(theme,character); + Uint32 start = SDL_GetTicks(); - move_map(0,list,character,renderer); + move_map(theme,0,list,character,renderer); // Menü - start_screen(character, list, renderer); - start_game = true; - + //start_screen(theme,character, list, renderer); + start_game = false; while (run) { while (SDL_PollEvent(&e)) { switch (e.type){ @@ -41,6 +44,7 @@ void gameLoop(SDL_Renderer* renderer, SDL_Window* window) { //start_screen(renderer); //start_game = true; // könnte man auch später für das Menü benutzten //} + start_game = true; jump(input, character); break; default: @@ -60,13 +64,15 @@ void gameLoop(SDL_Renderer* renderer, SDL_Window* window) { else{ speed = 1; } - run = !move_map(speed,list,character,renderer); + SDL_RenderClear(renderer); + run = !move_map(theme,speed,list,character,renderer); } //update Character update_character(speed,character, renderer); paste_score (renderer); - + + SDL_RenderPresent(renderer); SDL_UpdateWindowSurface(window); diff --git a/header.h b/header.h index 6a60511dc5be05b5497fd5a00414e5924ea96d7a..2ce59556ef1d763469c476f47035b46a06d6b288 100644 --- a/header.h +++ b/header.h @@ -23,12 +23,12 @@ enum row{ waterDarkMultiple }; -enum object_type { - car, boat, coin, coin_gathered +enum vehicle{ + car, train,boat, coin, coin_gathered }; struct Auto{ - int coin; // coin = 0 => Auto, coin = 1 => Münze, coin = 2 => eingesammelt + enum vehicle type ; int x_pos; int width; int height; @@ -58,23 +58,26 @@ struct LinkedList_Auto{ //Declarations of Functions 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*); +struct LinkedList* init_map(enum vehicle,SDL_Rect *player); +int move_map(enum vehicle,int,struct LinkedList*,SDL_Rect*,SDL_Renderer*); int paste_row(SDL_Renderer*, int , enum row); void free_map(struct LinkedList*); int paste_score (SDL_Renderer*); //int charac_init(SDL_Renderer*); -struct LinkedList_Auto* init_car_list( int, int,int,int); +struct LinkedList_Auto* init_car_list( int, int,int,int,enum vehicle); struct Node* grass(bool,bool,int); -int paste_auto (SDL_Renderer*, int, int, int, int,bool); -int car_move(SDL_Renderer* ,struct Node*,SDL_Rect*,bool); +struct Node* street(bool,int); +struct Node* track(int); +struct Node* water(bool,bool,int); +int paste_auto (SDL_Renderer*, int, int, int, int,enum vehicle); +int car_move(SDL_Renderer* ,struct Node*,SDL_Rect*); void free_auto(struct Node*); bool kollision(SDL_Rect*,int,int); //SDL_Rect charac_init(SDL_Renderer*); void jump(int, SDL_Rect*); void update_character(int,SDL_Rect*, SDL_Renderer*); void move_character(int,SDL_Rect*); -int start_screen(SDL_Rect*, struct LinkedList*, SDL_Renderer*); +int start_screen(enum vehicle,SDL_Rect*, struct LinkedList*, SDL_Renderer*); bool end_screen(int, SDL_Renderer*); int init(SDL_Renderer*); int exitGame(SDL_Renderer*, SDL_Window*); @@ -98,3 +101,4 @@ extern SDL_Texture *img_waterDarkSingle; extern SDL_Texture *img_waterDarkMultiple; extern SDL_Texture *img_finishlineBright; extern SDL_Texture *img_finishlineDark; +extern SDL_Texture *img_coin; diff --git a/init.c b/init.c index 1494da246ae26edca11140fe8253e20f719c79ee..fd2395878c095436a0eb0942a982d933cd0985ae 100644 --- a/init.c +++ b/init.c @@ -13,6 +13,7 @@ SDL_Texture *img_waterDarkSingle; SDL_Texture *img_waterDarkMultiple; SDL_Texture *img_finishlineBright; SDL_Texture *img_finishlineDark; +SDL_Texture *img_coin; TTF_Font* font; int playerscore; @@ -37,6 +38,7 @@ int init(SDL_Renderer* renderer) { img_waterDarkMultiple = IMG_LoadTexture(renderer,"images/waterDarkMultiple.jpg"); img_finishlineBright = IMG_LoadTexture(renderer,"images/finishlineBright.jpg"); img_finishlineDark = IMG_LoadTexture(renderer,"images/finishlineDark.jpg"); + img_coin = IMG_LoadTexture(renderer,"images/coin.jpg"); //Initiierung der Bilder int flags = IMG_INIT_PNG | IMG_INIT_JPG; @@ -48,7 +50,8 @@ int init(SDL_Renderer* renderer) { if (img_grassDark == NULL || img_grassBright == NULL || img_streetSingle == NULL || img_streetMultiple == NULL || img_traintrack == NULL || img_waterBrightSingle== NULL|| img_waterBrightMultiple == NULL || img_waterDarkSingle == NULL || - img_waterDarkMultiple == NULL || img_finishlineBright == NULL || img_finishlineDark == NULL) { + img_waterDarkMultiple == NULL || img_finishlineBright == NULL || img_finishlineDark == NULL || + img_coin == NULL) { SDL_Log("Bild konnte nicht geladen werden! SDL_image Error: %s\n",IMG_GetError()); return(-1); } @@ -71,6 +74,7 @@ int exitGame(SDL_Renderer* renderer, SDL_Window* window) { SDL_DestroyTexture(img_waterDarkMultiple); SDL_DestroyTexture(img_finishlineBright); SDL_DestroyTexture(img_finishlineDark); + SDL_DestroyTexture(img_coin); SDL_Quit(); return 0; diff --git a/main.c b/main.c index 7e68ed67940d6ce1b8ce7c4cc5477f8c347a3e11..6647bfb3d50d63dc832fd435ed5475808a2f8ccc 100644 --- a/main.c +++ b/main.c @@ -39,10 +39,7 @@ int main(void) { bool quit = false; while (quit == false) { - // Welt - // Menü gameLoop(renderer, window); - // quit = 2.Menü quit = end_screen(0,renderer); } diff --git a/map.c b/map.c index 35cd6e9c8df54d5db451d0811456e88c6defcec4..068e03f0f661560faa837c2fa048a98f3fe38acc 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(SDL_Rect* character){ +struct LinkedList* init_map(enum vehicle theme,SDL_Rect* character){ struct LinkedList *list = malloc(sizeof(*list)); @@ -23,8 +23,17 @@ struct LinkedList* init_map(SDL_Rect* character){ // erzeuge 9 weitere Knoten mit zufälligem Typ for(int i = 0;i<9;i++){ - - struct Node *m = init_row(n, character); + struct Node *m; + if (theme == coin){ + m = init_row(n, character); + }else if(theme == car){ + m = street(i==0, n->y_pos - 100); + }else if(theme == boat){ + m = water(i==0,(i+1)%2, n->y_pos - 100); + }else if(theme == train){ + m = track( n->y_pos - 100); + } + n->next = m; n = m; @@ -39,9 +48,8 @@ struct LinkedList* init_map(SDL_Rect* character){ // 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(enum vehicle theme,int delta_y,struct LinkedList *list,SDL_Rect *character, SDL_Renderer* renderer){ - int water; struct Node *cur = list->head; bool newNode = false; @@ -67,23 +75,17 @@ int move_map(int delta_y,struct LinkedList *list,SDL_Rect *character, SDL_Render cur->y_pos += delta_y; if (paste_row(renderer,cur->y_pos,cur->row_type)) return(1); - water = -1; - if (cur->row_type == streetSingle || cur->row_type == streetMultiple || cur->row_type == traintrack){ - water = 0; - }else if ((cur->row_type == waterBrightSingle ||cur->row_type == waterBrightMultiple || - cur->row_type == waterDarkSingle ||cur->row_type == waterDarkMultiple)){ - water = 1; - } - if (water !=-1){ - if (car_move(renderer,cur,character,water) && cur->y_pos <= character->y && character->y <= cur->y_pos + 100){ + if (cur->autos != NULL){ + if (car_move(renderer,cur,character) && cur->y_pos <= character->y + && character->y <= cur->y_pos + 100){ return(1); - } + } } if (cur->next == NULL){ break; - } + } cur = cur->next; } @@ -91,8 +93,20 @@ int move_map(int delta_y,struct LinkedList *list,SDL_Rect *character, SDL_Render // Füge eine neue Reihe hinzu, wenn ein Reihe gelöscht wurde // Das Schachbrettmuster bleibt erhalten if (newNode){ - - struct Node *n = init_row(cur, character); + struct Node *n; + if (theme == car){ + n = street(false, cur->y_pos - 100); + }else if (theme == train){ + n = track(cur->y_pos - 100); + }else if (theme == boat){ + if (cur->row_type == waterDarkMultiple) + n = water(false,false, cur->y_pos - 100); + else{ + n = water(false,true, cur->y_pos - 100); + } + }else{ + n = init_row(cur, character); + } cur->next = n; n->next = NULL; } @@ -109,6 +123,5 @@ void free_map(struct LinkedList *list){ } free(temp); } - free(list); } \ No newline at end of file diff --git a/menu.c b/menu.c index 509390159d645f2b6a59e290b05c41b0a3ccea5e..caa5d1b690d55873704158b167a6890231a30329 100644 --- a/menu.c +++ b/menu.c @@ -6,7 +6,7 @@ # include <SDL.h> # include <stdio.h> -int start_screen(SDL_Rect *character, struct LinkedList *list, SDL_Renderer* renderer) { +int start_screen(enum vehicle theme,SDL_Rect *character, struct LinkedList *list, SDL_Renderer* renderer) { // Print Title screen // Press Space to start @@ -34,9 +34,9 @@ int start_screen(SDL_Rect *character, struct LinkedList *list, SDL_Renderer* ren SDL_Rect rect = { .x = 0, - .y = 300, - .w = 900, - .h = 300 }; + .y = 0, + .w = 600, + .h = 200 }; if (SDL_RenderFillRect(renderer,&rect)!=0) { @@ -60,7 +60,7 @@ int start_screen(SDL_Rect *character, struct LinkedList *list, SDL_Renderer* ren //SDL_RenderPresent(renderer); while (quit == false) { - move_map(0,list,character,renderer); + move_map(theme,0,list,character,renderer); update_character(0, character, renderer); if (SDL_SetRenderDrawColor(renderer,255,255,255,120) !=0) { SDL_Log("Farbe konnte nicht gesetzt werden! SDL_Error %s\n",SDL_GetError()); @@ -79,7 +79,7 @@ int start_screen(SDL_Rect *character, struct LinkedList *list, SDL_Renderer* ren case SDL_KEYDOWN: input = e.key.keysym.scancode; - if (input == 44) { + if (input) { //Spiel startet für beliebigen Input SDL_FreeSurface(surfaceMessage); SDL_DestroyTexture(Message); quit = true; @@ -116,9 +116,9 @@ bool end_screen(int playerhighscore, SDL_Renderer* renderer) { SDL_Rect rect = { .x = 0, - .y = 300, - .w = 900, - .h = 300 }; + .y = 0, + .w = 400, + .h = 100 }; if (SDL_RenderFillRect(renderer,&rect)!=0) { diff --git a/output.c b/output.c index 33828a8a9a9840571dfdf836de7ea100f5ce76b7..13cf507da31b928555bf573091cf0b7809de2364 100644 --- a/output.c +++ b/output.c @@ -63,31 +63,45 @@ int paste_row(SDL_Renderer* renderer, int y, enum row row_type){ return 0; } -int paste_auto (SDL_Renderer* renderer, int x, int y, int width, int height,bool water) { +int paste_auto (SDL_Renderer* renderer, int x, int y, int width, int height,enum vehicle type) { SDL_Rect rect = { .x = x, .y = y + 20, // Autos und Boote werden um 20 Pixel nach unten gesetzt, um sie zu zentrieren .w = width, .h = height}; - if (water){ + if (type == boat){ if (SDL_SetRenderDrawColor(renderer, 75, 33, 0, 255) != 0) { SDL_Log("Farbe konnte nicht gesetzt werden! SDL_Error: %s\n", SDL_GetError()); return -1; } - }else{ + }else if(type == car){ if (SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255) != 0) { SDL_Log("Farbe konnte nicht gesetzt werden! SDL_Error: %s\n", SDL_GetError()); return -1; } + }else if(type == train){ + if (SDL_SetRenderDrawColor(renderer, 150, 150, 150, 255) != 0) { + SDL_Log("Farbe konnte nicht gesetzt werden! SDL_Error: %s\n", + SDL_GetError()); + return -1; + } + }else if(type == coin){ + if (SDL_RenderCopy(renderer, img_coin, NULL, &rect) != 0) { + SDL_Log("Bild konnte nicht kopiert werden! SDL_Error Error: %s\n",SDL_GetError()); + return(1); + } + return(0); + }else if (type == coin_gathered){ + return(0); } if (SDL_RenderFillRect(renderer, &rect) != 0) { SDL_Log("Malen des Rechtecks fehlgeschlagen! SDL_Error: %s\n", SDL_GetError()); return -1; } - return 0; + return(0); } @@ -127,7 +141,7 @@ int paste_score (SDL_Renderer* renderer) { char output [5]; sprintf(output, "%d", playerhighscore); SDL_Surface* surfaceMessage = - TTF_RenderText_Blended_Wrapped (font, output, (SDL_Color) {0, 0, 0, 255}, 600); + TTF_RenderText_Blended_Wrapped (font, output, (SDL_Color) {0, 0, 0, 255}, 200); if (surfaceMessage == NULL) printf("Text Surface loading failed: %s\n", TTF_GetError()); diff --git a/rows.c b/rows.c index bd4102d4d81ed72fcbd470b5fe7713d67c5f6d80..679c4024f275a440430f0e550808ee10a82fbc5f 100644 --- a/rows.c +++ b/rows.c @@ -45,12 +45,12 @@ struct Node* street(bool first,int y_pos){ int width = 60; n->speed = (((rand()%2) * 2) -1) * ((rand()%2)+1); - n->autos = init_car_list(n->speed,length,width,(900-n->speed) % 900); + n->autos = init_car_list(n->speed,length,width,(900-n->speed) % 900,car); return(n); } // Initialisiert eine Zug-Reihe -struct Node* train(int y_pos){ +struct Node* track(int y_pos){ struct Node *n = malloc(sizeof(*n)); if (n==NULL){ perror("kein Speicherplatz"); @@ -62,7 +62,7 @@ struct Node* train(int y_pos){ int width = 60; n->speed = 7 *(((rand()%2)*2)-1); - n->autos = init_car_list(n->speed,length,width,(900-n->speed) % 900); + n->autos = init_car_list(n->speed,length,width,(900-n->speed) % 900,train); return(n); } @@ -92,7 +92,7 @@ struct Node* water(bool first,bool dark,int y_pos){ int width = 60; n->speed = 2 *(((rand()%2)*2)-1); - n->autos = init_car_list(n->speed,length,width,(900-n->speed)%900); + n->autos = init_car_list(n->speed,length,width,(900-n->speed)%900,boat); return(n); } @@ -137,7 +137,7 @@ struct Node* init_row(struct Node *m, SDL_Rect *character){ } }else if (p == 1){ - n = train(m->y_pos - 100); + n = track(m->y_pos - 100); // Es wird verhindert, dass nur eine Flussreihe erzeugt wird, // da jedes 100. Feld durch eine goldene Grasreihe ersetzt wird @@ -157,7 +157,7 @@ struct Node* init_row(struct Node *m, SDL_Rect *character){ }else if (m->row_type == traintrack){ p = rand() % 3; if (p == 0){ - n = train(m->y_pos - 100); + n = track(m->y_pos - 100); }else if(p >=1){ n = grass(true,false,m->y_pos -100); }