Bonjour à tous,
Je suis un peu embêter avec une animation. En fait j'essaie de faire tourner un composants sur lui même en lui changeant son angle. Malheureusement, étant donné que j'utilise du TBitmap et que l'image est assez grande, il y a un clignotement qui est généré au ritme du timer.
Voici comment il fonctionne en gros :
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void __fastcall clRoll::Paint()
{
Graphics::TBitmap *SrcBitmap=new Graphics::TBitmap;
Graphics::TBitmap *DestBitmap=new Graphics::TBitmap;
AnsiString BmpPath;
if(FAlarm)
BmpPath = "C:\\Planar\\Bitmaps\\RollAlarm.bmp";
else if (FTurn)
{
if (FSens==sensLeft)
BmpPath = "C:\\Planar\\Bitmaps\\RollLeft.bmp";
else
BmpPath = "C:\\Planar\\Bitmaps\\RollRight.bmp";
}
else
BmpPath = "C:\\Planar\\Bitmaps\\Roll.bmp";
SrcBitmap->LoadFromFile(BmpPath);
//To adapt the center of the rotating animation
float centreX = 0;
float centreY = 0;
//Convert degrees to radians
float radians=(2*3.1416*FAngle)/360;
float cosine=(float)cos(radians);
float sine=(float)sin(radians);
float Point1x=(-SrcBitmap->Height*sine);
float Point1y=(SrcBitmap->Height*cosine);
float Point2x=(SrcBitmap->Width*cosine-SrcBitmap->Height*sine);
float Point2y=(SrcBitmap->Height*cosine+SrcBitmap->Width*sine);
float Point3x=(SrcBitmap->Width*cosine);
float Point3y=(SrcBitmap->Width*sine);
float minx=min(0,min(Point1x,min(Point2x,Point3x)));
float miny=min(0,min(Point1y,min(Point2y,Point3y)));
float maxx=max(Point1x,max(Point2x,Point3x));
float maxy=max(Point1y,max(Point2y,Point3y));
int DestBitmapWidth=(int)ceil(fabs(maxx)-minx);
int DestBitmapHeight=(int)ceil(fabs(maxy)-miny);
DestBitmap->Height=DestBitmapHeight;
DestBitmap->Width=DestBitmapWidth;
for(int x=0;x<DestBitmapWidth;x++)
{
for(int y=0;y<DestBitmapHeight;y++)
{
int SrcBitmapx=(int)((x+minx)*cosine+(y+miny)*sine);
int SrcBitmapy=(int)((y+miny)*cosine-(x+minx)*sine);
if(SrcBitmapx>=0&&SrcBitmapx<SrcBitmap->Width&&SrcBitmapy>=0&&
SrcBitmapy<SrcBitmap->Height)
{
DestBitmap->Canvas->Pixels[x][y]=
SrcBitmap->Canvas->Pixels[SrcBitmapx][SrcBitmapy];
}
else
DestBitmap->Canvas->Pixels[x][y]=clWhite;
}
}
centreX = abs(DestBitmap->Width)/2-abs(SrcBitmap->Width)/2;
centreX = 21-abs(centreX);
centreY = abs(DestBitmap->Height)/2-abs(SrcBitmap->Height)/2;
centreY = 21-abs(centreY);
//Show the rotated bitmap
DestBitmap->Transparent = FTransparent;
DestBitmap->TransparentMode = tmAuto;
Canvas->Draw(centreX,centreY,DestBitmap);
Width = DestBitmap->Width+centreX;
Height = DestBitmap->Height+centreY;
delete SrcBitmap;
delete DestBitmap;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Quu'est ce que vous me conseillez ? Est-ce que je devrais passer par une autre méthode graphique ?
Merci à vous tous
PS. J'utilise Borland C++Builder 6