Collisions à tire larigot !

Description

C'est un petit programme qui simule des collisions entre des disques. Et dès qu'on clique sur un disque, il explose et fait exploser d'autres disques qui rentrent en contact avec lui, ce qui entraine une superbe réaction en chaîne! Le programme utilise des fonctions mathématique pour dessiner les disques, réorienter les disques, simuler les explosions des disques.

Source / Exemple :


//Voici la fonction qui "réoriente" la trajectoire d'un disque quand il en percute un autre
void redefinirVecteurs(Disque* disqueAct, const Disque* disqueInc)
{
  Coordonnee c={0,0}, d={0,0}, e={0,0}, f={0,0};
  EquationDroite droiteD={0,0}, droiteF={0,0}, droiteTmp={0,0};

  //calcul du point qui est au milieu de la droite passant par les centres des disques
  c.x=((double)disqueAct->pos[COURANTE].x+(double)disqueInc->pos[COURANTE].x)/2.0;
  c.y=((double)disqueAct->pos[COURANTE].y+(double)disqueInc->pos[COURANTE].y)/2.0;

  //////////////////////////////////////////////
  // calcul du nouveau vecteur de "disqueAct" //
  //////////////////////////////////////////////

  //calcul de l'origine (point) du vecteur du disque dont l'extremite est confondue avec le point C
  d.x=c.x-disqueAct->vecteur.w;
  d.y=c.y-disqueAct->vecteur.h;

  //si la tangente aux 2 disques n'est pas parallèle à l'axe des ordonnees
  if(((double)disqueAct->pos[COURANTE].x-(double)disqueInc->pos[COURANTE].x)!=0)
  {
    //calcul de l'equation de droite passant par les centres des 2 disques en collision (ou tangente)
    droiteD.coeffDir=(((double)disqueAct->pos[COURANTE].y-(double)disqueInc->pos[COURANTE].y)/
                      ((double)disqueAct->pos[COURANTE].x-(double)disqueInc->pos[COURANTE].x));
    droiteD.ordOrig=(double)disqueInc->pos[COURANTE].y-(double)droiteD.coeffDir*(double)disqueInc->pos[COURANTE].x;

    //si la tangente aux 2 disques n'est pas parallèle à l'axe des abscisses
    if(droiteD.coeffDir!=0)
    {
      //calcul de l'equation de droite perpendiculaire à la droite D et passant par le point c
      droiteF.coeffDir=(-1.0)/(droiteD.coeffDir);
      droiteF.ordOrig=d.y-droiteF.coeffDir*d.x;

      //calcul de l'equation de droite qui permettra de trouver les coordonnees de e; (Tmp=D-F) <=>
      droiteTmp.coeffDir=droiteD.coeffDir-droiteF.coeffDir;
      droiteTmp.ordOrig=droiteD.ordOrig-droiteF.ordOrig;

      //calcul des coordonnees du point e
      e.x=-droiteTmp.ordOrig/droiteTmp.coeffDir;
      e.y=droiteD.coeffDir*e.x+droiteD.ordOrig;

      //calcul de l'extremite du nouveau vecteur du disque
      f.x=2*e.x-d.x;
      f.y=2*e.y-d.y;

      //calcul du nouveau vecteur
      disqueAct->vecteur.w=ceil(f.x-c.x);
      disqueAct->vecteur.h=ceil(f.y-c.y);
    }
    else
    disqueAct->vecteur.w=-disqueAct->vecteur.w;
  }
  else
  disqueAct->vecteur.h=-disqueAct->vecteur.h;

  initVecteur(disqueAct);

  disqueAct->i=1;

  AFFECTATION_POS(disqueAct->pos[COURANTE], disqueAct->pos[DE_REFERENCE]);
  AFFECTATION_POS(disqueAct->pos[COURANTE], disqueAct->pos[ACTUEL]);
}

Conclusion :


Le programme contient quelques bugs: il plante quand il y a trop d'explosions en même temps, les disques se traversent lors d'une collision... Et il reste beaucoup à faire comme faire une gestion des scores, améliorer la gestion des collisions...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.