1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| unit Uanimal;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, Grids, Graph, ExtCtrls, Math;
Const LimBord = 50;
MaxAnimaux = 200;
type TCoord = Array[1..2] of word;
TVect = Array[1..2] of real;
Tsexe = (M,F);
Panimaux = ^Tanimaux;
Canimal = Class
Protected
// Caractéristiques :
Num : integer;
position : TCoord; // position dans bocal
Vecteur : TVect; // Vecteur définissant la direction actuelle
taille : integer; // + poids : détermine l'énergie à consommer pour bouger, la quantité de viande si mangé, ...
rapidite : real; // influe sur la vitesse de déplacement
Public
Procedure NewVecteur(Im : Timage);
Procedure NewPosition();
End;
Tanimaux = Record
Animal : Canimal;
Suivant : Panimaux;
End;
implementation
Procedure Canimal.NewVecteur(Im : Timage);
Var VectBord : TVect; Posg, Posd, Posb, Posh : integer;
Begin
// Position des extrémités de l'animal (schématisé par une sphère)
Posg := Position[1] - taille div 2;
Posd := Position[1] + taille div 2;
Posb := Position[2] - taille div 2;
Posh := Position[2] + taille div 2;
VectBord[1] := 0; VectBord[2] := 0;
If (Posg < LimBord) or (Posd > (Im.width - LimBord)) then
Vecteur[1] := -1*Vecteur[1]; // rebond sur les parois gauche ou droite
If (Posb < LimBord) and (Posh > (Im.height - LimBord)) then
Vecteur[2] := -1*Vecteur[2]; // rebond sur les parois bas ou haut
end;
Procedure Canimal.Newposition();
Var teta, p1, P1s, P2, P2s, v1, v2, vit : real;
Begin
// Angle Teta en radian de la trajectoire
If Vecteur[1] <> 0 then Teta := Arctan(Vecteur[2]/Vecteur[1])
Else Teta := 0;
If Vecteur[1] < 0 then Teta += pi();
// Projection du Vecteur (vecteur trajectoire) sur chaque axe et calcul de la nouvelle position
Position[1] += round(rapidite*cos(Teta));
Position[2] += round(rapidite*sin(Teta));
End;
end. |
Partager