Probleme de clignotement à l'affichage !!! aidez moi svp
wobbly_yoyo
Messages postés4Date d'inscriptionsamedi 31 janvier 2004StatutMembreDernière intervention26 mars 2004
-
25 mars 2004 à 22:49
wobbly_yoyo
Messages postés4Date d'inscriptionsamedi 31 janvier 2004StatutMembreDernière intervention26 mars 2004
-
26 mars 2004 à 13:33
Dans le cadre d'un projet info je réalise un jeu de billard sous delphi et le premier probleme que je rencontre est celui de l'affichages et le calcul des 16 boules simultanémant tout en evitant le clignotemen !! (sachant que j'utilise des bitmap pour les boules!) donc si vous êtes en mesure de me conseiller je vous enverais mes source. Jai vraiment besois de vous la! Merci
%-6
A voir également:
Probleme de clignotement à l'affichage !!! aidez moi svp
private
{ Private declarati
procedure BitBtn1Click(Sender: TObject);ons }
public
{ Public declarations }
end;
var
Form1: TForm1;
Shift: TShiftState;
xx,yy:string ;
implementation
{$R *.dfm}
procedure TForm1.affichageTimer(Sender: TObject);
var i:integer;
begin
GetCursorPos(souris);
Screen.Cursors[6] := LoadCursorFromFile('ball.ani');
Form1.Cursor:=6;
Progressbar1.Cursor:=6;
ProgressBAr1.visible:=true;
for i:=1 to 2 do // def du nombre de boules
begin
procedure Tform1.afficher(n:integer);
var i:integer;
begin
Form1.Canvas.Draw(0,0,FondTrav); // On affiche FondTrav dans la fenêtre
Fondtrav.Canvas.CopyRect(rec[n],Fond.canvas,rec[n]); //on efface la boule
end;
procedure Tform1.afficher;
begin
FondTrav.Canvas.Draw(trunc(boule[n].X),trunc(boule[n].Y),boule[1].visu); // On dessine la boule dans FondTrav (Qui contient déjà la fond)
rec[1] := rect(trunc(boule[n].X),trunc(boule[n].Y),trunc(boule[n].X)+boule[n].visu.Width,trunc(boule[n].Y)+boule[n].visu.Height);
rboule:=boule[n].visu.Width/2;
// mouvements de la boiule
begin
boule[n].X:=(boule[n].VX*k)+boule[n].X ;
boule[n].Y:=(boule[n].VY*k)+boule[n].Y ;
end;
if k>0.0000001 then k:=k-0.006;
if k<=0.0000001 then
begin
boule[1].VX:=0; boule[1].Vy:=0;
k:=1 ;
end;
end;
procedure Tform1.bandes(n:integer);
begin
// colisions avec les bandes
if (boule[n].X <= 93) then begin
boule[n].VX := boule[n].VX*-1;
boule[n].x:=93
end;
if( boule[n].Y <= 154) then begin
boule[n].VY := boule[n].VY*-1;
boule[n].y:=154
end;
if (boule[n].X >= (698)-boule[n].visu.Width)then begin
boule[n].VX := boule[n].VX*-1;
boule[n].x:=698-boule[n].visu.Width
end;
if (boule[n].Y >= (441)-boule[n].visu.Height) then begin
boule[n].VY := boule[n].VY*-1;
boule[n].y:=441-boule[n].visu.Height
end;
end;
procedure Tform1.collision(n:integer);
var i:integer;dx,dy:real;
begin
dx:=sqrt((boule[n].x-boule[n+1].x)*(boule[n].x-boule[n+1].x)+(boule[n].y-boule[n+1].y)*(boule[n].y-boule[n+1].y) );
// colisions avec les bandes
if (dx<= rboule) then begin
boule[n].VX := boule[n].VX*-1;
boule[n].Vy := boule[n].Vy*-1;
boule[n+1].VX := boule[n].VX/2;
boule[n+1].Vy := boule[n].Vy/2;
end;
end;
procedure TForm1.UtilisationGetKeyboartdState(Sender: TObject);
var
KeyboardState:TKeyboardState;
Shift : TShiftState;
begin
GetKeyboardState(KeyboardState);
Shift:=KeyboardStateToShiftState(KeyboardState);
if ssShift in Shift then
Form1.Progressbar1.Position:=Form1.Progressbar1.Position+1;
if ssCtrl in Shift then
Form1.Progressbar1.Position:=Form1.Progressbar1.Position-1;
end;
procedure TForm1.UtilisationGetKeyState(Sender: TObject);
var
kx,ky:real;
begin
if form1.BitBtn1.enabled=false then //on ne tir que si les boules sont immobiles!
begin
if (GetKeyState(VK_LBUTTON) < 0) and (boule[1].Vx=0) and (boule[1].vy=0) then
begin
if (cos1<>0) or (sin1<>0) then
begin
boule[1].VX:=(Form1.Progressbar1.Position/vitessejeu)*cos1;
boule[1].Vy:=(Form1.Progressbar1.Position/vitessejeu)*sin1;
end;
end;
end;
end;
procedure TForm1.AttenteactionTimer(Sender: TObject);
begin
procedure TForm1.BitBtn1Click(Sender: TObject);
var i:integer;
tmp : TJPEGImage;
begin
tmp := TJPEGImage.Create;
FondOriginal := tbitmap.Create;
Fond:= Tbitmap.Create;
tmp.LoadFromFile('billard2.jpg');
FondOriginal.Assign(tmp);
Tmp.Free;
Fond.Width := 800;
Fond.Height := 600;
Fond.Canvas.StretchDraw(rect(0,0,800,600),FondOriginal);
FondTrav := tbitmap.Create;
FondTrav.Assign(Fond); // On recopie le fond 'Fond' dans Fondtrav en prévision du
// double buffering.
form1.Canvas.Draw(0,0,Fond);
affichage.Enabled:=true;
vitessejeu:=1 ;//definition de la sensibilité barre de force
form1.BitBtn1.Enabled:=False; //arrêt bouton de definition initial
k:=1 ;
// definition intitiales des boules
for i:=1 to 2 do begin
boule[i].visu := Tbitmap.Create;
boule[i].visu.LoadFromFile('Boule.bmp');
boule[i].visu.TransparentColor := clBlack;
boule[i].visu.Transparent := true;
boule[i].VX := 0;
boule[i].VY := 0;
boule[i].x:=boule[i].x ;
boule[i].y:=boule[i].y ;
xinitial[1]:=240;yinitial[1]:=285;
xinitial[2]:=600;yinitial[2]:=300;
boule[i].x:=xinitial[i] ;
boule[i].y:=yinitial[i] ;
boule[i].vx:=0 ;
boule[i].vy:=0 ;
FondTrav.Canvas.Draw(trunc(boule[i].X),trunc(boule[i].Y),boule[i].visu); // On dessine la boule dans FondTrav (Qui contient déjà la fond)
Form1.Canvas.Draw(0,0,FondTrav); // On affiche FondTrav dans la fenêtre
end ;
yoghisan
Messages postés204Date d'inscriptionsamedi 10 mai 2003StatutMembreDernière intervention 2 juin 20051 25 mars 2004 à 23:55
Essaie ca
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DoubleBuffered:=true;
end;
Si ca marche , cest coll et tiens moi au courant sinon file une adresse url avec ta source si possible parce que comme ca, il faut rentrer dans le code...
PS : ne le met pas en source s'il y a des problemes...
yoghisan
Messages postés204Date d'inscriptionsamedi 10 mai 2003StatutMembreDernière intervention 2 juin 20051 26 mars 2004 à 00:11
Ha oui, aussi, je viens d'y penser. Tu peux aussi tout afficher dans un TpaintBox, ca supprimera ton scintillement cependant tu dois bien gerer l'évenement OnPaint pour eviter un effacement si on passe par exemple une fenetre sur ton application.
En mettant dans l'evenement OnPaint, le code Form1.Canvas.Draw(0,0,FondTrav) ca devrait le faire.
PS : je ne suis pas rentrer suffissament dans le code mais je crois que tu ne fais pas un vrai doublebuffer.
PS2 : Je veux bien bosser sur ton truc, la problematique est interessant mais file moi tout pour que je puisse.
Vous n’avez pas trouvé la réponse que vous recherchez ?
wobbly_yoyo
Messages postés4Date d'inscriptionsamedi 31 janvier 2004StatutMembreDernière intervention26 mars 2004 26 mars 2004 à 07:35
Même avec Form1.DoubleBuffered:=true;
c'est le même probleme je ne voix pas commment avec une paintbox ça s'arrangerai mais je ne pense pas avoir les competence pour corriger ce probleme voila mes sources :
yoghisan
Messages postés204Date d'inscriptionsamedi 10 mai 2003StatutMembreDernière intervention 2 juin 20051 26 mars 2004 à 09:37
Salut,
J'ai tout juste commencé à regarder de pres.
Ton executable marche et montre bien ton probleme.
Par contre, je compile telle quelle ta source, ca plante tout, je ne peux meme pas réinitialiser... (j'essaierai sur mon ordi chez moi pour voir si ca fait pareille). Pour l'instant, je suis sur un PII 400MHz - win98 et delphi7.
Pas grave, c'est simplement pour te dire que ca va me prendre un peu plus de temps..
wobbly_yoyo
Messages postés4Date d'inscriptionsamedi 31 janvier 2004StatutMembreDernière intervention26 mars 2004 26 mars 2004 à 13:33
Merci c'est vraiment cool de ta part de regarder ça pour moi car j'y ai deja passé du temp mais je n'ai pas trouvé de solution sinon moi je l'ai codé et testé sous un PIV 2.8 Ghz win Xp Delphi7.
:big) !