TMoutonThread = class(TThread) private ThreadCount1,ThreadCount2: Integer; ImgMouList:Array[1..7] Of TImage; protected procedure execute; Override; procedure anime; public constructor Create (Count1,Count2:integer; ImgTempList:Array Of TImage); end; constructor TMoutonThread.Create (Count1,Count2:integer; ImgTempList:Array Of TImage); Var IndexImg:Cardinal; begin inherited Create(False); ThreadCount1:=Count1; ThreadCount2:=Count2; For IndexImg:=1 To 7 Do ImgMouList[IndexImg]:= ImgTempList[IndexImg]; end; procedure TMoutonThread.Execute; begin repeat Sleep(500); Synchronize(anime); until Terminated; end; procedure TMoutonThread.anime; begin Inc(ThreadCount1 ,1); If ThreadCoun1<=6 Then ImgMouList[1]:=ImgMouList[ThreadCount1+1]; if ThreadCoun1>= 8 then ThreadCount1 := 0; end;
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionunit Ducks; interface {$IF RTLVersion >= 18.0} {$DEFINE PNGIMG} {$ELSE} {$DEFINE PNGLIB} {$IFEND} uses Windows, SysUtils, Classes, Graphics, {$IFDEF PNGIMG}PNGImage{$ELSE}PNGLib{$ENDIF}; {$IFDEF PNGLIB} type TPNGImage = TPNGObject; {$ENDIF} { Images d'arriere plan et d'avant plan } const giBackPlan = 0; giFrontPlan = giBackPlan + 1; giMin = giBackPlan; giMax = giFrontPlan; var GroundImages : array[giMin..giMax] of TPNGImage; GroundImagesLoaded : boolean = false; procedure DrawBackGround(Canvas: TCanvas; X, Y: integer); inline; procedure DrawFrontGround(Canvas: TCanvas; X, Y: integer); inline; { Images du viseur } const miWait = 0; miShoot = miWait + 1; miReload = miShoot + 1; miMin = miWait; miMax = miReload; var MireImages : array[miMin..miMax] of TPNGImage; MireImagesLoaded : boolean = false; procedure DrawMire(Canvas: TCanvas; X, Y, Mire: Integer); inline; { Images des canards en mode : Vol de gauche à droite (LR) Vol de droite à gauche (RL) Tiré de gauche à droite (LR) Tiré de droite à gauche (RL) } const diModeLR = 0; diModeRL = 1; diFlyMin = 0; diFlyMax = 3; diShootedMin = 0; diShootedMax = 2; var DuckImagesFly : array[diModeLR..diModeRL, diFlyMin..diFlyMax] of TPNGImage; DuckImagesFlyLoaded : boolean = false; DuckImagesShooted : array[diModeLR..diModeRL, diShootedMin..diShootedMax] of TPNGImage; DuckImagesShootedLoaded : boolean = false; procedure DrawDuckFly(Canvas: TCanvas; X, Y, Dir, Frame: integer); inline; procedure DrawDuckShooted(Canvas: TCanvas; X, Y, Dir, Frame: integer); inline; type TDuck = class private fDir : integer; fFrame : integer; fPos : TPoint; fSpd : integer; fCanvas: TCanvas; fState : integer; // 0 fly, 1 shooted fOnDead: TNotifyEvent; public constructor Create(Canvas: TCanvas); // Ducks[n] := TDuck.Create(PaintBox1.Canvas); procedure Step; // a appeler dans evenement Timer1 -> OnTimer procedure Draw; // a appeler dans evenement PaintBox1 -> OnPaint ou procedure Form -> DrawBuffer function Shooted(const X,Y: integer): boolean; // a appeler dans evenement PaintBox1 -> OnMouseDown[mbLeft] ou // procedure Form -> OnMouseDown[mbLeft] public property OnDead : TNotifyEvent read fOnDead write fOnDead; // assignez un evenement ici pour // liberer le canard de la liste (TList, TObjectList) end; implementation procedure DrawBackGround(Canvas: TCanvas; X, Y : integer); begin Canvas.Draw(X, Y, GroundImages[giBackPlan]); end; procedure DrawFrontGround(Canvas: TCanvas; X, Y : integer); begin Canvas.Draw(X, Y, GroundImages[giFrontPlan]); end; procedure DrawMire(Canvas: TCanvas; X, Y, Mire: Integer); begin Canvas.Draw(X - (MireImages[Mire].Width shr 1), Y - (MireImages[Mire].Height shr 1), MireImages[Mire]); end; procedure DrawDuckFly(Canvas: TCanvas; X, Y, Dir, Frame: integer); begin Canvas.Draw(X - (DuckImagesFly[Dir, Frame].Width shr 1), Y - (DuckImagesFly[Dir, Frame].Height shr 1), DuckImagesFly[Dir, Frame]); end; procedure DrawDuckShooted(Canvas: TCanvas; X, Y, Dir, Frame: integer); begin Canvas.Draw(X - (DuckImagesShooted[Dir, Frame].Width shr 1), Y - (DuckImagesShooted[Dir, Frame].Height shr 1), DuckImagesShooted[Dir, Frame]); end; { Extention et chemin des images } var imExt : string = '.png'; imPath : string = ''; { Noms des images d'arriere plan et d'avant plan } const giNames : array[giMin..giMax] of string = ('backplan','frontplan'); { Noms des images du viseur } const miNames : array[miMin..miMax] of string = ('mirewait','mireshoot','mirereload'); { Noms des images des canards } const diNamesFly : array[diModeLR..diModeRL, diFlyMin..diFlyMax] of string = (('LRF0','LRF1','LRF2','LRF3'),('RLF0','RLF1','RLF2','RLF3')); diNamesShooted : array[diModeLR..diModeRL, diShootedMin..diShootedMax] of string = (('LRS0','LRS1','LRS2'),('RLS0','RLS1','RLS2')); { Chargement des Images } procedure LoadPictures; var N, M : integer; F : string; begin GroundImagesLoaded := true; for N := giMin to giMax do begin GroundImages[N] := TPNGImage.Create; F := imPath + giNames[N] + imExt; if FileExists(F) then GroundImages[N].LoadFromFile(F); GroundImagesLoaded := GroundImagesLoaded and not GroundImages[N].Empty; end; MireImagesLoaded := true; for N := miMin to miMax do begin MireImages[N] := TPNGImage.Create; F := imPath + miNames[N] + imExt; if FileExists(F) then MireImages[N].LoadFromFile(F); MireImagesLoaded := MireImagesLoaded and not MireImages[N].Empty; end; DuckImagesFlyLoaded := true; DuckImagesShootedLoaded := true; for M := diModeLR to diModeRL do begin for N := diFlyMin to diFlyMax do begin DuckImagesFly[M, N] := TPNGImage.Create; F := imPath + diNamesFly[M, N] + imExt; if FileExists(F) then DuckImagesFly[M, N].LoadFromFile(F); DuckImagesFlyLoaded := DuckImagesFlyLoaded and not DuckImagesFly[M, N].Empty; end; for N := diShootedMin to diShootedMax do begin DuckImagesShooted[M, N] := TPNGImage.Create; F := imPath + diNamesShooted[M, N] + imExt; if FileExists(F) then DuckImagesShooted[M, N].LoadFromFile(F); DuckImagesShootedLoaded := DuckImagesShootedLoaded and not DuckImagesFly[M, N].Empty; end; end; end; { Déchargement des images } procedure UnloadPictures; var N, M : integer; begin GroundImagesLoaded := false; for N := giMin to giMax do GroundImages[N].Free; MireImagesLoaded := false; for N := miMin to miMax do MireImages[N].Free; DuckImagesFlyLoaded := false; DuckImagesShootedLoaded := false; for M := diModeLR to diModeRL do begin for N := diFlyMin to diFlyMax do DuckImagesFly[M, N].Free; for N := diShootedMin to diShootedMax do DuckImagesShooted[M, N].Free; end; end; { Initialisation au debut du programme } procedure Initialize; begin imPath := ExtractFilePath(ParamStr(0))+'Images\'; LoadPictures; end; { Finalisation en fin de programme } procedure Finalize; begin UnloadPictures; end; { TDuck } constructor TDuck.Create(Canvas: TCanvas); begin // le canvas doit etre valide assert(assigned(Canvas), 'TDuck.Create : Canvas ne peut être Nil.'); fCanvas := Canvas; // direction aleatoire fDir := random(100) mod 2; // position aleatoire fPos.X := random(Canvas.ClipRect.Right-30)+30; fPos.Y := random(Canvas.ClipRect.Bottom-200)+30; // vitesse aleatoire fSpd := (random(100) mod 4) + 1; // frame de depart (la derniere) fFrame := diFlyMax; // etat de depart (en vol) fState := 0; end; procedure TDuck.Draw; begin case fState of // en vol 0 : DrawDuckFly(fCanvas, fPos.X, fPos.Y, fDir, fFrame); // tiré 1 : DrawDuckShooted(fCanvas, fPos.X, fPos.Y, fDir, fFrame); end; end; function TDuck.Shooted(const X,Y: integer): boolean; var PB : pByteArray; begin // si le canard est déja tiré result :fState 1; // on sort if result then exit; // on recupere le cique du viseur PB := DuckImagesFly[fDir, fFrame].AlphaScanline[Y]; // le canard ne peut etre tiré que si l'on a tiré dans une zone dont // la transparence est superieure a 128 result := PB^[X] > $80; // si le canard est tiré on change l'etat d'animation if result then fState := 1; end; procedure TDuck.Step; begin // mouvement du canard case fState of 0 : // en vol begin fFrame := (fFrame + 1) mod (diFlyMax+1); case fDir of diModeLR : // de gauche a droite begin fPos.X := fPos.X + fSpd; // change la position // si on sort du cadre if fPos.X > (fCanvas.ClipRect.Right-30) then begin fDir := diModeRL; // change la direction fPos.X := fPos.X - fSpd; // reviens a la position d'avant end; end; diModeRL : // de droite a gauche begin fPos.X := fPos.X - fSpd; // change la position // si on sort du cadre if fPos.X < (fCanvas.ClipRect.Left+30) then begin fDir := diModeLR; // change la direction fPos.X := fPos.X + fSpd; // reviens a la position d'avant end; end; end; end; 1 : // tiré begin // si on est a la derniere frame de la mort du canard if fFrame = diFlyMax then begin // on previens qu'il faut detruire le canard if Assigned(fOnDead) then fOnDead(Self); end else // sinon on continue l'animation fFrame := fFrame + 1; end; end; end; initialization Initialize; finalization Finalize; end.