diff --git a/travail_de_groupe/jeu_appren_par_renfo/.vscode/settings.json b/travail_de_groupe/jeu_appren_par_renfo/.vscode/settings.json new file mode 100644 index 0000000000000000000000000000000000000000..a7361b1789711920f04de454549e57ad57fb63f1 --- /dev/null +++ b/travail_de_groupe/jeu_appren_par_renfo/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "files.associations": { + "qlearn.h": "c" + } +} \ No newline at end of file diff --git a/travail_de_groupe/jeu_appren_par_renfo/Res/racket.png b/travail_de_groupe/jeu_appren_par_renfo/Res/racket.png index 0c54b73d27e8ef725f32fa8bb27f8e725e2f4e1c..bc5c2bd3f4eb4fa7f65a86a6526724ee33212fde 100644 Binary files a/travail_de_groupe/jeu_appren_par_renfo/Res/racket.png and b/travail_de_groupe/jeu_appren_par_renfo/Res/racket.png differ diff --git a/travail_de_groupe/jeu_appren_par_renfo/Res/sky.png b/travail_de_groupe/jeu_appren_par_renfo/Res/sky.png index 1526c651f281167ff093aa7785e3b389779125d2..9ff0b7b86f9063ff498b83d6283794295507f803 100644 Binary files a/travail_de_groupe/jeu_appren_par_renfo/Res/sky.png and b/travail_de_groupe/jeu_appren_par_renfo/Res/sky.png differ diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/ball.c b/travail_de_groupe/jeu_appren_par_renfo/src/ball.c index 9c3acb03b507c92c84055610aa8d69ea262de04f..b9fd1f53f0c0dda64112bb01a4a13fb459c0b334 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/ball.c +++ b/travail_de_groupe/jeu_appren_par_renfo/src/ball.c @@ -13,6 +13,8 @@ void initBall() ball.isHit = 0; ball.angle = -pi; ball.speed = 0; + landingPointEnnemyIsFind = 0; + landingPointPlayerIsFind = 0; } //ball_t ball; int trajectoireAntoine[NUMBERPOINT_TRAJEC][2]; @@ -134,7 +136,12 @@ void updateBall() if (ball.isHit) { // landingPoint est déjà / BLOCK_SIZE de base - ball.z = lagrangeInterpolation(ball.x / BLOCK_SIZE, lastHitPoint[0] / BLOCK_SIZE, lastHitPoint[1] / BLOCK_SIZE, 15, 2 * player.h / BLOCK_SIZE, landingPoint[0], 0); + if (ball.isTravelingTo == AI){ + ball.z = lagrangeInterpolation(ball.x / BLOCK_SIZE, lastHitPointPlayerX / BLOCK_SIZE, lastHitPointPlayerY / BLOCK_SIZE, 15, 2 * player.h / BLOCK_SIZE, landingPointPlayerX, 0); + } + else if (ball.isTravelingTo == PLAYER){ + ball.z = lagrangeInterpolation(ball.x / BLOCK_SIZE, lastHitPointEnnemyX / BLOCK_SIZE, lastHitPointEnnemyY / BLOCK_SIZE, 15, 2 * ennemy.h / BLOCK_SIZE, landingPointEnnemyX, 0); + } } if (ball.z < 0) { diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.c b/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.c index eb13224514a7c77d3d0983ab1e8b0c0e54309d1e..2063cdfebc6020a0a3708759ad1e050007c2efe4 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.c +++ b/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.c @@ -1,5 +1,13 @@ #include "player.h" +int landingPointEnnemyX; +int landingPointEnnemyY; + +int lastHitPointEnnemyX; +int lastHitPointEnnemyY = 0; + +int landingPointEnnemyIsFind = 0; + int angleF; int angleH; int ennemyZone; @@ -22,12 +30,12 @@ void manageEnnemyMovement() { if (ball.isTravelingTo == AI) { - angleF = defineAngleF(lastHitPoint[0], lastHitPoint[1], landingPoint[0], landingPoint[1]); + angleF = defineAngleF(lastHitPointPlayerX, lastHitPointPlayerY, landingPointPlayerX, landingPointPlayerY); angleF = converterIntoAngleF(angleF); - angleH = defineAngleH(lastHitPoint[0], landingPoint[0]); + angleH = defineAngleH(lastHitPointPlayerX, landingPointPlayerX); angleH = converterIntoAngleH(angleH); ennemyZone = convertIntoZone(ennemy.x, ennemy.y); - canonZone = convertIntoZone(lastHitPoint[0], lastHitPoint[1]); + canonZone = convertIntoZone(lastHitPointPlayerX, lastHitPointPlayerY); action = takeAction(ennemy.x, ennemy.y, Q, canonZone, angleH, angleF, 1); while (ennemyHasMoved == 0) { @@ -90,44 +98,40 @@ void manageEnnemyMovement() } } -int * generateLandingPointEnnemy(){ - int *landingPoint = malloc(sizeof(int) * 2); +int generatelandingPointEnnemy(){ int randomPointX = rand() % ((MAP_WIDTH-1)/2); - landingPoint[0] = randomPointX ; - landingPoint[1] = 0; - landingPointIsFind = 1; + landingPointEnnemyIsFind = 1; + landingPointPlayerIsFind = 0; - return landingPoint; + return randomPointX; } + void ennemyHitBall(){ if (sqrt(pow(ennemy.x - ball.x, 2) + pow(ennemy.y - ball.y, 2)) / BLOCK_SIZE < HIT_RANGE) { if (ball.isTravelingTo == AI) { - if(landingPointIsFind == 0){ - freeIntList(landingPoint); - landingPoint = generateLandingPointEnnemy(); - } - ball.isTravelingTo = PLAYER; - ball.angle = ennemy.angle; - ball.speed = HIT_FORCE; - ball.isHit = 1; - lastHitPoint[0] = ball.x; - lastHitPoint[1] = player.h; - - printf("ennemy new lastHitPoint : %d %d\n", lastHitPoint[0]/BLOCK_SIZE, lastHitPoint[1]/BLOCK_SIZE); + //cherche et trouve point de chute, UNE SEULE FOIS! + if(landingPointEnnemyIsFind == 0){ + landingPointEnnemyX = generatelandingPointEnnemy(); + ball.isTravelingTo = PLAYER; + ball.angle = ennemy.angle; + ball.speed = HIT_FORCE; + ball.isHit = 1; + lastHitPointEnnemyX = ball.x; + lastHitPointEnnemyY = player.h; + } - printf("ennemy new landingPoint : %d %d\n", landingPoint[0]/BLOCK_SIZE, landingPoint[1]/BLOCK_SIZE); } } } void manageEnnemy(){ - if (SDL_GetTicks() % 1000 < 100) + if (SDL_GetTicks() % 1000 < 50) { manageEnnemyMovement(); } diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.h b/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.h index 660453be677e92987bb34dee561e04e36fa87d61..a4f58a2d7e941ceb86fd61491097792e57c4bd9d 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.h +++ b/travail_de_groupe/jeu_appren_par_renfo/src/ennemy.h @@ -8,7 +8,13 @@ #include "qlearn.h" +extern int landingPointEnnemyX; +extern int landingPointEnnemyY; +extern int lastHitPointEnnemyX; +extern int lastHitPointEnnemyY; + +extern int landingPointEnnemyIsFind; void initEnnemy(); void manageEnnemy(); diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/gest_event.c b/travail_de_groupe/jeu_appren_par_renfo/src/gest_event.c index 7e2656a61fe2fc93d978cfd4d068f2585fd52c76..c8820a7125538c776f736626136d2dd47b24de46 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/gest_event.c +++ b/travail_de_groupe/jeu_appren_par_renfo/src/gest_event.c @@ -68,11 +68,11 @@ void gestGame() } if (event.motion.yrel > 0) { - player.viewAngle -= 1; + player.viewAngle -= 0.05 * RD; } if (event.motion.yrel < 0) { - player.viewAngle += 1; + player.viewAngle += 0.05 * RD; } player.deltax = cos(player.angle); player.deltay = sin(player.angle); @@ -118,7 +118,8 @@ void gestGame() case SDLK_b: initBall(); - landingPointIsFind = 0; + landingPointPlayerIsFind = 0; + landingPointEnnemyIsFind = 0; break; default: @@ -151,21 +152,20 @@ void gestGame() case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_LEFT) { - if (player.isHitting) - { - player.isHitting = 0; - } - else - { - player.isHitting = 1; - } + player.isHoldingClick = 1; + player.startHitTimer = timer; + player.startHitBool = 0; } break; case SDL_MOUSEBUTTONUP: + if (event.button.button == SDL_BUTTON_LEFT) { - player.isHitting = 0; + player.endHitTimer = timer; + player.startHitBool = 1; + player.hitIntensity = (player.endHitTimer - player.startHitTimer) / 200; + player.isHoldingClick = 0; } break; diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/player.c b/travail_de_groupe/jeu_appren_par_renfo/src/player.c index b6d289bad2bcb17d39bbb2ed928b1ea74d144ad2..fd90101074bd545467cf0dbaefe07f8c27c9e2f6 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/player.c +++ b/travail_de_groupe/jeu_appren_par_renfo/src/player.c @@ -3,9 +3,16 @@ player_t player; player_t ennemy; -int *landingPoint; -int *lastHitPoint; -int landingPointIsFind = 0; +int landingPointPlayerX; +int landingPointPlayerY = 0; + +int lastHitPointPlayerX; +int lastHitPointPlayerY; + +int rxWall, ryWall; +float distanceWall; + +int landingPointPlayerIsFind = 0; void initPlayer() { @@ -21,81 +28,54 @@ void initPlayer() ennemy.angle = -pi; player.speed = 100; player.isMoving = 0; - player.HPMax = 3; - player.currentHP = player.HPMax; - player.coins = 0; player.angle = 0; player.deltax = 1; player.deltay = 0; player.viewAngle = 0; } -int *generateLandingPoint(int rxWall) +int generatelandingPointPlayer(int rxWall, float hitIntensity) { - int *landingPoint = malloc(sizeof(int) * 2); - - int randomPointX = MAP_WIDTH/2 + 1 + rand()%(rxWall/BLOCK_SIZE - (MAP_WIDTH/2)); - landingPoint[0] = randomPointX ; - landingPoint[1] = 0; - landingPointIsFind = 1; + int randomPointX = MAP_WIDTH/2 + hitIntensity * 5; - return landingPoint; -} - -int *allocLastHitPoint() -{ - int *lastHitPoint = (int *)malloc(sizeof(int) * 2); - lastHitPoint[0] = 0; - lastHitPoint[1] = 0; - return lastHitPoint; -} + landingPointPlayerIsFind = 1; + landingPointEnnemyIsFind = 0; -void freeIntList(int *list) -{ - if (list != NULL) - { - free(list); - } + return randomPointX; } void hitBall() { if (sqrt(pow(player.x - ball.x, 2) + pow(player.y - ball.y, 2)) / BLOCK_SIZE < HIT_RANGE) { - int rxWall, ryWall; - float distanceWall; int rxNet, ryNet; float distanceNet; - if (player.isHitting) + if (player.startHitBool) { castSingleRay(player.angle, &distanceWall, &distanceNet, &rxWall, &ryWall, &rxNet, &ryNet); // printf("hit\n"); if (rxWall > MAP_WIDTH/2) { - - freeIntList(lastHitPoint); - lastHitPoint = allocLastHitPoint(); //cherche et trouve point de chute, UNE SEULE FOIS! - if(landingPointIsFind == 0){ - freeIntList(landingPoint); - landingPoint = generateLandingPoint(rxWall); - } + if(landingPointPlayerIsFind == 0){ + + landingPointPlayerX = generatelandingPointPlayer(rxWall, player.hitIntensity); - lastHitPoint[0] = ball.x; - lastHitPoint[1] = player.h; + lastHitPointPlayerX = ball.x; + lastHitPointPlayerY = player.h; - ball.angle = player.angle; - ball.speed = HIT_FORCE; - ball.z = player.h; - ball.isHit = 1; - ball.isTravelingTo = AI; + ball.angle = player.angle; + ball.speed = player.hitIntensity * 5; + // ball.z = player.h; + ball.isHit = 1; + ball.isTravelingTo = AI; - printf("ennemy new lastHitPoint : %d %d\n", lastHitPoint[0]/BLOCK_SIZE, lastHitPoint[1]/BLOCK_SIZE); + player.startHitBool = 0; + } - printf("ennemy new landingPoint : %d %d\n", landingPoint[0]/BLOCK_SIZE, landingPoint[1]/BLOCK_SIZE); } // printf("valid hit\n"); } @@ -132,4 +112,5 @@ void managePlayer() manageMovement(); hitBall(); updateBall(); + player.hitIntensityTimer = timer - player.startHitTimer; } \ No newline at end of file diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/player.h b/travail_de_groupe/jeu_appren_par_renfo/src/player.h index ca036f8f246d56c3d93046d0c21c4ffead7b7cc7..191e3e342c2ae9b090dd6e36f92e57795c68defd 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/player.h +++ b/travail_de_groupe/jeu_appren_par_renfo/src/player.h @@ -13,6 +13,7 @@ #define HIT_RANGE 2 #define HIT_FORCE 2 #define MOVEMENT_SPEED 10 +#define MAX_HIT_TIME 3 typedef struct player { @@ -23,24 +24,32 @@ typedef struct player int w; int speed; int isMoving; - int isHitting; + int startHitBool; int isHit; int direction; - int HPMax; - int currentHP; - int coins; float angle; float deltax; float deltay; float viewAngle; + float startHitTimer; + float endHitTimer; + float hitIntensity; + float hitIntensityTimer; + int isHoldingClick; } player_t; extern player_t player; extern player_t ennemy; -extern int *landingPoint; -extern int *lastHitPoint; -extern int landingPointIsFind; +extern int landingPointPlayerX; +extern int landingPointPlayerY; +extern int lastHitPointPlayerX; +extern int lastHitPointPlayerY; +extern int landingPointPlayerIsFind; + +extern int rxWall; + +int generatelandingPointPlayer(int rxWall, float hitIntensity); void initPlayer(); void managePlayer(); void freeIntList(int *list); diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/render.c b/travail_de_groupe/jeu_appren_par_renfo/src/render.c index 02a5f7c08cc96b0ae1696de6f1e1fe14d7728993..5ef4e149bbc49cec51227d69a20a71fc819198d7 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/render.c +++ b/travail_de_groupe/jeu_appren_par_renfo/src/render.c @@ -1,5 +1,7 @@ #include "render.h" +float timer = 0; + SDL_Window *window; SDL_Renderer *renderer; @@ -808,22 +810,31 @@ void drawBall() void drawSkyAndGround() { - destRect.x = ((int)((player.angle + pi) * RD + player.x / BLOCK_SIZE)); - destRect.y = 0; - destRect.w = 100; - destRect.h = 128 / 2; rect.x = 0; rect.y = screenDimension.h / 2 + player.viewAngle; rect.h = screenDimension.h - rect.y; rect.w = screenDimension.w; - SDL_RenderCopy(renderer, groundTexture, &destRect, &rect); + + SDL_RenderCopy(renderer, groundTexture, NULL, &rect); + + sky.x = 0; sky.y = 0; sky.w = screenDimension.w; sky.h = screenDimension.h / 2 + player.viewAngle; + destRect.x = 500 + (((player.angle + pi) * RD + player.x / BLOCK_SIZE)); + if (player.angle > pi){ + destRect.x = 500 + (((player.angle - pi) * RD + player.x / BLOCK_SIZE)); + } + + printf("%d\n", sky.h); + destRect.y =0; + destRect.w = 100; + destRect.h = 128; + SDL_RenderCopy(renderer, skyTexture, &destRect, &sky); SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); @@ -831,7 +842,7 @@ void drawSkyAndGround() void drawRacket() { - // todo + SDL_RenderCopy(renderer, racketTexture, NULL, NULL); } void drawMap2D(int map[][MAP_WIDTH]) @@ -894,10 +905,22 @@ void drawMap2D(int map[][MAP_WIDTH]) SDL_RenderFillRect(renderer, &rect); // draw landing point - if (landingPointIsFind == 1) + if (landingPointPlayerIsFind == 1) { SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); - rect.x = landingPoint[0] * CELL_SIZE; + rect.x = landingPointPlayerX * CELL_SIZE; + rect.y = CELL_SIZE; + rect.h = (MAP_HEIGHT - 2) * CELL_SIZE; + rect.w = 3; + SDL_RenderFillRect(renderer, &rect); + // reset taille cellule + rect.h = CELL_SIZE; + rect.w = CELL_SIZE; + } + if (landingPointEnnemyIsFind == 1) + { + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); + rect.x = landingPointEnnemyX * CELL_SIZE; rect.y = CELL_SIZE; rect.h = (MAP_HEIGHT - 2) * CELL_SIZE; rect.w = 3; @@ -930,6 +953,16 @@ void drawString(char *str, int x, int y, int w, int h, int r, int g, int b, int SDL_DestroyTexture(texture); } +void drawHitIntensity(){ + SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); + rect.w = screenDimension.w/20; + rect.x = screenDimension.w - rect.w; + //printf("%f\n", player.hitIntensityTimer); + rect.h = 2 * screenDimension.h/2 * ( player.hitIntensityTimer/1000); + rect.y = 3 * screenDimension.h/4 - rect.h; + SDL_RenderFillRect(renderer, &rect); +} + void drawFPS() { char str[10]; @@ -993,22 +1026,26 @@ void drawGame() if (ball.x < MAP_WIDTH * BLOCK_SIZE / 2) { drawVerticalWalls(); - drawEnnemy(); drawHorizentalWalls(); + drawEnnemy(); drawVerticalNet(); drawBall(); } else { drawVerticalWalls(); - drawEnnemy(); drawHorizentalWalls(); + drawEnnemy(); // todo bonus : draw point de chute de la balle drawBall(); drawVerticalNet(); } drawMap2D(map); drawRacket(); + if (player.isHoldingClick){ + + drawHitIntensity(); + } drawFPS(); // affiche le hub if (showHub) @@ -1055,6 +1092,7 @@ void mainLoop() if (delta > 1000 / FPS_TO_GET) { fps = 1000 / delta; + timer += delta; b = a; switch (game_state) { diff --git a/travail_de_groupe/jeu_appren_par_renfo/src/render.h b/travail_de_groupe/jeu_appren_par_renfo/src/render.h index f6a2215409ecd55ef5310278554c9b07bea55bbe..85b98f2182a8593afdb1f69257b6c3aa40307129 100644 --- a/travail_de_groupe/jeu_appren_par_renfo/src/render.h +++ b/travail_de_groupe/jeu_appren_par_renfo/src/render.h @@ -35,8 +35,7 @@ extern SDL_Window *window; extern SDL_Renderer *renderer; extern SDL_DisplayMode screenDimension; -extern int *ray1; -extern int *ray2; +extern float timer; extern int showHub;