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
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 :