C++ builder visual: probleme

HUSNET Messages postés 6 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 4 mars 2005 - 4 mars 2005 à 17:43
otofraise Messages postés 66 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 4 novembre 2010 - 6 mars 2005 à 12:30
Slt
En fait, je suis en train de concevoir un jeux de casse-briques sur c++builder visual
mais l'ensemble de mes images (qui sont situés dans l'accolade du timer) n'arrêtent
pas de clignoter, ce qui est vraiment embêtant et si quelqu'un pourrait me
conseiller pour résoudre ce probleme, ce serait bien gentil.
Merci d'avance pour vos réponses..

1 réponse

otofraise Messages postés 66 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 4 novembre 2010
6 mars 2005 à 12:30
Salut,



Le clignotement viens du rafraichissement de l'image si tu realise le
trace de ta scene directement dans le TCanvas du composant qui te sert
a afficher. En effet, tu dessine ta premiere image, et avant de
dessiner la deuxieme tu nettoie le Canvas pour qu'il n'y ait pas de
reste de la precedente image dans le zone de la seconde ou tu ne dessin
pas (arf peut etre pas tres clair tout ca)



Le probleme vient du fait que le faible temps ou ton canvas redevient
vide (rempli avec ta couleur de fond) n'est pas assez faible pour ne
pas etre afficher. Et comme tu ractualise souvent et bien tu as un
effet "stroboscopique" tres desagreable.



La solution (et oui yen a une) c'est de travailler avec un "Back
Buffer". En fait tu vas realiser ton image en memoire et seulement une
fois qu'elle sera prete tu va l'afficher dans ton cmposant. Ainsi ce
dernier sera rafraichi avec le nouvelle image et non avec la couleur de
fond sur laquelle on va petit a petit place les different traces. Avec
builder tu peut utiliser le TBitmap pour joueur le role du back buffer.



Voila un petit exemple :



#include <Graphics.hpp>



void __fastcall TForm1::Timer1Timer(TObject* Sender)

{

//Creation d'un TBitmap aux dimensions du composant servant a afficher la scene

Graphics::TBitmap* BackBuffer = new Craphics::Bitmap();

BackBuffer->Height = PaintBox->Height;

BackBuffer->Width = PaintBox->Width;



//Fonction affichant la scene (parametre : TCanvas*)

TracerImage(BackBuffer->Canvas);



//Affichage de l'image contenue dans le BackBuffer sur le canvas du composant

PaintBox1->Canvas->Draw(0, 0, BackBuffer);



//Liberation memoire

delete BackBuffer;

}



Biensur, il est conseille de creer le BackBuffer a la creation de la
Form, et de le detruire une fois l'application terminee pour des
raisons de performance (en effet les dimensions du bitmap ne change pas
durant tout le temps de l'application).



Voila j'espere t'avoir eclaire sur la source de ton probleme et le moyen de le resoudre.



Si je n'ai pas ete assez clair dans mes explications, n'hesite pas



Oto
0
Rejoignez-nous