OBJS.BAK 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. Unit Objs;
  2. InterFace
  3. Uses Objects, Graph, TypeLib;
  4. Const
  5. MAXNAME = 30;
  6. MAXTYPE = 20;
  7. Type
  8. vec = record x,y:real; end;
  9. rect = record A,B,C,D : vec; end;
  10. Pline = ^TLine;
  11. Tline = record A,B : vec; end;
  12. PString = ^String;
  13. ManMoods = (MOOD_STOP,MOOD_WALK,MOOD_ACCEL,MOOD_BRAKING);
  14. CObjs = Object
  15. oType : string[MAXTYPE];
  16. Name : string[MAXNAME];
  17. Color : integer;
  18. Heading: Real;
  19. POS : vec;
  20. Speed : vec;
  21. Accel : vec;
  22. Bounds : TLine;
  23. procedure Step;
  24. procedure Draw;
  25. procedure Clear;
  26. End;
  27. CHouse = Object (COBjs)
  28. UL, BR : vec;
  29. Door : Rect;
  30. Constructor Init(cx,cy,sTop,sBottom,sLeft,sRight : real;aName : string);
  31. Procedure SetDoor(dx1,dy1,dx2,dy2 : real);
  32. Procedure Draw;
  33. end;
  34. CMan = Object (COBjs)
  35. Mood : MANMOODS;
  36. MaxAccel : real;
  37. MaxSpeed : real;
  38. StepPos : real;
  39. Scale : real;
  40. NewMove : byte;
  41. DefBounds: TLine;
  42. Model : array [0..5] of PLine;
  43. Procedure CreateMan(var Ar:array of PLine;SP:real);
  44. Constructor Init(cx,cy,ang,aScale:real;aName:string;aCol:integer);
  45. Procedure Rotate(aAng : real);
  46. Procedure SetSpeed(aNewSpeed : real);
  47. Procedure SetAccel(aNewAccel : real);
  48. Procedure Step;
  49. Procedure Clear;
  50. Procedure Draw;
  51. Destructor Destroy;
  52. end;
  53. Procedure DrawRay(aC:vec;Ang,Len:real);
  54. Procedure SetBounds(Ob : array of Pline;numvert:word;var aB:TLine;DefBounds:TLine);
  55. Procedure RotateVec(var aV : Vec; Ang:Real);
  56. Procedure RotateRect(var Ob : rect;Ang:real);
  57. Procedure RotateLine(var Ob : TLine;Ang:real);
  58. Procedure RotateArray(var Ob : array of Pline;numvert:word;Ang:real);
  59. Function Len(aVec : vec) : real;
  60. Procedure Neg(var aV : real);
  61. IMPLEMENTATION
  62. {-------------------------------}
  63. Procedure Neg(var aV : real);
  64. begin
  65. aV := -aV;
  66. end;{Neg}
  67. {-------------------}
  68. Procedure SetBounds;
  69. var
  70. i : word;
  71. begin
  72. with aB do begin
  73. Ab := DefBounds;
  74. for i := 0 to NumVert do
  75. begin
  76. if ob[i]^.A.X > A.X then A.X:=ob[i]^.A.X;
  77. if ob[i]^.B.X > A.X then A.X:=ob[i]^.B.X;
  78. if ob[i]^.A.Y > A.Y then A.Y:=ob[i]^.A.Y;
  79. if ob[i]^.B.Y > A.Y then A.Y:=ob[i]^.B.Y;
  80. if ob[i]^.A.X < B.X then B.X:=ob[i]^.A.X;
  81. if ob[i]^.B.X < B.X then B.X:=ob[i]^.B.X;
  82. if ob[i]^.A.Y < B.Y then B.Y:=ob[i]^.A.Y;
  83. if ob[i]^.B.Y < B.Y then B.Y:=ob[i]^.B.Y;
  84. end;
  85. end;
  86. end;{SetBounds}
  87. {--------------------}
  88. Procedure DrawRay;
  89. Begin
  90. Line(Round(aC.X),Round(aC.Y),
  91. Round(aC.X+Len*cos(PI*Ang/180)),Round(aC.Y+Len*sin(PI*Ang/180)));
  92. end; {DrawRay}
  93. {--------------------}
  94. Procedure RotateVec;
  95. var ps : vec;
  96. begin
  97. ps.X := aV.X * cos(PI*Ang/180) - aV.Y * sin(PI*Ang/180);
  98. ps.Y := aV.X * sin(PI*Ang/180) + aV.Y * cos(PI*Ang/180);
  99. av := ps;
  100. end;{RotateVec}
  101. {--------------------}
  102. Procedure RotateRect;
  103. begin
  104. RotateVec(ob.A,Ang);
  105. RotateVec(ob.B,Ang);
  106. RotateVec(ob.C,Ang);
  107. RotateVec(ob.D,Ang);
  108. end;{RotateVec}
  109. {--------------------}
  110. Procedure RotateLine;
  111. begin
  112. RotateVec(ob.A,Ang);
  113. RotateVec(ob.B,Ang);
  114. end;{RotateVec}
  115. {--------------------}
  116. Procedure RotateArray;
  117. var u : word;
  118. begin
  119. for u := 0 to numvert do RotateLine(ob[u]^,Ang);
  120. end;{RotateVec}
  121. {--------------------}
  122. Function Len;
  123. begin
  124. Len := Sqrt(Sqr(aVec.X)+Sqr(aVec.Y));
  125. end;{Len}
  126. {--------------------}
  127. {COBJ}
  128. Procedure CObjs.step; begin end;
  129. Procedure CObjs.Draw; begin end;
  130. Procedure CObjs.Clear; begin end;
  131. {/COBJ}
  132. {------------}
  133. {CMan}
  134. Procedure CMan.CreateMan;
  135. Begin
  136. with Ar[0]^ do Begin
  137. A.x:=-3*Scale;A.y:=0;B.x:=-7*Scale;B.y:=0;end;
  138. with Ar[1]^ do Begin
  139. A.x:=3*Scale;A.y:=0;B.x:=7*Scale;B.y:=0;end;
  140. with Ar[2]^ do Begin
  141. A.x:=-7*Scale;A.y:=0;B.x:=-7*Scale;B.y:=4*Scale-8*abs(SP)/5;end;
  142. with Ar[3]^ do Begin
  143. A.x:=7*Scale;A.y:=0;B.x:=7*Scale;B.y:=-4*Scale+8*abs(SP)/5;end;
  144. with Ar[4]^ do Begin
  145. A.x:=-4*Scale;A.y:=0;B.x:=-4*Scale;B.y:=-8*Scale+11*abs(SP)/5;end;
  146. with Ar[5]^ do Begin
  147. A.x:=4*Scale;A.y:=0;B.x:=4*Scale;B.y:=3*Scale-11*abs(SP)/5;end;
  148. End;{CMan.CreateMan}
  149. {--------------------}
  150. Constructor CMan.Init;
  151. var i : byte;
  152. begin
  153. Heading := Ang;
  154. oType := 'Man';
  155. Name := aName;
  156. Color := aCol;
  157. Scale := aScale;
  158. POS.X := cx;
  159. POS.Y := cy;
  160. Mood := MOOD_STOP;
  161. MaxSpeed := 10;MaxAccel := 5;
  162. Speed.X:=0;Speed.Y:=0;Accel.X:=0;Accel.Y:=0;
  163. for i:=0 to 5 do New(Model[i]);
  164. CreateMan(Model,0);
  165. RotateArray(Model,5,Heading);
  166. with DefBounds do begin A.X:=-3*Scale;A.Y:=-3*Scale;B.X:=3*Scale;b.Y:=3*Scale;end;
  167. SetBounds(Model,5,Bounds,DefBounds);
  168. NewMove := 0;
  169. end; {CMan.Init}
  170. {---------------}
  171. Procedure CMan.Rotate;
  172. Begin
  173. Heading := Heading + aAng;
  174. If Heading > 360 then Heading := Heading - 360;
  175. If Heading < 0 then Heading := Heading + 360;
  176. RotateVec(Speed,aAng);
  177. RotateVec(Accel,aAng);
  178. RotateArray(Model,5,aAng);
  179. { SetBounds(Model,5,Bounds,DefBounds);}
  180. End;{CMan.Rotate}
  181. {-------------------}
  182. Procedure CMan.SetSpeed;
  183. begin
  184. if aNewSpeed <> 0 then if Mood = MOOD_STOP then Mood:=MOOD_WALK;
  185. if aNewSpeed > MaxSpeed then aNewSpeed := MaxSpeed;
  186. Speed.X := aNewSpeed * cos(PI*Heading/180+PI/2);
  187. Speed.Y := aNewSpeed * sin(PI*Heading/180+PI/2);
  188. end;{CMan.SetSpeed}
  189. {-------------------}
  190. Procedure CMan.SetAccel;
  191. begin
  192. if aNewAccel > 0 then Mood:=MOOD_ACCEL
  193. else if aNewAccel < 0 then Mood := MOOD_BRAKING;
  194. if aNewAccel > MaxAccel then aNewAccel := MaxAccel;
  195. Accel.X := aNewAccel * cos(PI*Heading/180+PI/2);
  196. Accel.Y := aNewAccel * sin(PI*Heading/180+PI/2);
  197. end;{CMan.SetSpeed}
  198. {-------------------}
  199. Procedure CMan.Step;
  200. Begin
  201. POS.X := POS.X + Speed.X;
  202. POS.Y := POS.Y + Speed.Y;
  203. StepPos := StepPos + Len(Speed)*0.4;
  204. while StepPos > 10*Scale do StepPos:=StepPos-10*Scale;
  205. If StepPos > 5*Scale then StepPos:=StepPos-10*Scale;
  206. CreateMan(Model,StepPos);
  207. RotateArray(Model,5,Heading);
  208. if NewMove <> 0 then Dec(NewMove);
  209. if NewMove = 1 then
  210. begin
  211. NewMove := random(40)+2;
  212. Rotate(360*random-180);
  213. SetAccel(MaxAccel*random - MaxAccel/2);
  214. end;
  215. Speed.X := Speed.X + Accel.X;
  216. Speed.Y := Speed.Y + Accel.Y;
  217. if Len(Speed) > MaxSpeed then SetSpeed(MaxSpeed*random);
  218. if Len(Speed) < 0.001 then SetAccel(MaxAccel*random - MaxAccel/2);
  219. if (Pos.X > 630) and (Speed.X > 0) then Pos.X := 10;
  220. if (Pos.X < 10) and (Speed.X < 0) then Pos.X := 630;
  221. if (Pos.Y > 470) and (Speed.Y > 0) then Pos.Y:=10;
  222. if (Pos.Y < 10) and (Speed.Y < 0) then Pos.Y:=470;
  223. end; {CMan.Step}
  224. {-------------------}
  225. Procedure CMan.Draw;
  226. var i:byte;
  227. Begin
  228. SetColor(Color);
  229. Circle(ROUND(POS.X),Round(480-POS.Y),Round(3*Scale));
  230. for i := 0 to 5 do
  231. begin
  232. Line(ROUND(POS.X+Model[I]^.A.X), ROUND(480-(POS.Y+Model[I]^.A.Y)),
  233. ROUND(POS.X+Model[I]^.B.X), ROUND(480-(POS.Y+Model[I]^.B.Y)));
  234. end;
  235. End; {CMan.Draw}
  236. {-------------------}
  237. Procedure CMan.Clear;
  238. begin
  239. Bar(ROUND(POS.X+Bounds.A.X)+1, ROUND(480-(POS.Y+Bounds.A.Y))-1,
  240. ROUND(POS.X+Bounds.B.X)-1, ROUND(480-(POS.Y+Bounds.B.Y))+1);
  241. end;{CMAn.Clear}
  242. {-------------------}
  243. Destructor CMan.Destroy;
  244. var i:byte;
  245. begin
  246. for i := 0 to 5 do Dispose(Model[i]);
  247. end;{CMan.Destroy}
  248. {-------------------}
  249. {/CMan}
  250. {CHouse}
  251. Constructor Chouse.Init; begin end;
  252. Procedure CHouse.SetDoor; begin end;
  253. Procedure CHouse.Draw;begin end;
  254. {/CHouse}
  255. END.