void Runner::moveStep(float delta) { Cell* cell = field->cell(x,y); if (!climbing) if (cell->growing() && ((GrowingCell*)cell)->solid()) { this->die(); return; } if (falling) { if (checkFall(delta)); catchBonus(); } if (climbing) { x = x + vx * delta; y = y + vy * delta; checkClimb(); } if (!busy()) { if (vx < 0) tryMoveLeft(delta); else if (vx > 0) tryMoveRight(delta); catchBonus(); if (!field->hasSurface(round(x), y)) fall(); } if (stopping) doStop(); if (fabs(x-field->grenadePutX)>0.3 || fabs(y-field->grenadePutY)>0.3) field->grenadePutX = 1000; }
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--; } } } }