Essai pour developper un jeu d' avion

Soyez le premier à donner votre avis sur cette source.

Snippet vu 17 563 fois - Téléchargée 32 fois

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

Ajouter un commentaire Commentaires
Messages postés
231
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
22 avril 2007

Ca en est ou ton jeu mec ? Je veux des nouvelles moi !!!!

++
Messages postés
231
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
22 avril 2007

De plus, c'est une librairie DOS donc sous win, c pas possible qu'elle fonctionne !
Messages postés
231
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
22 avril 2007

Hum, ça peut pas fonctionner car il faut la librairie graphique Graphic.h de Turbo C 3.0. Sur Borland 5.0, je ne suis pas sur k'il y est cette librairie, renseigne toi, si elle est présente, je te dirai comment faire pour que le compilo la reconnaisse !

++

Eldered
Messages postés
59
Date d'inscription
samedi 18 janvier 2003
Statut
Membre
Dernière intervention
30 octobre 2006

Allo est ce que quelqu'un peut m'aider je roule sur xp prof et mon borland 5.0 ne veut pas compiler ce prog voici l'erreur que je eu avec
GRAPHICS.H (20,52) ERROR DIRECTIVE :BGI GRAPHICS NOT SUPPORTED UNDER WINDOWS an bon français sa vouloir dire que windows xp ne supporte pas ce graphique en tout ca j'attends de l'aide la dessus merci
Messages postés
231
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
22 avril 2007

hum, je vois, en fait, il faut que tu effectue les deux déplacements en même temps. Je m'explique, si j'amais tu insere un délay dans la fonction qui fait bouger ta balle, le programme va en être ralenti, et ce dans sa globalité. Deux solution se presente alors a toi.

La premiere est l'utilisation de "thread" qui en fait simule 2 processus {caractéristique du bi-processuring} en un seul {deux thread pour un processus pour les mono processeur}. En gros, les fonctions 'avions et balle', vont s'effectuer en meme temps, sans aucune intereactivité entre elle au niveau du timer. Ms c'est trés difficille a mettre en place ...

La deuxieme, celle que je te conseille et de faire bouger la balle de plusieurs pixels {valeur constante} en meme temps pour simulé une avancée, et ce pour chacun des déplacmeents.

Voila, c ske je suis en train de faire pour un casse brique {Bientot sur ce site d'ailleurs ;)} et ça lmarche trés bien !

Ps: Si ton programme plante qd tu deplace, c parceu'il n'est pas adapté a ce systeme, cetres, si tu déplace ta balle de 5 pixels a chaque fois , il est possible que la balle ne heurte pas une ligne de collision precise que tu as défini, comme un enemi par exemple, car elle se retrouve directement dans l'ennemi sans passer par la "frontiere" !!! Il faut donc que tu fasses une fonction generique, genre, si la balle est entre une ligne a {point tete de l'enemi} et un ligne b {cul de l'ennemi}, effectuer action. Tu comprends ?

J'espere que j'ai bien cerné ton probléme et que j'ai pu t'aider!!!

++ et bc!

Eldered
Afficher les 6 commentaires

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.