Programmation graphique...

yafuka Messages postés 236 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 18 juillet 2006 - 10 avril 2003 à 17:03
douggyfresh Messages postés 21 Date d'inscription lundi 24 mai 2004 Statut Membre Dernière intervention 25 mai 2005 - 17 juin 2004 à 23:14
Yafuka ( * _ * ) 8-)

salut je fais mes premiers pas en programmation graphique. je suis actuellement un tutorial et je n arrive pas a compiler la source. quelqu'un pourrait m'aider ou me conseiller sur un site ou meme le compilateur a utiliser ?

le code est ci dessous..

//////////////////////////// debut du code //////////////////

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <mem.h>

#define MAX_ETOILES 500

char far *vga = (char far *) MK_FP(0xA000, 0); // pointeur sur memoire video

typedef unsigned char byte; // char non signe 0-255

typedef struct type_etoile // pour contenir les infos sur chaque etoiles
{
int x,y,z;
};

/****************************************************************************/
/* SetVGA - Appelle le mode 320x200x256 13h du BIOS */
/****************************************************************************/
void SetVGA()
{
_AX = 0x0013;
geninterrupt (0x10);
}

/****************************************************************************/
/* Putpixel - Affiche un pixel directement dans la memoire */
/****************************************************************************/
void Putpixel (int x, int y, byte col)
{
memset(vga+x+(y*320),col,1);
}

/****************************************************************************/
/* SetText - Appelle le mode texte 03h du BIOS */
/****************************************************************************/
void SetText()
{
_AX = 0x0003;
geninterrupt (0x10);
}

/****************************************************************************/
/* Cls - Vide l'ecran avec la couleur col */
/****************************************************************************/
void Cls(unsigned char col)
{
memset(vga,col,0xffff);
}

/*************************** PROGRAMME PRINCIPAL ****************************/

main()
{

// Rappel mathematique: % = modulo, le reste de la division entiere
// x mod y donne toujours entre 0 et y ex: x % 15 donne toujours
// un nombre entre 0 et 15. Bon moyen pour ramener des valeurs dans
// un cadre defini. On s'en sert en adressage disperse.

int et;
byte col;
type_etoile etoiles[MAX_ETOILES]; // Tableau d'etoiles du type etoiles
// definie plus haut
SetText();
printf("*** CHAPITRE 1 - Mode video VGA et Putpixel ***\n\n\n");
printf("Ce programme illustre les differentes notions vues\n");
printf("dans le premier chapitre. Le programme cree un champs\n");
printf("d'etoiles defilantes, ou un starfield en anglais. Pour\n");
printf("debuter, appuyer sur une touche...");
getch();

SetVGA();
randomize(); // Generateur de nombres aleatoires
for (int i=0;i<=MAX_ETOILES;i++) // Initialise la structure a 0
{
etoiles[i].x = 0;
etoiles[i].y = 0;
etoiles[i].z = 0;
}

do // boucle
{
delay(20); // Modifier la valeur de delay pour modifier la vitesse
for (et=0;et<MAX_ETOILES;et++) // Pour chaque etoiles
{
Putpixel(etoiles[et].x,etoiles[et].y,0); //efface ancienne position
etoiles[et].x = etoiles[et].x - (etoiles[et].z % 15 + 1); // la vitesse de deplacement en fonction du z
if (etoiles[et].x <= 0) // si l'etoile est a gauche...
{
etoiles[et].x = 319; // on la remet a droite,
etoiles[et].y = random(200); // a une nouvelle hauteur,
etoiles[et].z = random (256); // sur un nouveau z.
}
col = etoiles[et].z % 15 + 17; // couleurs 17-32 sont des tons de gris
Putpixel(etoiles[et].x,etoiles[et].y,col); // affiche nouvelle position
}
} while (!kbhit()); // tant qu'une touche n'est pas enfoncer

SetText();
printf("*** CHAPITRE 1 - Mode video VGA et Putpixel ***\n\n\n");
printf("Le principe de ce programme est que chaque etoile est derementee\n");
printf("en fonction de son z, ce qui donne un effet de profondeur a l'effet.\n");
printf("Un tableau de type etoile comprenant sa coordonee X, Y ainsi que son z\n");
printf(", sa 'profondeur', contient les informations de chaque etoiles.\n");
printf("Pour chaque etoile, on verifie qu'elle n'est pas encore rendue a gauche.\n");
printf("Si c'est le cas, elle retourne a droite, sinon, sa positions est mise a jour.\n");
printf("Le programme profite du fait que les couleurs 17-32 sont des degrader de tons\n");
printf("gris. Plus d'informations sont disponibles dans le code source. Pour questions\n");
printf("et commentaires:\n\nShaun Dore * Krashlog * dores@videotron.ca");
getch();
getch();

return 0;
}

4 réponses

cs_djuddju Messages postés 9 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 22 avril 2003
10 avril 2003 à 17:13
Salut,
est ce que tu développes en visual C++ ?

Kevina
0
yafuka Messages postés 236 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 18 juillet 2006 1
10 avril 2003 à 17:15
oui Kevina.. j ai visual c++ c++builder et devc++..
0
cs_djuddju Messages postés 9 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 22 avril 2003
10 avril 2003 à 21:48
Ben si tu developpes sous visual C++, je te conseil d'utiliser les applications AppWizard(exe). Tu verras, on trouves facilement des renseignements sur le net la dessus.

Kevina
0
douggyfresh Messages postés 21 Date d'inscription lundi 24 mai 2004 Statut Membre Dernière intervention 25 mai 2005
17 juin 2004 à 23:14
De Lefuy James Douglass (Haiti)
Me voici, je viens a votre rescousse.

J'ai rencontré ce problème lors de ma premiere connaissance avec le graphisme en c.
Il existe 3 facons de rémédier à ce problèmes:

Uno:
Si vous programmez avec Turbo C++ 3.0, vous pouvez déclarez un pointeur far vers l'addresse mémoire de l'écran comme suit :

unsigned char far *ecran=(unsigned char far *) (0xA0000000L);
//j'ai inclu unsigned char car les indices de couleurs vont de
//0 à 255
//avec char on a -128-0-128
//avec unsigned char : 0-255 qui convient mieux aux couleurs
//pour raccourcir unsigned char, creer un type
//avec typedef avec le nom dont vous voulez
//ex: typedef unsigned char byte
//donc on aura qu'a declarer d'une nouvelle facon le pointeur
//ex: byte far *ecran=(byte far *)(0xA0000000L);

Segundo : en utilisant le macro
// void far MK_FP(unsigned segment, unsigned decalage)
//qui est inclu dans dos.h

//la declaration :

unsigned char far *ecran=(unsigned char *)MK_FP(0xA000,0);

Tercero:
//en utilisant la fonction
//void pokeb(unsigned segm,unsigned offset,char valeur)
//pour initialiser l'adresse memoire de l'ecran

//Ex:

void setpixel(unsigned X,unsigned Y, unsigned char coul)
{
pokeb(0xA000,320*y+x,coul);
}

//Cette fonction placera un pixel suivant x et y

Je suis en premiere annee d'etude informatique en Haiti. Et j'aime tout ce qui est technologique et informatique(programmation , electronique)
Pour tout commentaire ou question, veuillez me contacter à l'adresse suivante :
douggynix@yahoo.fr

//j'espere que vous avez compris mes conseils et qu'il vous aide a surmonter vos peurs pour le graphisme. Jettez un mail dans ma boite
0
Rejoignez-nous