begin process at 2012 02 09 21:31:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Multimédia

 > 

Problème avec Allegro


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Problème avec Allegro

dimanche 27 novembre 2005 à 19:53:07 | Problème avec Allegro

tikof


Bonjour à tous,
Voila j'ai vu une source sur le site qui montrait comment afficher un rond et pouvoir le bouger sur un fond à l'écran avec allegro en c++.
je me suis permis de le modifier à ma façon pour afficher un personnage et non pas un rond.
seul problème, c'est que mon personnage clignote sans cesse.
voici mon source:
 #include <allegro.h>
   void main()
 
 {
     BITMAP *image; // pour charger un fond noir de taille 640 * 480
     BITMAP *buffer;// buffer indispensable pour afficher l'image a l'ecran grace a la fonction blit
     BITMAP *bufferperso;
     BITMAP *perso; //le perso qu'on déplacera à l'écran
     PALETTE palette;// la palette on s'en servira lors du chargement de l'image
     PALETTE persopal;
 
     int x=320; // position du perso en x initial
     int y=240; // position du perso en y initial
 
     install_allegro(SYSTEM_AUTODETECT,&errno,atexit); // fonction d'initialisation d'allegro
     install_keyboard(); //initialisation du clavier
     set_color_depth(16); // mode 16 bits(plein ecran)
     set_gfx_mode(GFX_AUTODETECT,640,480,0,0); // indispensable pour le graphisme
     buffer=create_bitmap(640,480); // buffer de taille 640 * 480
     bufferperso=create_bitmap(40,40);
     image=load_bitmap("noir.bmp",palette); // chargement de l'image .BMP
      perso=load_bitmap("perso.bmp",persopal);
     blit(perso,bufferperso,0,0,0,0,perso->w,perso->h);
        blit(image,buffer,0,0,0,0,image->w,image->h); // Affichage de l'image sur le buffer
         blit(buffer,screen,0,0,0,0,640,480); // le buffer affichera ceci sur l'ecran
     while(!key[KEY_ESC]) // Tant que l'on a pas pressé la touche ESC (echap)
     {
     
       textout(image,font,"Deplacement d'un Rond avec Allegro !",1,1,makecol(100,100,12)); //la fonction makecol est expliquée plus bas
     
    blit(bufferperso,screen,0,0,x,y,40,40);
          
             
       
     if(key[KEY_UP]) // si on appuie sur la touche du haut
         {
         clear_bitmap(image); // efface l'ecran
             y--; // on decrement y
       blit(bufferperso,screen,0,0,x,y,40,40);
       
     }
        
         else if(key[KEY_DOWN]) // LA meme chose ...
         {
             clear_bitmap(image);
             y++;
              blit(bufferperso,screen,0,0,x,y,40,40);
         }
        
         else if(key[KEY_LEFT])
         {
             clear_bitmap(image);
             x--;
              blit(bufferperso,screen,0,0,x,y,40,40);
         }
         else if(key[KEY_RIGHT])
         {
             clear_bitmap(image);
             x++;
              blit(bufferperso,screen,0,0,x,y,40,40);
         }
    
        
        
 
     }
 }
 END_OF_MAIN(); // Allegro exige que l'on mette ça a la fin du code ...

Je vous remercie d'avance.
Arthur
lundi 28 novembre 2005 à 08:43:29 | Re : Problème avec Allegro

xboxut

Réponse acceptée !
pour que ton personnage ne clignote plus reporte toi au chapitre gestion des buffer du tutorial que tu est en train de lire :D . j ai reconnu le tuto en fr et en pdf pour allegro ac le rond qui bouge. j vais kan meme te repondre. Quand tu dessine directement sur ton ecran (le bitmap screen )cela creer des artefact graphique . Pour resoudre ce probleme, utilise un buffer.C'est un bitmap en memoire de la taille de l écran qui te servira a tout dessiner.ensuite , en fin de boucle tu n aura plus qu a afficher ton buffer sur l ecran. cela fera ainsi disparaitre tes effet de flickering. en plus si j ai bien vu tu intialise un buffer mais tu ne l utilise pas: buffer=create_bitmap(640,480); // buffer de taille 640 * 480 dans tes blit remplace ta destination par buffer: exemple : blit(bufferperso,buffer,0,0,x,y,40,40); puis en fin de boucle blit ton buffer sur l ecran blit(buffer,screen,0,0,0,0,40,SCREEN_W,SCREEN_H); voila bonne chance pour ton apprentissage d allegro ;) si tu a d autres questions n'hesite pas
lundi 28 novembre 2005 à 13:33:04 | Re : Problème avec Allegro

tikof

Réponse acceptée !
tout dabord merci d'avoir répondu aussi vite, mais j'ai un autre problème, avec le code que j'ai mis ci dessus, lorsque je compile pour tester mon prog, le texte qui devrait s'afficher " textout(image,font,"Deplacement d'un Rond avec Allegro !",1,1,makecol(100,100,12));" ne s'affiche pas.
j'avais une autre question, est-ce que la constante "screen" est défini par la lib et désigne l'écran?
d'autre part (désolé pour toutes ces questions)  je n'ai pas compris pourquoi tu dis que je déssine directement sur l'écran, mon bitmap "perso", je le stock dans un buffer , "bufferperso" (cf : "blit(perso,bufferperso,0,0,0,0,perso->w,perso->h); "  )
donc voila, et encore une fois merci d'avoir répondu.

Arthur
lundi 28 novembre 2005 à 13:41:40 | Re : Problème avec Allegro

tikof

Pardon, j'ai aussi oublié de te demander pourquoi je devrais stocker un buffer "bufferperso" dans un autre buffer "buffer" cf: "blit(bufferperso,buffer,0,0,x,y,40,40);"
lundi 28 novembre 2005 à 16:52:21 | Re : Problème avec Allegro

xboxut

est-ce que la constante "screen" est défini par la lib et désigne l'écran? oui. je n'ai pas compris pourquoi tu dis que je déssine directement sur l'écran, mon bitmap "perso", je le stock dans un buffer. oui tu le stocke dans un bitmap de 60 40 je crois. mais le truc c'est que ton stockage de ton bitmap dans un autre bitmap ne sert a rien. kan tu fait load bitmap ,allegro creer un bitmap en memoire et copie le bitmap du fichier vers ta memoire. le truc pour eviter les effets de scintillement c de creer un buffer de taille de l ecran ou tu ecrira a chaque tour de boucle tout ce que tu doit afficher a l'écran, apres tu affiche ton buffer. concernant ton message qui n est pas afficher c'est normal, tu affiche ton message dans image regarde: textout(image,font,"Deplacement d'un Rond avec Allegro !",1,1,makecol(100,100,12)); pour le voir il faudrai l afficher dans ton buffer d'ecran pour le bufferperso que tu stocke dans buffer, tu sotcke pas bufferperso dans perso ,mais tu le dessine dedan comme si tu le dessinait a l ecran en fait. je vais voir si j ai pas un tuto que j avai fait en allegro pour mieux t expliquer
lundi 28 novembre 2005 à 17:01:30 | Re : Problème avec Allegro

xboxut

/************************************************ ****************tutorial allegro **************** ************************************************/ #include "allegro.h"//inclusion de la librairie BITMAP *buffer;//un pointeur de type bitmap qui servira a créé une surface sur laquelle dessiner BITMAP *image; int main()//debut de notre fonction main { allegro_init();//installation d allegro set_color_depth(16) ;//chois du nombre de couleur set_gfx_mode(GFX_AUTODETECT_WINDOWED , 640, 480, 0, 0);//creation de l ecran ou de la fenetre allegro //le premier parametre specifie si c'est une fenetre que l on doit cree ou un mode plein ecran //GFX_AUTODETECT_WINDOWED pour le mode fenetre //GFX_AUTODETECT_FULLSCREEN pour le mode plein ecran //voila notre fenetre est crée. install_mouse();//on installe la souris install_keyboard();//on install le clavier // ca y est allegro est installer notre fenetre est prete a etre utilisée utilisons la /* pour l affichage nous allons ecrire dans un bitmap en memoire puis l afficher a l ecran, cette methode apellé le buffering permet de ne pas avoir d artefact graphique a l écran*/ image=load_bitmap("image.bmp",NULL);//on charge en memoire une image que l on dessinera... //pour creer un bitmap en memoire on utilise la fonction create_bitmap //on l utilise ainsi : pointeurbitmap=create_bitmap(x,y); buffer=create_bitmap(640,480); clear_bitmap(buffer);//on nettoie notre bitmap o cas ou :p //voila notre bitmap est crée en memoire il ne nous reste plus qu a ecrire dessus puis a l afficher a l ecran. //pour cela nous allon cree une boucle while(!key[KEY_ESC])//tant que escape n est pas apuyé { //rectfill(BITMAP *bmp, int x1, int y1, int x2, int y2, int color); rectfill(buffer,0,0,100,100,makecol(255,255,255)); /*cette fonction permet de dessiner un rectangle en x1y1 x2 y2, makecol est une fonction qui utilise 3 valeur RGB en parametre pour cree une couleur */ blit(image,buffer,0,0,100,100,image->w,image->h); /*le blit est une copie d'un bitmap vers un autre , ici nous allons desssiner le bitmap image vers le buffer. en position x=100 y=100. Au lieu d'afficher le bitmap directement sur l'ecran ,ce qui provoquerai des bugs graphiques, nous allons afficher les bitmap sur un buffer qui sera a la fin de la boucle copier d'un bloc sur l'écran.Cela aura pour effet d' eviter les effets de flickering ("sintillement de l'écran") */ //voyons maintenant le test sur clavier: if(key[KEY_SPACE]) { textout(buffer, font, "test", 0, 400,makecol(100,100,100));// on ecrit dans buffer la prase test //textout(BITMAP *bmp, const FONT *f, const char *s, int x, y, int color); //ceci est une fonction pour ecrire du texte a l écran. } //il ne nous reste plus qu a afficher le bitmap que l on a dessiner a l écran pour cela //on utilise une fonction appeler blit qui copie des morceau de bitmap //blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height); blit(buffer, screen, 0, 0, 0, 0, 640, 480);//on affiche a l'ecran le buffer dans lequel on a dessiné clear_bitmap(buffer);//on vide le buffer pour redesssiner dessus }//fin de la boucle allegro_exit();//on desintalle allegro et tout le bordel return 0; } END_OF_MAIN();//fonction magique :p
mardi 29 novembre 2005 à 13:54:42 | Re : Problème avec Allegro

xboxut

voila un bon tuto pour allegro : http://iteme.free.fr/ tu devrai tout comprendre avec ca ;) bonne chance si tu a d otre questions n hesite pas


Cette discussion est classée dans : image, perso, key, bitmap, blit


Répondre à ce message

Sujets en rapport avec ce message

Petit Bugg [ par ToToL ] Tout d'abord voici mon code : #include int main() { install_allegro(SYSTEM_AUTODETECT, &errno, atexit);set_color_depth(16);set_gfx_mode(GFX_AUTODETECT Charger un BMP avec une OpenFileDialog et l'afficher dans un pictureBox . [ par Dragoon ] Bonjour à tous,Je ne suis pas un spécialiste du C++ et des MFC et je souhaiterais comprendre ce qui ne va pas dans mon programme.Je voudrais que celui Déplacer Bitmap à la souris [ par GoldenEye ] Bonjour, Je souhaiterais afficher une (grande) image bmp dans une fenêtre de taille fixe. A chaque fois que l'utilisateur presse le bouton gauche, le need help_API - debutant. [ par JimyRyan ] j'ai cree un progamme qui affiche une image (stoquee dans un fichier .bmp), et une phrase (lu a partir d'un fichier TXT), j'ai deux problemes : une fo image bitmap et graphique ss visual c++ [ par pipic ] Slt tt le monde,G 2 petites questions:1) Comment insérer une image ss visual C++??G créeé ma ressource et je l'ai chargé à partir de la ft° LoadBitmap dialogbox et bitmap [ par supergrey ] Bonjour, je fais actuellement un client IRC et je voudrais qu'un image s'affiche dans ma boite de dialogue principal lorsque la connexion est etablie. longueur et largeur d'une image BITMAP. [ par Adeon ] Salut!QQ peut il me dire la fonction en API qui donne la longueur et la largeur d'une image BITMAP. Adeon Conversion bitmap 8 bits -> 24 bits [ par lma ] Je suis à la recherche d'un programme permettant de convertir une image bitmap 8 bits en image bitmap 24 bitsQuelqu'un peut il m'aider ? Comment récuperer la luminosité d'un pixel d'une image bitmap? [ par chmod777 ] Je cherche a recuperer la luminosité d'un pixel (n'importe lequel) d'une image bitmap, cela ne doit pas etre sorcier mais j'avoue que là, j'ai du mal: Découper puis affichier un bitmap [ par Vortex99011 ] Bonjour,depuis quelques jours de recherches désespérées, je viens vous demander ici un grand secours. Je recherche une manière quelconque pour affiche


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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,702 sec (4)

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