begin process at 2012 05 27 18:34:53
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > MARCHEZ LEMMINGS MARCHEZ... [BORLAND C++]

MARCHEZ LEMMINGS MARCHEZ... [BORLAND C++]


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Niveau :Initié Date de création :11/04/2003 Date de mise à jour :03/05/2003 17:12:52 Vu / téléchargé :3 801 / 168

Auteur : Draven

Ecrire un message privé
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Ce prog laisse marcher 3 lemmings de droite a gauche et de gauche a droite, jusqu'a l appuie d'une touche. Ce prog est ecrit en c++ et testé sous borland c++ 5.02 . L'affichage se fait en 320*200 avec 256 couleurs. ce source permet de voir comment se fait la programmation graphique sous borland. biensur ici il n'y a qu'une petite possibilité de se que l'on peut faire.

Source

  • #include <iostream.h>
  • #include <stdio.h>
  • #include <bios.h>
  • #include <dos.h>
  • #include <mem.h>
  • #include <conio.h>
  • #include <stdlib.h>
  • #include <math.h>
  • #include "moteur.h" /* inclut dans le fichier zip */
  • /*******************************************************************************
  • Methodes de la classe moteur2D
  • *******************************************************************************/
  • void moteur2D::mode_vga()
  • {
  • _AX=0x13; /* l'interruption 13h signifie que l'on veut se mettre en 320*200 256 c */
  • geninterrupt(0x10); /* on lance l'interruption, 10 est la requete de l'interuption de la carte video*/
  • };
  • void moteur2D::texte()
  • {
  • /* idem que pour mode_vga */
  • _AX=0x03;
  • geninterrupt(0x10);
  • };
  • void moteur2D::palette()
  • {
  • /* creatiuon de la palette des couleurs (bientot modifier) */
  • int i;
  • for(i=0;i<63;i++)
  • table_palette(i,i,0,0);
  • for(i=64;i<127;i++)
  • table_palette(i,0,i,0);
  • for(i=128;i<191;i++)
  • table_palette(i,0,0,i);
  • for(i=192;i<255;i++)
  • table_palette(i,i,i,i);
  • };
  • void moteur2D::table_palette(unsigned char index, unsigned char rouge, unsigned char vert, unsigned char bleu)
  • {
  • outportb(0x03c8,index);
  • outportb(0x03c9,rouge);
  • outportb(0x03c9,vert);
  • outportb(0x03c9,bleu);
  • };
  • void moteur2D::couleur_fond(unsigned char couleur)
  • {
  • /* initialiser tous les pixels de l'ecran avec une couleur*/
  • int x,y;
  • for(x=0;x<320;x++)
  • for(y=0;y<200;y++)
  • virtuel[320*y+x]=couleur;
  • };
  • void moteur2D::droite(int x,int y,unsigned char coul)
  • {
  • /* dessiner une droite */
  • int i;
  • /* on commence de la gauche de l'ecran jusqu'a x, avec x<=320*/
  • for(i=0;i<x;i++)
  • virtuel[320*y+i]=coul;
  • };
  • void moteur2D::afficher()
  • {
  • /* copier le pointeur "virtuel" sur l'ecran" */
  • memcpy(ecran,virtuel,64000);
  • };
  • void moteur2D::effacer()
  • {
  • /* initialiser a 0 le pointeur virtuel */
  • memset(virtuel,0,64000);
  • };
  • /*******************************************************************************
  • Fin methode de la classe moteur2D
  • *******************************************************************************/
  • /******************************************************************************
  • Methode de la classe lemmings
  • ******************************************************************************/
  • /* sens =0 gauche-> droite, sens =1 droite-> gauche*/
  • int lemmings::affiche_lemming(int x, int y,int position_lemming[])
  • {
  • /* bon bah permet d'afficher le lem */
  • int i,cpt=0;
  • for(i=0;i<60;i++)
  • {
  • /* sens permet d'afficher le lem soit regardant vers la droite soit en regardant vers la gauche*/
  • if(sens==0)
  • virtuel[320*y+(x++)]=position_lemming[i];
  • else
  • virtuel[320*y+(x--)]=position_lemming[i];
  • cpt++;
  • /* lorsque 'cpt' vaut 6 cela signifie qu'une ligne entiere du lem a ete copier sur l'ecran virtuel, donc il faut passer a la ligne suivante*/
  • if(cpt==6)
  • {
  • cpt=0;
  • y++;
  • if(sens==0)
  • x=x-6;
  • else
  • x=x+6;
  • }
  • }
  • /* 'y' a la valeur de la derniere ligne+1 du dessin du lem */
  • return y;
  • };
  • int lemmings::choix_position_lem(int x, int y,int compteur)
  • {
  • int y_pos;
  • switch(compteur)
  • { /* choisir d'afficher un des mouvement du lem, ici j ai decidé que le lem aurait 4 positions */
  • case 1: y_pos=affiche_lemming(x,y,lemming_position1);
  • break;
  • case 2: y_pos=affiche_lemming(x,y,lemming_position2);
  • break;
  • case 3: y_pos=affiche_lemming(x,y,lemming_position3);
  • break;
  • case 4: y_pos=affiche_lemming(x,y,lemming_position4);
  • break;
  • }
  • return y_pos;
  • };
  • /*******************************************************************************
  • Fin des methodes de la classe lemmings
  • *******************************************************************************/
  • void main()
  • {
  • moteur2D mon_moteur;
  • lemmings mon_lem[NB_MAX_LEM];
  • /* x est un tableau pour permettre l'affichage de plusieurs lemmings*/
  • int i,x[NB_MAX_LEM],y,y_reference,compteur=1;
  • /* 'y' prend la valeur où sera le haut du lem*/
  • y=150;
  • /* 'x' indique où seront placer les différents lems lors du lancement du prog */
  • x[0]=10;
  • x[1]=50;
  • x[2]=30;
  • /* donner un sens par defaut, ici de la gauche vers la droite*/
  • mon_lem[0].sens=0;
  • mon_lem[1].sens=0;
  • mon_lem[2].sens=0;
  • mon_moteur.mode_vga();
  • mon_moteur.palette();
  • /* faire tant que aucune touche ne soit appuyé */
  • while(!kbhit())
  • {
  • mon_moteur.effacer();
  • /* faire autant de fois qu'il y a de lem, si il n'y a qu'un seul lem cette boucle n'est meme pas utile */
  • for(i=0;i<3;i++)
  • {
  • /* 'compteur' permet de selectionner le mouvement du lem situé dans lachoix_position_lem() de la classe lemmings */
  • if(compteur>4)
  • compteur=1;
  • /*'mon_lem[i]' selectionne un lem parmis ceux qu'on veux afficher, 'x[i]' coorespond
  • au placement du lem selectionner, 'compteur' selectionne le mouvement a afficher a l'ecran*/
  • y_reference=mon_lem[i].choix_position_lem(x[i],y,compteur);
  • /*cette condition permet de faire marcher le lem de la gauche vers la droite */
  • if(mon_lem[i].sens==0)
  • {
  • x[i]=x[i]+5;
  • }
  • /*cette condition permet de faire marcher le lem de la droite vers la gauche */
  • else
  • {
  • x[i]=x[i]-5;
  • }
  • /* condition evitant que la variable 'x' ne dépacer les valeurs autorise, autrement dit 0<x>321*/
  • if(x[i]>310)
  • mon_lem[i].sens=1;
  • if(x[i]<5)
  • mon_lem[i].sens=0;
  • }
  • /* tracer de droite sous les pieds des lem de couleurs différentes */
  • mon_moteur.droite(320,y_reference,35);
  • mon_moteur.droite(320,y_reference+1,20);
  • compteur=compteur+1;
  • delay(300); /* tempo */
  • mon_moteur.afficher(); /* afficher "virtuel" a l'ecran */
  • }
  • mon_moteur.texte(); /* se mettre en mode texte */
  • cout<<"A bientot...";
  • free(virtuel); /* liberer l'espace alloue en memoire */
  • }
#include <iostream.h>
#include <stdio.h>
#include <bios.h>
#include <dos.h>
#include <mem.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

#include "moteur.h"  /* inclut dans le fichier zip */


/*******************************************************************************
								Methodes de la classe moteur2D
*******************************************************************************/

void moteur2D::mode_vga()
{
	_AX=0x13; /* l'interruption 13h signifie que l'on veut se mettre en 320*200 256 c */
   geninterrupt(0x10);  /* on lance l'interruption, 10 est la requete de l'interuption de la carte video*/
};

void moteur2D::texte()
{
  /* idem que pour mode_vga */
	_AX=0x03;
   geninterrupt(0x10);
};

void moteur2D::palette()
{
   /* creatiuon de la palette des couleurs (bientot modifier) */
	int i;
   for(i=0;i<63;i++)
   	table_palette(i,i,0,0);
   for(i=64;i<127;i++)
   	table_palette(i,0,i,0);
   for(i=128;i<191;i++)
   	table_palette(i,0,0,i);
   for(i=192;i<255;i++)
   	table_palette(i,i,i,i);
};

void moteur2D::table_palette(unsigned char index, unsigned char rouge, unsigned char vert, unsigned char bleu)
{
	outportb(0x03c8,index);
	outportb(0x03c9,rouge);
	outportb(0x03c9,vert);
	outportb(0x03c9,bleu);
};

void moteur2D::couleur_fond(unsigned char couleur)
{
	/* initialiser tous les pixels de l'ecran avec une couleur*/
	int x,y;
   for(x=0;x<320;x++)
   	for(y=0;y<200;y++)
      	virtuel[320*y+x]=couleur;
};

void moteur2D::droite(int x,int y,unsigned char coul)
{
   /* dessiner une droite */
   int i;
   /* on commence de la gauche de l'ecran jusqu'a x, avec x<=320*/
	for(i=0;i<x;i++)
 		virtuel[320*y+i]=coul;
};
void moteur2D::afficher()
{
	/* copier le pointeur "virtuel" sur l'ecran" */
	memcpy(ecran,virtuel,64000);
};

void moteur2D::effacer()
{
   /* initialiser a 0 le pointeur virtuel */
	memset(virtuel,0,64000);
};
/*******************************************************************************
								Fin methode de la classe moteur2D
*******************************************************************************/

/******************************************************************************
								Methode de la classe lemmings
******************************************************************************/

/* sens =0 gauche-> droite, sens =1 droite-> gauche*/
int lemmings::affiche_lemming(int x, int y,int position_lemming[])
{
   /* bon bah permet d'afficher le lem */
	int i,cpt=0;
 	for(i=0;i<60;i++)
   {
      /* sens permet d'afficher le lem soit regardant vers la droite soit en regardant vers la gauche*/
      if(sens==0)
   		virtuel[320*y+(x++)]=position_lemming[i];
      else
      	virtuel[320*y+(x--)]=position_lemming[i];
      cpt++;
      /* lorsque 'cpt' vaut 6 cela signifie qu'une ligne entiere du lem a ete copier sur l'ecran virtuel, donc il faut passer a la ligne suivante*/
      if(cpt==6)
      {
      	cpt=0;
         y++;
         if(sens==0)
         	x=x-6;
         else
         	x=x+6;
      }
   }
   /* 'y' a la valeur de la derniere ligne+1 du dessin du lem */
   return y;
};


int lemmings::choix_position_lem(int x, int y,int compteur)
{
   int y_pos;
   switch(compteur)
   {      /* choisir d'afficher un des mouvement du lem, ici j ai decidé que le lem aurait 4 positions */
     	case 1: y_pos=affiche_lemming(x,y,lemming_position1);
        		  break;
      case 2: y_pos=affiche_lemming(x,y,lemming_position2);
        		  break;
      case 3: y_pos=affiche_lemming(x,y,lemming_position3);
       		  break;
      case 4: y_pos=affiche_lemming(x,y,lemming_position4);
       		  break;
   }
   return y_pos;
};
/*******************************************************************************
								Fin des methodes de la classe lemmings
*******************************************************************************/


void main()
{
	moteur2D mon_moteur;
   lemmings mon_lem[NB_MAX_LEM];
   /* x est un tableau pour permettre l'affichage de plusieurs lemmings*/
   int i,x[NB_MAX_LEM],y,y_reference,compteur=1;
   /* 'y' prend la valeur où sera le haut du lem*/
   y=150;
   /* 'x' indique où seront placer les différents lems lors du lancement du prog  */
   x[0]=10;
   x[1]=50;
   x[2]=30;
   /* donner un sens par defaut, ici de la gauche vers la droite*/
   mon_lem[0].sens=0;
   mon_lem[1].sens=0;
   mon_lem[2].sens=0;
	mon_moteur.mode_vga();
   mon_moteur.palette();
   /* faire tant que aucune touche ne soit appuyé */
   while(!kbhit())
   {
      mon_moteur.effacer();
      /* faire autant de fois qu'il y a de lem, si il n'y a qu'un seul lem cette boucle n'est meme pas utile */
      for(i=0;i<3;i++)
      {
         /* 'compteur' permet de selectionner le mouvement du lem situé dans lachoix_position_lem() de la classe lemmings */
      	if(compteur>4)
    			compteur=1;
         /*'mon_lem[i]' selectionne un lem parmis ceux qu'on veux afficher, 'x[i]' coorespond
         au placement du lem selectionner, 'compteur' selectionne le mouvement a afficher a l'ecran*/
      	y_reference=mon_lem[i].choix_position_lem(x[i],y,compteur);
         /*cette condition permet de faire marcher le lem de la gauche vers la droite */
      	if(mon_lem[i].sens==0)
      	{
     			x[i]=x[i]+5;
      	}
         /*cette condition permet de faire marcher le lem de la droite vers la gauche */
      	else
      	{
      		x[i]=x[i]-5;
      	}
         /* condition evitant que la variable 'x' ne dépacer les valeurs autorise, autrement dit 0<x>321*/
      	if(x[i]>310)
   			mon_lem[i].sens=1;
      	if(x[i]<5)
   			mon_lem[i].sens=0;
      }
      /* tracer de droite sous les pieds des lem de couleurs différentes */
      mon_moteur.droite(320,y_reference,35);
      mon_moteur.droite(320,y_reference+1,20);
      compteur=compteur+1;
      delay(300);		/* tempo */
      mon_moteur.afficher();  /* afficher "virtuel" a l'ecran */
   }
   mon_moteur.texte();      /* se mettre en mode texte */
   cout<<"A bientot...";
   free(virtuel);  /* liberer l'espace alloue en memoire */
}

 Conclusion

si ca vous interesse on recherche tjs des developpeurs pour le projet commun Lemmings, pour decouvrir bcp plus de fonctions graphiques.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture TESTER VOTRE RAPIDITÉ À CLIQUER [BUILDER]
Source avec Zip APPLIQUER UN FILTRE À UNE IMAGE
CONVERTIR UNE IMAGE 16 MILLIONS DE COULEURS EN NIVEAUX DE GR...
Source avec Zip THREADS SOUS BUILDER
STÉGANOGRAPHIE [BORLAND C++]

 Sources de la même categorie

Source avec Zip Source avec une capture PLANNING D'EQUIPE par grephit
Source avec Zip APPLICATION DE DESSIN DE QUELQUES FIGURES par laguchori
Source avec Zip Source avec une capture HDR EXPOSURE FUSION par mecrosoft
Source avec Zip Source avec une capture IRC CLIENT MULTISERVEUR EN MFC (TXIRC) par TeniX
Source avec Zip ENTETE DU FICHIER BMP (BIPMAP) par k.Lutchi

Commentaires et avis

Commentaire de bobby03 le 14/04/2003 06:19:32

Très bon tes lemmings, quand je comprendrez plus je pourrais peut être le faire en windows.

Commentaire de Draven le 19/04/2003 20:42:15

merci bobby03.
si tu le fais en windows tu pourras me passer ta source que je vois comment tu l as fait. si tu veux plus d explication demande moi. pour les autre ausi, si les commentaires ne sont pas suffisant posez moi des questions.

Commentaire de dolphin84 le 26/05/2003 10:42:48

Salut...
Excellent ton prog d'animation ... ca m'a rappelle de bons souvenirs et surtout de prises de tete.
Oui, par contre, si tu le programme en WINDOWS, je serai interessé aussi pour avoir les sources...
Meme si à mes yx, la programme est plus difficile sous borlandc que sur WINDOWS.
Bonne continuation...

Commentaire de Draven le 26/05/2003 13:58:51

merci dolphin84 ca fait plaisir
a+

Commentaire de slims le 04/07/2003 02:48:59

Salut,
interessant ton source tu pourrais me dire ou ce trouve cette fonction
outportb() dans quel fichier d en tete.
J utilise builder merci d avance.:)

Commentaire de Draven le 04/07/2003 13:07:27

Sous builder cette fonction n'existe pas. avec la fonction outportb tu va directement vise le materiel, et avec builder tu n as pas le droit de faire ca. Mais je sais pas comment faire sous builder. Peut etre quelqu un d autre sera te repondre.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,718 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales