Mise en place des missiles

Lorsqu'on touche sur la touche FEU, une nouvelle cellule missile doit être créée si la liste est vide. Sinon on parcourt la liste chaînée jusqu'à la dernière cellule et on crée une nouvelle cellule en fin de liste.

if ((rp->collision == 1) || (rp->module_rot>=_PI && rp->module_rot<_2PI))
for(i=23; i<30; i++) 
if ((-rp->coord_0.x)+rp->rayon>pl[i][2] && (-rp->coord_0.x)-rp->rayon<pl[i][2]) {
if((-rp->coord_0.z)>pl[i][1] && (-rp->coord_0.z)<pl[i][0])
{rp->coord_0.x-=p_x; }

if((-rp->coord_0.z)+rp->rayon>pl[i][1] && (-rp->coord_0.z)-rp->rayon<pl[i][0]) {
if (((-rp->coord_0.x)-pl[i][2])*((-rp->coord_0.x)-pl[i][2])+((-rp->coord_0.z)-pl[i][0])*((-rp->coord_0.z)-pl[i][0])<rp->rayon*rp->rayon)
{rp->coord_0.x-=p_x; }

if (((-rp->coord_0.x)-pl[i][2])*((-rp->coord_0.x)-pl[i][2])+((-rp->coord_0.z)-pl[i][1])*((-rp->coord_0.z)-pl[i][1])<rp->rayon*rp->rayon)
{rp->coord_0.x-=p_x; }
}
}

if (etm->feu==1) {

if (rp->missile==NULL)
{

rp->missile = (Missile)malloc(sizeof(Miss));
rp->missile->coord.x=rp->coord_0.x;
rp->missile->coord.z=rp->coord_0.z;
rp->missile->t_rot=rp->module_rot;
rp->missile->precedent = rp->missile->suivant = NULL; 
}

else {
Missile cellule = rp->missile;
Missile celtmp = cellule;

while(cellule->suivant) 

cellule = cellule->suivant;

if (cellule->suivant==NULL) {
cellule->suivant = (Missile)malloc(sizeof(Miss));
cellule->suivant->coord.x=rp->coord_0.x;
cellule->suivant->coord.z=rp->coord_0.z;
cellule->suivant->t_rot=rp->module_rot;
cellule->suivant->precedent=celtmp;
cellule->suivant->suivant=NULL;
}
celtmp = cellule->suivant;
}
}
etm->feu=2;
}

Pour placer dans la matrice Monde le missile il nous faudra combiner l'angle formé par le module, ses coordonnées cartésiennes ainsi que les coordonnées cartésiennes du missile.

Pour effectuer une combinaison entre deux matrices de transformation il suffit de les multiplier entre elles. On aura :

Matrice de translation * Matrice de rotation sur Y = M

   1       0       0       0       cos(r)       0       -sin(r)       0   

cos(r)   

   0   

-sin(r)

   0   
   0    1    0    0    *       0    1

0

   0    =   

0

   1

0

0

   0    0    1    0    sin(r)    0    cos(r)    0

sin(r)

   0

cos(r)

0

   a    b    c    1    0    0

0

   1 a * cos(r) + c * sin(r)    b -a * sin(r) + c * cos(r)

1

On remarque que seules trois cellules de la matrice de rotation sont à modifier. On n'a donc pas a tout recalculer et on modifie par conséquent que les deux cellules _41 et _43. on a pas a modifier la cellule _42 car la fonction rotation_Y n'affecte pas cette cellule.

Ensuite on met le missile dans le back buffer et on le fait avancer en recalculant la projection sur les axes X et Z : 

cell->coord.x+=sin(cell->t_rot)*4;
cell->coord.z-=cos(cell->t_rot)*4;


Missile cell = rp->missile;

if (etm->feu==2) {
while(cell) {

rp->monde._41=(rp->coord_0.x-cell->coord.x)*cos(rp->module_rot)+(rp->coord_0.z-cell->coord.z)*sin(rp->module_rot);
rp->monde._43=-(rp->coord_0.x-cell->coord.x)*sin(rp->module_rot)+(rp->coord_0.z-cell->coord.z)*cos(rp->module_rot);

rotation_Y(&rp->monde, rp->module_rot - cell->t_rot);

projection(&rp->monde, &(*D3DD));

obj2device_dessin_mesh(mtm_missile->nbr_de_mat, mtm_missile, &(*D3DD), &mtm_missile->obj_mesh);

cell->coord.x+=sin(cell->t_rot)*4;
cell->coord.z-=cos(cell->t_rot)*4;

cell = cell->suivant;
}
}

Ici on détermine la collision entre missiles et modules. S'il y a une collision pour l'instant on change les coordonnées du modules. Plus tard on créera une explosion.

int destr = 0; 
cell = rp->missile;

while(cell) {

if(rp2->rayon*rp2->rayon>(rp2->coord_0.z-cell->coord.z)*(rp2->coord_0.z-cell->coord.z) + (rp2->coord_0.x-cell->coord.x)*(rp2->coord_0.x-cell->coord.x)) {

rp2->position_cam.x = 0.0f;
rp2->position_cam.y = 0.0f;
rp2->position_cam.z = -70.0f;
rp2->monde = identite();
rp2->rot_cam = 0.0f;
rp2->coef_rotation_module = 0.0f;
rp2->coef_vitesse_module = 0.0f;
rp2->coef_cam = 0.0f;
rp2->module_rot = 0.0f;
rp2->coord_0.x = 0.0f;
rp2->coord_0.y = 0.0f;
rp2->coord_0.z = 50.0f;
rp2->rayon = 20.0f;
rp2->coord_0.z = 50.0f;
rp2->coord_0.x = 0.0f;
rp2->collision = 0;
rp2->missile = NULL;
}

Enfin on détermine la collision avec les murs. Il est inutile de tester les quatre faces de chaque mur. Seules les faces Nord et Est suffisent par exemple.
A chaque fois qu'un missile rencontre un mur il faut modifier la structure 

for(i=0; i<7; i++) 

if (-20 < cell->coord.z+pl[i][2] && 20 > cell->coord.z+pl[i][2])
if(-cell->coord.x>pl[i][0] && -cell->coord.x<pl[i][1])
{
if(cell->precedent)
{cell->precedent->suivant = cell->suivant;
if(cell->suivant)
cell->suivant->precedent = cell->precedent;
}
else
{rp->missile = cell->suivant;
if(rp->missile)
rp->missile->precedent = NULL;
}
destr = 1;
}

for(i=7; i<15; i++) 
if (-20 < cell->coord.x+pl[i][2] && 20 > cell->coord.x+pl[i][2])

if(-cell->coord.z>pl[i][0] && -cell->coord.z<pl[i][1]) {

if(cell->precedent)
{cell->precedent->suivant = cell->suivant;
if(cell->suivant)
cell->suivant->precedent = cell->precedent;
}
else
{rp->missile = cell->suivant;

if(rp->missile)
rp->missile->precedent = NULL;
}
destr = 1;
}
cell = cell->suivant;
if (destr == 1) {destr = 0;}

}

Téléchargez la source, cliquez ci-dessous :