Commentçamarche.net
CodeS-SourceS
Rechercher un code, un tuto, une réponse

Jeux démo d'avion avec directx (directdraw 2d)

0/5 (18 avis)

Vue 41 729 fois - Téléchargée 798 fois

Description

Ce programme permet d'approfondir vos connaissances sur

DirectX (DirectDraw 2D) avec un petit jeux sympa.

logiciel : Borland C++ Bulder V4

Source / Exemple :


#include <vcl.h>
#include <ddraw.h>
#include <mmsystem.h>

#include "Main.h"
#include "ddutil.h"
#include "Unit2.h"

#pragma hdrstop
#pragma resource "*.dfm"

TForm1 *Form1;
char szBackground[] = "C6401000";   //  BMP
      int ty=0;
int x=100;  int y=300;       // cordoné de l'avion
int times = 0;               // times du reacteur de l'avion
int arme=1; int NbrArme=1;   // arme désactivé
int AvionTouche=0;
AnsiString s; int ligne=0;  int colone=1;  // cordoné du decor
              int k=0;      int tmp=0;

int level=0;

int etoile0=0;  // etoile lente
int etoile1=0;  // etoile rapide

   //////////////////////////////////////////////////////

 int avion=0;               // Avion enemi
 int ViteseAvonEnemi=0;     // Vitese Avon Enemi
 int tempnb1=0;             // type avion 1
 int tempnb2=0;             // type avion 2
 int tempnb3=0;             // type avion 3
 int tempnb4=0;             // type avion 4
 int AvionTouchenb1=0;      // Avion Touché nb1
 int AvionTouchenb2=0;      // Avion Touché nb2
 int AvionTouchenb3=0;      // Avion Touché nb3
 int AvionTouchenb4=0;      // Avion Touché nb4
   int   NbrLigne=0;
   AnsiString lpo;       int sui=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)  : TForm(Owner)
{
    Timer1->Enabled = false;
    Form2 = new TForm2(Application);
    Form2->ShowModal();
    Start();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Start()
{

 HRESULT res = DirectDrawCreate(NULL, &pDD, NULL);
 pDD->SetCooperativeLevel(Handle,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);

 ddsd.dwSize = sizeof(ddsd);
 ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;

 ddsd.dwBackBufferCount = 1;
 pDD->SetDisplayMode(640,480, 16);
 pDD->CreateSurface(&ddsd, &pDDSPrim, NULL);

 ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
 pDDSPrim->GetAttachedSurface(&ddscaps, &pDDSSec);

 pDDPal = DDLoadPalette(pDD, szBackground);

 pDDSImage = DDLoadBitmap(pDD, szBackground, 0, 0);
 DDSetColorKey(pDDSImage,RGB(0,0,0));  // Couleur de transparence

  pDDSPrim->Flip( NULL, 0 );

  MediaPlayer1->Play();

 Timer1->Enabled = true;

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
            int   max=56;
               ///////// level ////////////
 if ((k>=(max*43)) && (level==0)) {k=0;level=1;}
 if ((k>=(max*43)) && (level==1)) {k=0;level=2;}
 if ((k>=(max*43)) && (level==2)) {k=0;level=3;}
 if ((k>=(max*43)) && (level==3)) {k=0;level=4;}
 if ((k>=(max*43)) && (level==4)) {Close();}

 if ((k==0) && (level==0)) {Memo1->Lines->LoadFromFile("Level0.txt");
                            Memo2->Lines->LoadFromFile("Avion.txt");}
 if ((k==0) && (level==1)) {Memo1->Lines->LoadFromFile("Level1.txt");
                            Memo2->Lines->LoadFromFile("Avion.txt"); }
 if ((k==0) && (level==2)) {Memo1->Lines->LoadFromFile("Level2.txt");
                            Memo2->Lines->LoadFromFile("Avion.txt"); }
 if ((k==0) && (level==3)) {Memo1->Lines->LoadFromFile("Level3.txt");
                            Memo2->Lines->LoadFromFile("Avion.txt"); }
 if ((k==0) && (level==4)) {Memo1->Lines->LoadFromFile("Level4.txt");
                            Memo2->Lines->LoadFromFile("Avion.txt"); }

              ///////////////////////////////
   k=k+tmp+12;

 ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
 pDDSPrim->GetAttachedSurface(&ddscaps, &pDDSSec);
 rc.left=0;   rc.top=0;   rc.right=640; rc.bottom=480;
 pDDSSec->BltFast(0,0,pDDSImage,&rc,DDBLTFAST_NOCOLORKEY);

            ////////////// etoiles ///////////
 rc.left=1;   rc.top=955;   rc.right=298; rc.bottom=997;
 for (int t=0; t<8; t++) {
 pDDSSec->BltFast(0,  43+43*2*t+etoile0-300,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);
 pDDSSec->BltFast(100,43*2*t+etoile0-300,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);}
 etoile0++;   if (etoile0>=300) {etoile0=43;}
 for (int t=0; t<8; t++) {
 pDDSSec->BltFast(20 ,43+43*2*t+etoile1-300,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);
 pDDSSec->BltFast(120,43*2*t+etoile1-300,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);}
 etoile1=etoile1+5;   if (etoile1>=300) {etoile1=43;}

                //////////////////////////////

for (ligne=0;  ligne<max;  ligne++) {
for (colone=1; colone<11; colone++) {
 s = Memo1->Lines->Strings[ligne];
 char c = s[colone];

                      //////// détect les obstacles
if ((c != char ('0')) &&
   ((y-35 <=  ligne*42+k-(max*42)) && (y+18 >=  ligne*42+k-(max*42)) ) &&
   ((x-25 <= colone*42-42)         && (x+25 >= colone*42-42)))

  {char const *Path = "Alert.wav";  avion=1;
   sndPlaySound(Path, SND_ASYNC | SND_FILENAME);    }

if (c == char ('0')) {rc.left=1+43*4;  rc.top=482     ; rc.right=43*4;      rc.bottom=524;     }
if (c == char ('1')) {rc.left=1+43*10; rc.top=482     ; rc.right=43+43*10;  rc.bottom=524;     }
if (c == char ('2')) {rc.left=1+43*11; rc.top=482     ; rc.right=43+43*11;  rc.bottom=524;     }
if (c == char ('3')) {rc.left=1+43*12; rc.top=482     ; rc.right=43+43*12;  rc.bottom=524;     }
if (c == char ('4')) {rc.left=1+43*13; rc.top=482     ; rc.right=43+43*13;  rc.bottom=524;     }
if (c == char ('5')) {rc.left=1+43*10; rc.top=482+43*1; rc.right=43+43*10;  rc.bottom=524+43*1;}
if (c == char ('6')) {rc.left=1+43*11; rc.top=482+43*1; rc.right=43+43*11;  rc.bottom=524+43*1;}
if (c == char ('7')) {rc.left=1+43*12; rc.top=482+43*1; rc.right=43+43*12;  rc.bottom=524+43*1;}
if (c == char ('8')) {rc.left=1+43*13; rc.top=482+43*1; rc.right=43+43*13;  rc.bottom=524+43*1;}
if (c == char ('9')) {rc.left=1+43*10; rc.top=482+43*2; rc.right=43+43*10;  rc.bottom=524+43*2;}
if (c == char ('A')) {rc.left=1+43*11; rc.top=482+43*2; rc.right=43+43*11;  rc.bottom=524+43*2;}
if (c == char ('B')) {rc.left=1+43*12; rc.top=482+43*2; rc.right=43+43*12;  rc.bottom=524+43*2;}
if (c == char ('C')) {rc.left=1+43*13; rc.top=482+43*2; rc.right=43+43*13;  rc.bottom=524+43*2;}
if (c == char ('D')) {rc.left=1+43*9;  rc.top=482+43*0; rc.right=43+43*9;   rc.bottom=524+43*0;}
if (c == char ('E')) {rc.left=1+43*9;  rc.top=482+43*1; rc.right=43+43*9;   rc.bottom=524+43*1;}
if (c == char ('F')) {rc.left=1+43*9;  rc.top=482+43*2; rc.right=43+43*9;   rc.bottom=524+43*2;}
if (c == char ('G')) {rc.left=1+43*9;  rc.top=482+43*3; rc.right=43+43*9;   rc.bottom=524+43*3;}
if (c == char ('H')) {rc.left=1+43*10; rc.top=482+43*3; rc.right=43+43*10;  rc.bottom=524+43*3;}
if (c == char ('I')) {rc.left=1+43*11; rc.top=482+43*3; rc.right=43+43*11;  rc.bottom=524+43*3;}
if (c == char ('J')) {rc.left=1+43*9;  rc.top=482+43*4; rc.right=43+43*9;   rc.bottom=524+43*4;}
if (c == char ('K')) {rc.left=1+43*10; rc.top=482+43*4; rc.right=43+43*10;  rc.bottom=524+43*4;}
if (c == char ('L')) {rc.left=1+43*12; rc.top=482+43*3; rc.right=43+43*12;  rc.bottom=524+43*3;}
if (c == char ('M')) {rc.left=1+43*12; rc.top=482+43*4; rc.right=43+43*12;  rc.bottom=524+43*4;}
if (c == char ('N')) {rc.left=1+43*9;  rc.top=482+43*5; rc.right=43+43*9;   rc.bottom=524+43*5;}
if (c == char ('O')) {rc.left=1+43*10; rc.top=482+43*5; rc.right=43+43*10;  rc.bottom=524+43*5;}
pDDSSec->BltFast(colone*42-42,ligne*42+k-(max*42),pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);

                 ///////////// avion touché /////////////////////////
}
}

 times++;
if (avion==0) {rc.left=1; rc.top=482; rc.right=43; rc.bottom=524;
               pDDSSec->BltFast(x,y,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);}
if (avion==1) {rc.left=1+43; rc.top=482; rc.right=43+43; rc.bottom=524;
               pDDSSec->BltFast(x,y,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);
               AvionTouche++;}

      if   (54+AvionTouche==231) {AvionTouche=0;}              // GameOver
      rc.left=457; rc.top=53; rc.right=474; rc.bottom=57;
      for (int gg=53; gg<=53+AvionTouche; gg++){
      pDDSSec->BltFast(457,gg,pDDSImage,&rc,DDBLTFAST_NOCOLORKEY);}

                   //////// reacteur de l'avion
 if (times >= 0) {
rc.left=1+43*2; rc.top=482; rc.right=43*3; rc.bottom=524;
pDDSSec->BltFast(x,y+43,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);
}

if (times >= 5) {
rc.left=1+43*3; rc.top=482; rc.right=43*4; rc.bottom=524;
pDDSSec->BltFast(x,y+43,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);
}

if (times >= 10) {  times=0;
rc.left=1+43*2; rc.top=482; rc.right=43*3; rc.bottom=524;
pDDSSec->BltFast(x,y+43,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);
avion=0;}        /////////////////// arme /////////////////

if (arme==0) {
              rc.left=1+43*4; rc.top=482; rc.right=43*5; rc.bottom=524;
              pDDSSec->BltFast(x,y-(43*NbrArme),pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);
              NbrArme++;
              if (NbrArme == 2) {char const *Path = "laser.wav";
                                 sndPlaySound(Path, SND_ASYNC | SND_FILENAME);}
              if (NbrArme == 9) {arme=1; NbrArme=1;}
             }
                            ///////////////////////////////

                               // Avion enemi

for (int NbrLigne=0+sui; NbrLigne<=3+sui;NbrLigne++) {

     lpo = Memo2->Lines->Strings[NbrLigne];   //ligne
     Memo3->Lines->Clear();
     Memo3->Lines->Add(lpo);

 if ( ty == 8*15) {ty=0; }                // end

 AnsiString e1 (Memo3->Text.c_str()),e2;  // Nb graph
 AnsiString e3 (Memo3->Text.c_str()),e4;  // xn
 AnsiString e5 (Memo3->Text.c_str()),e6;  // yn

 e2 = e1.SubString(1,1);        int nb = e2.ToInt();
 e4 = e3.SubString(3+ty,3);     int xn = e4.ToInt();
 e6 = e5.SubString(7+ty,3);     int yn = e6.ToInt();

          ViteseAvonEnemi++;

 if ((NbrLigne == 0+sui) && (ViteseAvonEnemi>=10)) {ty=ty+8; ViteseAvonEnemi=0;}

if ((nb==1) && (AvionTouchenb1==0)) {tempnb1++;
     if (tempnb1 >= 0){rc.left=1;      rc.top=482+43*2; rc.right=43;      rc.bottom=524+43*2;}
     if (tempnb1 >= 3){rc.left=1+43*1; rc.top=482+43*2; rc.right=43+43*1; rc.bottom=524+43*2;}
     if (tempnb1 >= 6){rc.left=1+43*2; rc.top=482+43*2; rc.right=43+43*2; rc.bottom=524+43*2;}
     if (tempnb1 >= 9){rc.left=1;      rc.top=482+43*2; rc.right=43;      rc.bottom=524+43*2;
     tempnb1=0;}
     pDDSSec->BltFast(xn,yn,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);    }

if ((nb==2) && (AvionTouchenb2==0)) {tempnb2++;
     if (tempnb2 >= 0) {rc.left=1;      rc.top=482+43*1; rc.right=43;      rc.bottom=524+43*1;}
     if (tempnb2 >= 3) {rc.left=1+43*1; rc.top=482+43*1; rc.right=43+43*1; rc.bottom=524+43*1;}
     if (tempnb2 >= 6) {rc.left=1+43*2; rc.top=482+43*1; rc.right=43+43*2; rc.bottom=524+43*1;}
     if (tempnb2 >= 9) {rc.left=1+43*3; rc.top=482+43*1; rc.right=43+43*3; rc.bottom=524+43*1;}
     if (tempnb2 >= 12){rc.left=1;      rc.top=482+43*1; rc.right=43;      rc.bottom=524+43*1;
     tempnb2=0;}
     pDDSSec->BltFast(xn,yn,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);    }

if ((nb==3) && (AvionTouchenb3==0)) {tempnb3++;
    if (tempnb3 >= 0) {rc.left=1;      rc.top=482+43*3; rc.right=43;      rc.bottom=524+43*3;}
    if (tempnb3 >= 4) {rc.left=1+43*1; rc.top=482+43*3; rc.right=43+43*1; rc.bottom=524+43*3;}
    if (tempnb3 >= 16){rc.left=1;      rc.top=482+43*3; rc.right=43;      rc.bottom=524+43*3;
    tempnb3=0;}
    pDDSSec->BltFast(xn,yn,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);    }

if ((nb==4) && (AvionTouchenb4==0)) {tempnb4++;
    if (tempnb4 >= 0) {rc.left=1;      rc.top=482+43*5; rc.right=43;      rc.bottom=524+43*5;}
    if (tempnb4 >= 4) {rc.left=1+43*1; rc.top=482+43*5; rc.right=43+43*1; rc.bottom=524+43*5;}
    if (tempnb4 >= 16){rc.left=1;      rc.top=482+43*5; rc.right=43;      rc.bottom=524+43*5;
    tempnb4=0;}
    pDDSSec->BltFast(xn,yn,pDDSImage,&rc,DDBLTFAST_SRCCOLORKEY);    }

                               // Avion enemi touché
if (((x-20 <= xn) && (x+20 >= xn)) &&  ((y-25 <= yn) && (y+20 >= yn)))
{
if ((NbrLigne==0+sui) && (AvionTouchenb1==0)) {AvionTouchenb1=1;avion=1; SonNbr0();}
if ((NbrLigne==1+sui) && (AvionTouchenb2==0)) {AvionTouchenb2=1;avion=1; SonNbr0();}
if ((NbrLigne==2+sui) && (AvionTouchenb3==0)) {AvionTouchenb3=1;avion=1; SonNbr0();}
if ((NbrLigne==3+sui) && (AvionTouchenb4==0)) {AvionTouchenb4=1;avion=1; SonNbr0();}
}

if (((x-20 <= xn) && (x+20 >= xn)) &&   ((y-(43*NbrArme)-20 <= yn)  && (y-(43*NbrArme)+20 >= yn)))
{
if ((NbrLigne==0+sui) && (AvionTouchenb1==0)) {AvionTouchenb1=1; SonNbr0();}
if ((NbrLigne==1+sui) && (AvionTouchenb2==0)) {AvionTouchenb2=1; SonNbr0();}
if ((NbrLigne==2+sui) && (AvionTouchenb3==0)) {AvionTouchenb3=1; SonNbr0();}
if ((NbrLigne==3+sui) && (AvionTouchenb4==0)) {AvionTouchenb4=1; SonNbr0();}
}

}

if ((sui==0)&&(AvionTouchenb1==1) && (AvionTouchenb2==1) && (AvionTouchenb3==1) && (AvionTouchenb4==1))
{     AvionTouchenb1=0;   AvionTouchenb2=0;  AvionTouchenb3=0;  AvionTouchenb4=0;
      sui=5; }

 pDDSPrim->Flip( NULL, 0 );

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
 if (char(Key) == VK_RIGHT)  { x=x+5; }
 if (char(Key) == VK_LEFT)   { x=x-5; }
 if (char(Key) == VK_DOWN)   { y=y+5; }
 if (char(Key) == VK_UP)     { y=y-5; }
 if (char(Key) == ' ')       { arme=0; }

     //       if (char(Key) == '+')  { tmp=tmp+1; }   // vitesse
     //       if (char(Key) == '-')  { tmp=tmp-1; }

 if (x>=380) {x=380;}
 if (x<=0)   {x=0;}
 if (y>=420) {y=420;}
 if (y<=0)   {y=0;}

if (char(Key)==(27))  { Close();  }    // Echap
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SonNbr0()
{
          char const *Path = "Protoss Exclamation.wav";
          sndPlaySound(Path, SND_ASYNC | SND_FILENAME);
}
//---------------------------------------------------------------------------

Conclusion :


Mon soft sera mis à jours , selon les modifications reçu.

pas de bugs connus sur mon PC.

(je cherche des programmes source pour DirectSound 3D, et DirectDraw 3D ( pas openGL, c Nul ) avec DirectX.)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.