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 :