Problème avec Allegro [Résolu]

tikof 16 Messages postés mardi 11 mai 2004Date d'inscription 28 novembre 2005 Dernière intervention - 27 nov. 2005 à 19:53 - Dernière réponse : xboxut 175 Messages postés jeudi 4 mars 2004Date d'inscription 27 novembre 2009 Dernière intervention
- 29 nov. 2005 à 13:54
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

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
Afficher la suite 

6 réponses

Répondre au sujet
xboxut 175 Messages postés jeudi 4 mars 2004Date d'inscription 27 novembre 2009 Dernière intervention - 28 nov. 2005 à 08:43
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de xboxut
tikof 16 Messages postés mardi 11 mai 2004Date d'inscription 28 novembre 2005 Dernière intervention - 28 nov. 2005 à 13:33
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de tikof
tikof 16 Messages postés mardi 11 mai 2004Date d'inscription 28 novembre 2005 Dernière intervention - 28 nov. 2005 à 13:41
0
Utile
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);"
Commenter la réponse de tikof
xboxut 175 Messages postés jeudi 4 mars 2004Date d'inscription 27 novembre 2009 Dernière intervention - 28 nov. 2005 à 16:52
0
Utile
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
Commenter la réponse de xboxut
xboxut 175 Messages postés jeudi 4 mars 2004Date d'inscription 27 novembre 2009 Dernière intervention - 28 nov. 2005 à 17:01
0
Utile
/************************************************
****************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
Commenter la réponse de xboxut
xboxut 175 Messages postés jeudi 4 mars 2004Date d'inscription 27 novembre 2009 Dernière intervention - 29 nov. 2005 à 13:54
0
Utile
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
Commenter la réponse de xboxut

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.