Essai pour developper un jeu d' avion

Contenu du snippet

Mon code ne va pas paraitre certainement tres clair, mais si certains comprennent le probleme auquel je vais faire reference, une aide serait la bienvenue.

En effet je voudrais afficher une boule qui parte dans une trajectoire donnée avec malloc...
mais mon probleme est que si j' institue un delay entre les 2 putimages , la vitesse du vaisseau en est affecté aussi.
En faite je pe pas adopter une meilleure solution parce que si je deplace le 2 eme putimage et le met plus loin entre le moment ou l'avion est affiché et effacé, j' ai mon programme qui plante lamentablement.

Voila.

Source / Exemple :


#include <graphics.h>
#include <iostream.h>
#include <time.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>

#define ecart 5

void graphinit()
{
int gdriver = DETECT, gmode, errorcode;

/* initialize graphics mode */
initgraph(&gdriver, &gmode, "");

/* read result of initialization */
errorcode = graphresult();

if (errorcode != grOk)  /* an error occurred */
{
   printf("Graphics error: %s\n", grapherrormsg(errorcode));
   printf("Press any key to halt:");
   getch();
   exit(1);		/* return with error code */
}

}

void tirs (int cum[],unsigned int size,void *mem,int inc,int k)
{
	setcolor(BLUE);
	circle(200 + cum[1],425,2);
       //	 circle(260,425 + cum[1],2);

	size=imagesize(195 + cum[1],420,205 + cum[1],430);

	mem=malloc(size);// alloue un espace memoire pour stocker la boule a la position voulue
	getimage(195 + cum[1] ,420 ,205 + cum[1],430 ,mem);
	putimage(195 + cum[1],420 ,mem,XOR_PUT);// pour effacer la boule a la position courante.

	 putimage(195 + cum[1] - k ,420 - ecart - inc ,mem,XOR_PUT);  // affiche
         if (inc>getmaxy()) // on refait partir la boule a l endroit ou on la lancer si on depasse le max des y
         inc=0;

      // delay(10);  // si on applique le delay pb de compatibiliter avec le vaisseau

         putimage(195 + cum[1] - k,420 - ecart - inc ,mem,XOR_PUT);   // efface

}

void effacevaisseau(int x,int y,int *poly)// efface
{
      setcolor(BLACK);
      drawpoly(5,poly);
      line(200 + x,450 + y,200 + x,425 + y);
      line(260 + x,450 + y,260 + x,425 + y);

}

void affichevaisseau(int x,int y,int *poly)  //affiche
{
    setcolor(WHITE);

    drawpoly(5,poly);
    line(200 + x,450 + y,200 + x,425 + y);
    line(260 + x,450 + y,260 + x,425 + y);
    delay(10);
}

void main (void)
{

  void *mem;
int cum[1]={0};// cumul des x suivant une direction , pour l' instant juste … droite

 int k=0;

int poly[13];// initialise 6 points pour dessiner un avion, un peu moche d' ailleurs
unsigned int size;

int hit=0;
int maxx;
int maxy ;
char dir;
char dir2;
int x=0;
int y=0;
int inc=0;
//drawpoly

graphinit();

maxx = getmaxx();
maxy = getmaxy();

 do
  {

      while (kbhit()==0)
      {
			 // calcule des nouvelles coordonn‚es … chaque fois que l on se deplace dans une direction

	 poly[0]=200 + x;
	 poly[1]=450 + y;
	 poly[2]=230 + x;
	 poly[3]=400 + y;
	 poly[4]=260 + x;
	 poly[5]=450 + y;
	 poly[6]=230 + x;
	 poly[7]=420 + y;
	 poly[8]=200 + x;
	 poly[9]=450 + y;

     if (dir2==1)
     {

      tirs(cum,size,mem,inc,k);
      inc=inc + ecart; // incremente la variable inc pour faire avancer la boule sur y

     }

      affichevaisseau(x,y,poly);  // affiche mon vaisseau

      switch(dir)
      {
      case 'A':

      effacevaisseau(x,y,poly);
      x++;
      cum[1]=x;
      if (dir2==1)
      {
      k+=1; // on cumul k pour que lorsque le tir a ‚t‚ enclench‚ , l' axe des x reste inchang‚, sinon la boule par de travers
      }

      break;

      case 'B':
      effacevaisseau(x,y,poly);
      y--;

      break;

      case 'C':
      effacevaisseau(x,y,poly);
      x--;
      break;

      case 'D':
      effacevaisseau(x,y,poly);
      y++;
      break;

      }

   }
      hit=getch();

      switch(hit)// suivant la touche appuyer on change de direction d' ou dir qui prend une valeur
      {
      case 54:
      dir='A';
      break;

      case 56:
      dir='B';
      break;

      case 52:
      dir='C';
      break;

      case 53:
      dir='D';
      break;

      case 13:
      dir2=1;   // si on appuie sur entr‚e la boule s' initialise au prochain tour a partir de kbhit
      break;
      }

  }while (hit!=27);

  free(mem); // libere le tampon
  closegraph();
}

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.