void killPlayer(void) { /* On met le timer à 1 pour tuer le joueur instantanément */ player.timerMort = 1; player.dirX = 0; player.dirY = 0; /* On joue le son */ playSoundFx(DESTROY); }
void playerHurts(GameObject entity) { /* Si le timer d'invincibilité est à 0, on perd un coeur */ if(player.invincibleTimer == 0 && !player.touch) { player.life--; player.invincibleTimer = 10; player.touch = 1; touchDir(player.direction, &player, entity); playSoundFx(DESTROY); } }
void getItem(Game* game){ game->coin++; playSoundFx(COINSOUND,game); }
void updateObject(Game* game){ int i; for(i=0; i<game->objectNumber; i++){ switch (game->map->objects[i].type){ case FLY : if(game->map->objects[i].initialized == 0) initializeMonster(&(game->map->objects[i]),game->map->objects[i].x,game->map->objects[i].y); if(game->map->objects[i].initialized == 1) updateMonsters(game, &(game->map->objects[i])); break; case COIN : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 0)) { getItem(game); game->map->objects[i].initialized =1 ; } break; case DOOR : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 0)){ game->level++; endLevel(game); } break; case BLUE_BLOCK : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 0)){ isSolid(game->player,&(game->map->objects[i])); } break; case GREEN_BLOCK : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 0)){ isSolid(game->player,&(game->map->objects[i])); } break; case YELLOW_BLOCK : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 0)){ isSolid(game->player,&(game->map->objects[i])); } break; case RED_BLOCK : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 1)){ isSolid(game->player,&(game->map->objects[i])); } break; case PICK : if((collidePick(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 0)){ if(game->life > 0) { game->life--; game->player->timerMort = 1; if(game->life<1) playerGameover(game); } } break; case ELEVATOR_BLOCK : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 1)){ isSolid(game->player,&(game->map->objects[i])); } break; case ELEVATOR_SWITCH : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 0) && (game->input->use == 1)){ activateSwitch(ELEVATOR_BLOCK,game); game->map->objects[i].initialized = 1; game->input->use =0; playSoundFx(SWITCHSOUND,game); break; } if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 1) && (game->input->use == 1)){ desactivateSwitch(ELEVATOR_BLOCK,game); game->map->objects[i].initialized = 0; game->input->use = 0; playSoundFx(SWITCHSOUND,game); break; } break; case BLUE_SWITCH : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 0) && (game->input->use == 1)){ activateSwitch(BLUE_BLOCK,game); game->map->objects[i].initialized = 1; game->input->use =0; playSoundFx(SWITCHSOUND,game); break; } if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 1) && (game->input->use == 1)){ desactivateSwitch(BLUE_BLOCK,game); game->map->objects[i].initialized = 0; game->input->use = 0; playSoundFx(SWITCHSOUND,game); break; } break; case GREEN_SWITCH : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 0) && (game->input->use == 1)){ activateSwitch(GREEN_BLOCK,game); game->map->objects[i].initialized = 1; game->input->use =0; playSoundFx(SWITCHSOUND,game); break; } if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 1) && (game->input->use == 1)){ desactivateSwitch(GREEN_BLOCK,game); game->map->objects[i].initialized = 0; game->input->use = 0; playSoundFx(SWITCHSOUND,game); break; } break; case YELLOW_SWITCH : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 0) && (game->input->use == 1)){ activateSwitch(YELLOW_BLOCK,game); game->map->objects[i].initialized = 1; game->input->use =0; playSoundFx(SWITCHSOUND,game); break; } if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 1) && (game->input->use == 1)){ desactivateSwitch(YELLOW_BLOCK,game); game->map->objects[i].initialized = 0; game->input->use = 0; playSoundFx(SWITCHSOUND,game); break; } break; case RED_SWITCH : if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 0) && (game->input->use == 1)){ activateSwitch(RED_BLOCK,game); game->map->objects[i].initialized = 1; game->input->use =0; playSoundFx(SWITCHSOUND,game); break; } if((collideObject(game->player,&(game->map->objects[i])) == 1) && (game->map->objects[i].initialized == 1) && (game->input->use == 1)){ desactivateSwitch(RED_BLOCK,game); game->map->objects[i].initialized = 0; game->input->use = 0; playSoundFx(SWITCHSOUND,game); break; } break; default : break; } } }
void updatePlayer(GameObject *player, Game *game) { //On rajoute un timer au cas où notre héros mourrait lamentablement en tombant dans un trou... //Si le timer vaut 0, c'est que tout va bien, sinon, on le décrémente jusqu'à 0, et là, //on réinitialise. //C'est pour ça qu'on ne gère le joueur que si ce timer vaut 0. if (player->timerMort == 0) { //On réinitialise notre vecteur de déplacement latéral (X), pour éviter que le perso //ne fonce de plus en plus vite pour atteindre la vitesse de la lumière ! ;) //Essayez de le désactiver pour voir ! player->dirX = 0; // La gravité fait toujours tomber le perso : on incrémente donc le vecteur Y player->dirY += GRAVITY_SPEED; //Mais on le limite pour ne pas que le joueur se mette à tomber trop vite quand même if (player->dirY >= MAX_FALL_SPEED) { player->dirY = MAX_FALL_SPEED; } //Voilà, au lieu de changer directement les coordonnées du joueur, on passe par un vecteur //qui sera utilisé par la fonction mapCollision(), qui regardera si on peut ou pas déplacer //le joueur selon ce vecteur et changera les coordonnées du player en fonction. if (game->input->left == 1) { player->dirX -= PLAYER_SPEED; player->direction = LEFT; //On teste le sens pour l'animation : si le joueur allait dans le sens contraire //précédemment, il faut recharger le spritesheet pour l'animation. if(player->etat != WALK_LEFT && player->onGround ==1) { player->etat = WALK_LEFT; changeAnimation(player, "data/graphics/walkleft.png"); } } else if (game->input->right == 1) { player->dirX += PLAYER_SPEED; player->direction = RIGHT; if(player->etat != WALK_RIGHT && player->onGround == 1) { player->etat = WALK_RIGHT; changeAnimation(player, "data/graphics/walkright.png"); } } else if(game->input->right == 0 && game->input->left ==0 && player->onGround == 1) { if(player->etat!=IDLE) { player->etat = IDLE; changeAnimation(player, "data/graphics/idle.png"); } } //Et voici la fonction de saut très simple : //Si on appuie sur la touche saut (C par défaut) et qu'on est sur le sol, alors on attribue une valeur //négative au vecteur Y //parce que sauter veut dire se rapprocher du haut de l'écran et donc de y=0. if (game->input->jump == 1 && player->onGround) { player->dirY = -JUMP_HEIGHT; player->onGround = 0; playSoundFx(JUMPSOUND, game); } if(player->onGround ==0) { if(player->direction == RIGHT && player->etat != JUMP_RIGHT) { player->etat = JUMP_RIGHT; changeAnimation(player, "data/graphics/jumpright.png"); } else if(player->direction == LEFT && player->etat != JUMP_LEFT) { player->etat = JUMP_LEFT; changeAnimation(player, "data/graphics/jumpleft.png"); } } //On rajoute notre fonction de détection des collisions qui va mettre à jour les coordonnées //de notre super lapin, puis on centre le scrolling comme avant. mapCollision(player,game->map,game); centerScrollingOnPlayer(player, game->map); } //Gestion de la mort quand le héros tombe dans un trou : //Si timerMort est différent de 0, c'est qu'il faut réinitialiser le joueur. //On ignore alors ce qui précède et on joue cette boucle (un wait en fait) jusqu'à ce que // timerMort == 1. A ce moment-là, on le décrémente encore -> il vaut 0 et on réinitialise //le jeu avec notre bonne vieille fonction d'initialisation ;) ! if (player->timerMort > 0) { player->timerMort--; } }
void updateMonsters(void) { int i; //On passe en boucle tous les monstres du tableau for ( i = 0; i < jeu.nombreMonstres; i++ ) { //Même fonctionnement que pour le joueur if (monster[i].timerMort == 0) { monster[i].dirX = 0; monster[i].dirY += GRAVITY_SPEED; if (monster[i].dirY >= MAX_FALL_SPEED) monster[i].dirY = MAX_FALL_SPEED; //Test de collision dans un mur : si la variable x reste la même, deux tours de boucle //durant, le monstre est bloqué et on lui fait faire demi-tour. if (monster[i].x == monster[i].saveX || checkFall(monster[i]) == 1 ) { if (monster[i].direction == LEFT) { monster[i].direction = RIGHT; changeAnimation(&monster[i], "graphics/monster1right.png"); } else { monster[i].direction = LEFT; changeAnimation(&monster[i], "graphics/monster1.png"); } } //Déplacement du joueur selon la direction if(monster[i].direction == LEFT) monster[i].dirX -= 2; else monster[i].dirX += 2; //On sauvegarde les coordonnées du joueur pour gérer le demi-tour //avant que mapCollision ne les modifie. monster[i].saveX = monster[i].x; //On détecte les collisions avec la map comme pour le joueur monsterCollisionToMap(&monster[i]); //On détecte les collisions avec le joueur //Si c'est égal à 1, on tue le joueur... Sniff... if (collide(&player, &monster[i]) == 1) { //On met le timer à 1 pour tuer le joueur intantanément player.timerMort = 1; playSoundFx(DESTROY); } else if (collide(&player, &monster[i]) == 2) { //On met le timer à 1 pour tuer le monstre intantanément monster[i].timerMort = 1; playSoundFx(DESTROY); } } //Si le monstre meurt, on active une tempo if (monster[i].timerMort > 0) { monster[i].timerMort--; /* Et on le remplace simplement par le dernier du tableau puis on rétrécit le tableau d'une case (on ne peut pas laisser de case vide) */ if (monster[i].timerMort == 0) { /* Libère le sprite */ if (monster[i].sprite != NULL) { SDL_FreeSurface(monster[i].sprite); } monster[i] = monster[jeu.nombreMonstres-1]; jeu.nombreMonstres--; } } } }