diff --git a/travail_de_groupe/chef_oeuvre/Res/wonScreen.png b/travail_de_groupe/chef_oeuvre/Res/wonScreen.png new file mode 100755 index 0000000000000000000000000000000000000000..c5159ef181c86500f845478a621bc28d85805d58 Binary files /dev/null and b/travail_de_groupe/chef_oeuvre/Res/wonScreen.png differ diff --git a/travail_de_groupe/chef_oeuvre/markov.txt b/travail_de_groupe/chef_oeuvre/markov.txt index 5b15740472e2aafbb138e4f7059dd4bb68924f67..4c18679d32b93424c3e4f46eebd8ecb1a43df08a 100644 --- a/travail_de_groupe/chef_oeuvre/markov.txt +++ b/travail_de_groupe/chef_oeuvre/markov.txt @@ -2,4 +2,4 @@ 0 60 40 0 0 0 10 70 20 0 0 0 10 50 40 -0 0 0 50 50 \ No newline at end of file +0 0 0 50 50 diff --git a/travail_de_groupe/chef_oeuvre/src/fire.c b/travail_de_groupe/chef_oeuvre/src/fire.c index 08b6a2fb755f6fe754c0e4dba738f30728e002a7..ce1f573300e208a21c4040ac130f3d43ef1ba8e0 100644 --- a/travail_de_groupe/chef_oeuvre/src/fire.c +++ b/travail_de_groupe/chef_oeuvre/src/fire.c @@ -36,6 +36,9 @@ listchainfire_t insertAheadFire(fire_t fire,listchainfire_t listFire) m->next= listFire; listFire=m; } + else { + free(m); + } return listFire; } @@ -57,7 +60,7 @@ listchainfire_t startFire(listchainfire_t listFire,int numberFire, int mapSize){ yFire= rand()%mapSize; fire.x= xFire; fire.y= yFire; - fire.state=1; + fire.state=2; listFire=insertAheadFire(fire, listFire); @@ -217,8 +220,19 @@ listchainfire_t probabilitySpreadFire( listchainfire_t listFire, listchainfire_t return listFire; } +void burnTree (listchainfire_t listFire){ + listchainfire_t listTemporary = listFire; + + while (!emptyListFire(listTemporary)){ + if (map[(listTemporary->fire).y][(listTemporary->fire).x]==TREE){map[(listTemporary->fire).y][(listTemporary->fire).x]=0;} + } +} + listchainfire_t spreadFire (listchainfire_t listFire){ listchainfire_t listTemporary=fireList; + + //burnTree(listFire); + srand(time(NULL)); while (!emptyListFire(listTemporary)){ if ((listTemporary->fire).state==4){ @@ -232,13 +246,8 @@ listchainfire_t spreadFire (listchainfire_t listFire){ booleen_t winGame(listchainfire_t listFire){ booleen_t win = true; - listchainfire_t listTemporary= listFire; + + if(!emptyListFire(listFire)){win=false;} - while (!emptyListFire( listTemporary)){ - if ((listTemporary->fire).state!=0){ - win= false; - break; - } - } return win; } \ No newline at end of file diff --git a/travail_de_groupe/chef_oeuvre/src/fire.h b/travail_de_groupe/chef_oeuvre/src/fire.h index 0284cedffa35689e462c662c6493532d8e1dd92b..125c761db9d63acd407f71b8c87b0cb8bc7b3761 100644 --- a/travail_de_groupe/chef_oeuvre/src/fire.h +++ b/travail_de_groupe/chef_oeuvre/src/fire.h @@ -13,7 +13,7 @@ #define STRONG 3 #define SPREAD 4 -#define UPDATETIME 5 +#define UPDATETIME 3 typedef struct fire{ @@ -51,6 +51,7 @@ void nextFire(listchainfire_t ); listchainfire_t probabilitySpreadFire( listchainfire_t, listchainfire_t); listchainfire_t spreadFire (listchainfire_t ); booleen_t winGame(listchainfire_t ); +void burnTree (listchainfire_t listFire); diff --git a/travail_de_groupe/chef_oeuvre/src/gest_event.c b/travail_de_groupe/chef_oeuvre/src/gest_event.c index cfaf1e2cc7323edc1ec1539138139c8c0f80aa61..6174f178dc61534cae30d5a00b0ffcf1b05e454c 100644 --- a/travail_de_groupe/chef_oeuvre/src/gest_event.c +++ b/travail_de_groupe/chef_oeuvre/src/gest_event.c @@ -203,6 +203,7 @@ void manageGame(){ } } updatePlayer(); + //burnTree(fireList); SDL_Delay(5); } @@ -212,6 +213,7 @@ void *eventLoop(void *arg){ case MENU : manageMenu();break; case GAME : manageGame();break; case LOSE : manageLost();break; + case WON : manageLost();break; default:printf("game state fault");break; } } diff --git a/travail_de_groupe/chef_oeuvre/src/main.h b/travail_de_groupe/chef_oeuvre/src/main.h index 3604248fe8252e88ac6148f5c29f5e03f17cfe1c..b352d3833f8f83dc08e9875d981e8252a5dff85a 100644 --- a/travail_de_groupe/chef_oeuvre/src/main.h +++ b/travail_de_groupe/chef_oeuvre/src/main.h @@ -24,6 +24,7 @@ #define MENU 0 #define GAME 1 #define LOSE 2 +#define WON 3 extern int running; extern int gameState; diff --git a/travail_de_groupe/chef_oeuvre/src/render.c b/travail_de_groupe/chef_oeuvre/src/render.c index ad055c9aa9e5a15d8e477a2d4d14a08092bdf65f..f8facc890762b2fb7518567a71171a9f3af29858 100644 --- a/travail_de_groupe/chef_oeuvre/src/render.c +++ b/travail_de_groupe/chef_oeuvre/src/render.c @@ -1,6 +1,7 @@ #include "render.h" float timer = 0; +int fps; SDL_Window *window; SDL_Renderer *renderer; @@ -78,6 +79,9 @@ SDL_Texture * scoreTexture; SDL_Surface * nextFireSurface; SDL_Texture * nextFireTexture; +SDL_Surface * backgroundWonSurface; +SDL_Texture * backgroundWonTexture; + void createWindow(){ if (SDL_Init(SDL_INIT_VIDEO) != 0){ @@ -110,6 +114,40 @@ void createWindow(){ } +void endSDL(){ + SDL_DestroyTexture(grassTexture); + SDL_DestroyTexture(treeTexture); + SDL_DestroyTexture(hoverTexture); + SDL_DestroyTexture(noHoverTexture); + SDL_DestroyTexture(playerTexture); + SDL_DestroyTexture(playerIdleTexture); + SDL_DestroyTexture(backgroundTexture); + SDL_DestroyTexture(backgroundSidesTexture); + SDL_DestroyTexture(backgroundLostTexture); + SDL_DestroyTexture(playButtonTexture); + SDL_DestroyTexture(playButtonHoverTexture); + SDL_DestroyTexture(playAgainButtonTexture); + SDL_DestroyTexture(playAgainButtonHoverTexture); + SDL_DestroyTexture(quitButtonTexture); + SDL_DestroyTexture(quitButtonHoverTexture); + SDL_DestroyTexture(fireTexture); + SDL_DestroyTexture(waterTexture); + SDL_DestroyTexture(emptyBucketTexture); + SDL_DestroyTexture(filledBucketTexture); + SDL_DestroyTexture(heartTexture); + SDL_DestroyTexture(scoreTexture); + SDL_DestroyTexture(nextFireTexture); + SDL_DestroyTexture(backgroundWonTexture); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + TTF_CloseFont(robotoFont); + TTF_Quit(); + SDL_Quit(); + if (!fireList){ + fireList = freeListFire(fireList); + } +} + void drawBackground(){ SDL_Rect rect = {0, 0, screenDimension.w, screenDimension.h}; SDL_RenderCopy(renderer, backgroundTexture, NULL, &rect); @@ -318,7 +356,7 @@ void drawTime(){ SDL_RenderCopy(renderer, nextFireTexture, NULL, &rect); rect.y += rect.h; char str[10]; - printf("%d\n", (UPDATETIME * 1000 - (int)timer % (UPDATETIME * 1000))/1000); + //printf("%d\n", (UPDATETIME * 1000 - (int)timer % (UPDATETIME * 1000))/1000); sprintf(str, "%d", (UPDATETIME * 1000 - (int)timer % (UPDATETIME * 1000))/1000); SDL_Color textColor = {237,222,17}; SDL_Surface * surface = TTF_RenderText_Solid(robotoFont, str, textColor); @@ -326,6 +364,21 @@ void drawTime(){ SDL_RenderCopy(renderer, texture, NULL, &rect); } +void drawFPS(){ + SDL_Rect rect; + rect.h = screenDimension.h/12; + rect.w = screenDimension.w/12; + rect.x = (screenDimension.w + (MAPSIZE * CELLSIZE)) / 2; + rect.y = screenDimension.h - rect.h; + + char str[10]; + sprintf(str, "%d", fps); + SDL_Color textColor = {237,222,17}; + SDL_Surface * surface = TTF_RenderText_Solid(robotoFont, str, textColor); + SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_RenderCopy(renderer, texture, NULL, &rect); +} + void drawGame(){ SDL_RenderClear(renderer); drawBackgroundSides(); @@ -336,6 +389,7 @@ void drawGame(){ drawPlayerHP(); drawScore(); drawTime(); + drawFPS(); SDL_RenderPresent(renderer); } @@ -351,6 +405,31 @@ void drawLost(){ SDL_RenderCopy(renderer, quitButtonHoverTexture, NULL, &rect); SDL_RenderCopy(renderer, playAgainButtonHoverTexture, NULL, &rect); SDL_RenderPresent(renderer); + + // draw score + rect.h = screenDimension.h/12; + rect.w = rect.h; + rect.x = screenDimension.w/2; + rect.y = screenDimension.h/2 - rect.h; + char str[10]; + sprintf(str, "%d", player.score); + SDL_Color textColor = {237,222,17}; + SDL_Surface * surface = TTF_RenderText_Solid(robotoFont, str, textColor); + SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, surface); + SDL_RenderCopy(renderer, texture, NULL, &rect); +} + +void drawWon(){ + SDL_Rect rect; + rect.h = screenDimension.h; + rect.w = screenDimension.w; + rect.x = 0; + rect.y = 0; + SDL_RenderCopy(renderer, backgroundWonTexture, NULL, &rect); + SDL_RenderCopy(renderer, playAgainButtonHoverTexture, NULL, &rect); + SDL_RenderCopy(renderer, quitButtonHoverTexture, NULL, &rect); + SDL_RenderCopy(renderer, playAgainButtonHoverTexture, NULL, &rect); + SDL_RenderPresent(renderer); } void mainLoop(){ @@ -423,7 +502,8 @@ void mainLoop(){ heartSurface = IMG_Load("Res/heart_spritesheet.png"); heartTexture = SDL_CreateTextureFromSurface(renderer, heartSurface); - + backgroundWonSurface = IMG_Load("Res/wonScreen.png"); + backgroundWonTexture = SDL_CreateTextureFromSurface(renderer, backgroundWonSurface); SDL_FreeSurface(grassSurface); SDL_FreeSurface(treeSurface); @@ -445,6 +525,7 @@ void mainLoop(){ SDL_FreeSurface(quitButtonHoverSurface); SDL_FreeSurface(playAgainButtonHoverSurface); SDL_FreeSurface(heartSurface); + SDL_FreeSurface(backgroundWonSurface); playAgainButtonRect.x = (screenDimension.w * 700)/1920; playAgainButtonRect.y = (screenDimension.h * 615)/1080; @@ -470,8 +551,9 @@ void mainLoop(){ a = SDL_GetTicks(); delta = (a - b); if (delta > 1000/FPS_TO_GET){ + fps = 1000/delta; timer += delta; - printf("%d\n", (int)timer % 1000); + //printf("%d\n", (int)timer % 1000); b = a; switch (gameState){ case MENU: @@ -484,17 +566,24 @@ void mainLoop(){ } //updateMap(); drawGame(); + if (fireList == NULL){ + gameState = WON; + } break; case LOSE: drawLost(); break; + + case WON: + drawWon(); + break; } } else { // fait dormir le thread pour garder des ressources usleep(1000 * (1000/FPS_TO_GET - delta)); } - } + endSDL(); } \ No newline at end of file