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 coordonnes
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 entre la boule s' initialise au prochain tour a partir de kbhit
break;
}
}while (hit!=27);
free(mem); // libere le tampon
closegraph();
}
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.