Make your own free website on Tripod.com

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 :