Les vies

La variable fin permet d'arrêter le jeu au bout d'un passage de 300 fois après la suppression de la dernière vie. On affiche alors GAME OVER en bleu. 9 permet d'indiquer le nombre de caractères et non la taille de la police. 

Pour le dernier paramètre on peu avoir

DT_BOTTOM
DT_CALCRECT
DT_CENTER
DT_EDITCONTROL
DT_END_ELLIPSIS or DT_PATH_ELLIPSIS
DT_EXPANDTABS
DT_EXTERNALLEADING
DT_HIDEPREFIX

Pour plus de précisions allez jeter un coup d'oeil dans l'aide du SDK.

...

int fin = 0;

VOID Rendu(HWND hWnd, unsigned int param, LPDIRECT3DDEVICE9 *D3DD, _module_ *rp, _module_ *rp2, _mesh_ *mtm_modulea, _mesh_ *mtm_laby, _mesh_ *mtm_missile, _mesh_ *mtm_moduleb, _mesh_ *mtm_coeur, clavier *etm)

...

// début de la scène
(*D3DD)->BeginScene();

if(fin == 300 && rp2->vies < 0) {

RECT rect;
rect.bottom = 160;
rect.left = 20;
rect.right = 260;
rect.top = 40;

HDC hdc;
hdc = GetDC( hWnd );

SetBkColor(hdc, 0x000000);
SetTextColor(hdc, 0xff0000);
DrawText(hdc, "GAME OVER", 9, &rect, DT_CENTER);

}

Ensuite on fait tourner un coeur sur son axe Y jusqu'à deux tours sur lui même, soit 4 * PI et on le passe dans le back buffer.
tcr correspond à l'angle de rotation et vies au nombre de vies.

if(rp->coef_cam && rp->coef_cam != 20.0f) {
rp->position_cam.z+=rp->coef_cam;

D3DVECTOR b = {0.0f, -.707f, .707f};
vue(rp, b, &(*D3DD));

rp->position_cam.z-=rp->coef_cam;
}
vue_settransf(rp, &(*D3DD));

perspective(mat_proj, &(*D3DD));

rp->monde._42 = -5.0f;
rp->monde._43 = 20.0f;
rp->monde._11 = rp->monde._33 = 1.0f;
rp->monde._13 = rp->monde._31 = 0.0f;

if (fin != 0 && fin < 300) fin++;

for(i = 0; i<(int)rp->vies && fin == 0; i++) {

rp->monde._41 = 10.0f - i * 5;

if(rp->tcr != 0.0f && i + 1 == (int)rp->vies)
rotation_Y(&rp->monde, rp->tcr+=.2f);

projection(&rp->monde, &(*D3DD));
obj2device_dessin_mesh(mtm_coeur->nbr_de_mat, mtm_coeur, &(*D3DD), &mtm_coeur->obj_mesh);

if(rp->tcr > 12.57f) rp->tcr = 0.0f;

}

C'est lorsque le missile atteint le module que l'on doit décrémenter la variable vies. On créera la fonction test_cell qui réajuste les pointeurs des cellules missiles pour ensuite supprimer la cellule proprement dite.

_____________________________________

void test_cell(Missile *r, Missile *c) {

int l = 0;
if((*c)->precedent){
(*c)->precedent->suivant = (*c)->suivant;
if((*c)->suivant)
(*c)->suivant->precedent = (*c)->precedent;
return;
}
else {
(*r) = (*c)->suivant;
if((*r))
(*r)->precedent = NULL;
return;
}

}

____________________________________

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;
}
}

int destr = 0; 

Missile cell0 = rp->missile;

while(cell0) {

int lib = 0;

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

rp2->tcr = .2f;

rp2->vies-=.10f;

if (rp2->vies < 0.0f && fin ==0) 

fin = 1;

lib = 1;
test_cell(&rp->missile, &cell0);
destr = 1;

}

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

if (-20 < cell0->coord.z+pl[i][2] && 20 > cell0->coord.z+pl[i][2])
if(-cell0->coord.x>pl[i][0] && -cell0->coord.x<pl[i][1])
{
lib = 1;
test_cell(&rp->missile, &cell0);
destr = 1;
}

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

if(-cell0->coord.z>pl[i][0] && -cell0->coord.z<pl[i][1]) {
lib = 1;
test_cell(&rp->missile, &cell0);
destr = 1;
}

if(lib == 1 && cell0->suivant == NULL) {free(cell0); cell0 = NULL;}
if (cell0) cell0 = cell0->suivant;
if(lib == 1 && cell0) {free(cell0->precedent);cell0 = NULL;}

if (destr == 1) {destr = 0;}

}

Enfin dans la fonction main on charge le mesh du coeur, sans oublier de rajouter les deux nouveau paramètres dans le fichier entête principal

...

module1->position_cam.x = 0.0f;
module1->position_cam.y = 0.0f;
module1->position_cam.z = -70.0f;
module1->monde = identite();
module1->rot_cam = 0.0f;
module1->coef_rotation_module = 0.0f;
module1->coef_vitesse_module = 0.0f;
module1->coef_cam = 0.0f;
module1->module_rot = 0.0f;
module1->coord_0.x = 0.0f;
module1->coord_0.y = 0.0f;
module1->coord_0.z = 50.0f;
module1->rayon = 20;
module1->collision = 0;
module1->missile = NULL;
module1->vies = 5;
module1->tcr = 0.0f;


module2->position_cam.x = 0.0f;
module2->position_cam.y = 0.0f;
module2->position_cam.z = -70.0f;
module2->monde = identite();
module2->rot_cam = 0.0f;
module2->coef_rotation_module = 0.0f;
module2->coef_vitesse_module = 0.0f;
module2->coef_cam = 0.0f;
module2->module_rot = 0.0f;
module2->coord_0.x = 0.0f;
module2->coord_0.y = 0.0f;
module2->coord_0.z = -50.0f;
module2->rayon = 20;
module2->collision = 0;
module2->missile = NULL;
module2->vies = 5;
module2->tcr = 0.0f;


D3DVECTOR b = {0.0f, -.707f, .707f};

vue(module1, b, &obj_Direct3DDevice);
vue(module2, b, &obj_Direct3DDevice2);

// création des différents mesh

char chemin[
5][10] = {"module.x", "module2.x", "laby.x", "missile.x", "coeur.x"};

unsigned int i, k = 0;

for(i = 0; i<10; i+=2) {
mtm[i] = charge_mesh(chemin[k], &obj_Direct3DDevice);
if(mtm[i]==NULL)
return -1;

mtm[i+1] = charge_mesh(chemin[k], &obj_Direct3DDevice2);
if(mtm[i+1]==NULL)
return -1;
k++;
}


ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);

MSG msg;
ZeroMemory( &msg, sizeof(msg) );

while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else {
Rendu(
hCtrl_2, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, &obj_Direct3DDevice, module1, module2, mtm[0], mtm[4], mtm[6], mtm[2], mtm[8], &et_module);
Rendu(
hCtrl_1, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, &obj_Direct3DDevice2, module2, module1, mtm[3], mtm[5], mtm[7], mtm[1], mtm[9], &et_module2);
}
}

UnregisterClass("Superbattle", wc.hInstance);
return 0;
}

Et dans le fichier entête principal on :

#include <d3d9.h>

#define _PI 3.141592654
#define _2PI 6.283185307
#define _1_2EMI_PI 1.570796327
#define _3_2EMI_PI 4.71238898

#define LONG_FENETRE 300
#define LARG_FENETRE 300

typedef struct _missile_ *Missile;

typedef struct _missile_ {
D3DVECTOR coord;
float t_rot;
Missile suivant, precedent;
} Miss;

typedef struct {
D3DMATRIX view_matr;
D3DVECTOR position_cam; 
D3DMATRIX monde;
float rot_cam, coef_rotation_module, coef_vitesse_module, coef_cam, module_rot;
D3DVECTOR coord_0;
Missile missile;
float rayon
, tcr;
unsigned char collision;
float vies;
} _module_;

struct clavier {
unsigned char gauche;
unsigned char droite;
unsigned char haut;
unsigned char bas;
unsigned char feu;
};

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