demo16.dpr 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. program demo16;
  2. // RU:  ýòîì ôàéëå êîíôèãóðàöèè ñîäåðæèòñÿ "îïöèÿ" USE_CHIPMUNK_STATIC äëÿ ñòàòè÷åñêîé êîìïèëÿöèè ñ Chipmunk
  3. // EN: This file contains "option" USE_CHIPMUNK_STATIC for static compilation with Chipmunk
  4. {$I zglCustomConfig.cfg}
  5. {$I zgl_config.cfg}
  6. {$R *.res}
  7. uses
  8. zglChipmunk,
  9. zgl_screen,
  10. zgl_window,
  11. zgl_timers,
  12. zgl_keyboard,
  13. zgl_mouse,
  14. zgl_textures,
  15. zgl_textures_png,
  16. zgl_render_2d,
  17. zgl_font,
  18. zgl_text,
  19. zgl_primitives_2d,
  20. zgl_math_2d,
  21. zgl_types,
  22. zgl_utils;
  23. var
  24. dirRes : UTF8String {$IFNDEF MACOSX} = '../data/' {$ENDIF};
  25. fntMain: LongWord;
  26. space : PcpSpace;
  27. bCount : Integer;
  28. Bodies : array of PcpBody;
  29. Shapes : array of PcpShape;
  30. TimePhisics: LongWord;
  31. // RU: Äîáàâèòü îáúåêò "øàð"
  32. // x, y - êîîðäèíàòû öåíòðà
  33. // mass - ìàññà
  34. // r - ðàäèóñ
  35. // e - êîýôôèöèåíò ýëàñòè÷íîñòè
  36. // u - êîýôôèöèåíò òðåíèÿ
  37. //
  38. // EN: Add new object "ball"
  39. // x, y - coordinates
  40. // mass - mass
  41. // r - radius
  42. // e - coefficient of restitution. (elasticity)
  43. // u - coefficient of friction
  44. procedure cpAddBall(x, y, r, mass, e, u: cpFloat);
  45. begin
  46. INC(bCount);
  47. SetLength(Bodies, bCount);
  48. SetLength(Shapes, bCount);
  49. Bodies[bCount - 1] := cpBodyNew(mass, cpMomentForCircle(mass, 0, r, cpvzero));
  50. Bodies[bCount - 1].p := cpv(x, y);
  51. cpSpaceAddBody(space, Bodies[bCount - 1]);
  52. Shapes[bCount - 1] := cpCircleShapeNew(Bodies[bCount - 1], r, cpvzero);
  53. Shapes[bCount - 1].e := e;
  54. Shapes[bCount - 1].u := u;
  55. cpSpaceAddShape(space, Shapes[bCount - 1]);
  56. end;
  57. // RU: Äîáàâèòü îáúåêò "êîðîáêà"
  58. // Ñõîæ ñ ïðîöåäóðîé cpAddBall ïî àðãóìåíòàì
  59. // x, y - êîîðäèíàòû öåíòðà
  60. // w, h - øèðèíà è âûñîòà
  61. //
  62. // EN: Add bew object "box"
  63. // Arguments are similar to arguments of procedure cpAddBall
  64. // x, y - coordinates of center
  65. // w, h - width and height
  66. procedure cpAddBox(x, y, w, h, mass, e, u: cpFloat);
  67. var
  68. points: array[0..3] of cpVect;
  69. f : cpFloat;
  70. begin
  71. INC(bCount);
  72. SetLength(Bodies, bCount);
  73. SetLength(Shapes, bCount);
  74. points[0].x := - w / 2;
  75. points[0].y := - h / 2;
  76. points[1].x := - w / 2;
  77. points[1].y := h / 2;
  78. points[2].x := w / 2;
  79. points[2].y := h / 2;
  80. points[3].x := w / 2;
  81. points[3].y := - h / 2;
  82. f := cpMomentForPoly(mass, 4, @points[0], cpvzero);
  83. Bodies[bCount - 1] := cpBodyNew(mass, f);
  84. Bodies[bCount - 1].p := cpv(x + w / 2, y + h / 2);
  85. cpSpaceAddBody(space, Bodies[bCount - 1]);
  86. Shapes[bCount - 1] := cpPolyShapeNew(Bodies[bCount - 1], 4, @points[0], cpvzero);
  87. Shapes[bCount - 1].e := e;
  88. Shapes[bCount - 1].u := u;
  89. cpSpaceAddShape(space, Shapes[bCount - 1]);
  90. end;
  91. procedure Init;
  92. var
  93. staticBody: PcpBody;
  94. ground : PcpShape;
  95. e, u : cpFloat;
  96. begin
  97. fntMain := font_LoadFromFile(dirRes + 'font.zfi');
  98. cpInitChipmunk();
  99. // RU: Ñîçäàåì íîâûé "ìèð".
  100. // EN: Create new world.
  101. space := cpSpaceNew();
  102. // RU: Çàäàåì êîëè÷åñòâî èòåðàöèé îáðàáîòêè(ðåêîìåíäóåòñÿ 10).
  103. // EN: Set count of iterations of processing(recommended is 10).
  104. space.iterations := 10;
  105. space.elasticIterations := 10;
  106. // RU: Çàäàåì ñèëó ãðàâèòàöèè.
  107. // EN: Set the gravity.
  108. space.gravity := cpv(1, 100);
  109. // RU: Çàäàåì êîýôôèöèåíò "çàòóõàíèÿ" äâèæåíèÿ îáúåêòîâ.
  110. // EN: Set the damping for moving of objects.
  111. space.damping := 0.99;
  112. e := 1;
  113. u := 0.9;
  114. // RU: Ñîçäàäèì ñòàòè÷íîå "òåëî".
  115. // EN: Create a static "body".
  116. staticBody := cpBodyNew(INFINITY, INFINITY);
  117. // RU: Äîáàâèì òðè îòðåçêà äëÿ îãðàíè÷åíèÿ ìèðà. Ïåðâûé ïàðàìåòð - óêàçàòåëü íà ñîçäàííîå òåëî, äâà ïîñëåäóþùèõ - êîîðäèíàòû òî÷åê îòðåçêà, ïîñëåäíèé - òîëùèíà îòðåçêà.
  118. // EN: Add three segments for restriction of world. First parameter - pointer of created body, next two - coordinates of segment points, the last one - width of segment.
  119. ground := cpSegmentShapeNew(staticBody, cpv(5, 0), cpv(5, 590), 1);
  120. ground.e := e;
  121. ground.u := u;
  122. cpSpaceAddStaticShape(space, ground);
  123. ground := cpSegmentShapeNew(staticBody, cpv(795, 0), cpv(795, 590), 1);
  124. ground.e := e;
  125. ground.u := u;
  126. cpSpaceAddStaticShape(space, ground);
  127. ground := cpSegmentShapeNew(staticBody, cpv(0, 590), cpv(800, 590), 1);
  128. ground.e := e;
  129. ground.u := u;
  130. cpSpaceAddStaticShape(space, ground);
  131. // RU: Äîáàâèì òðåóãîëüíèê.
  132. // EN: Add the triangle.
  133. staticBody := cpBodyNew(INFINITY, INFINITY);
  134. ground := cpSegmentShapeNew(staticBody, cpv(400, 300), cpv(200, 350), 1);
  135. ground.e := e;
  136. ground.u := u;
  137. cpSpaceAddStaticShape(space, ground);
  138. ground := cpSegmentShapeNew(staticBody, cpv(200, 350), cpv(700, 350), 1);
  139. ground.e := e;
  140. ground.u := u;
  141. cpSpaceAddStaticShape(space, ground);
  142. ground := cpSegmentShapeNew(staticBody, cpv(700, 350), cpv(400, 300), 1);
  143. ground.e := e;
  144. ground.u := u;
  145. cpSpaceAddStaticShape(space, ground);
  146. setFontTextScale(15, fntMain);
  147. end;
  148. procedure Draw;
  149. begin
  150. batch2d_Begin();
  151. // RU: Ðåíäåðèì îáúåêòû óêàçàííîãî "ìèðà". Âòîðîé àðãóìåíò ôóíêöèè îòâå÷àåò çà ïîêàç òî÷åê ñîïðèêîñíîâåíèÿ.
  152. // EN: Render objects for specified "world". Second argument responsible for rendering of collision points.
  153. cpDrawSpace(space, TRUE);
  154. text_Draw(fntMain, 10, 5, 'FPS: ' + u_IntToStr(zgl_Get(RENDER_FPS)));
  155. text_Draw(fntMain, 10, 25, 'Use your mouse: Left Click - box, Right Click - ball');
  156. batch2d_End();
  157. end;
  158. procedure KeyMouseEvent;
  159. begin
  160. // äâà âàðèàíòà ðàáîòû ñ ìûøüþ, ñòàòè÷åñêèé è äèíàìè÷åñêèé
  161. if (mouseAction[M_BLEFT].state and is_down) > 0 Then
  162. cpAddBox(mouseX - 10, mouseY - 10, 48, 32, 1, 0.5, 0.5);
  163. if mouseBClick(M_BRIGHT) Then
  164. cpAddBall(mouseX, mouseY, 16, 2, 0.5, 0.1);
  165. end;
  166. procedure Phisics;
  167. begin
  168. cpSpaceStep(space, 1 / zgl_Get(RENDER_FPS));
  169. end;
  170. procedure Quit;
  171. begin
  172. // íå ÷åãî íàäåÿòñÿ, ÷òî äèíàìè÷åñêèå ìàññèâû ñàìè ñåáÿ îñâîáîäÿò
  173. Bodies := nil;
  174. Shapes := nil;
  175. // RU: Î÷èñòêà îáúåêòîâ è "ìèðà".
  176. // EN: Free objects and "world".
  177. cpSpaceFreeChildren(space);
  178. cpSpaceFree(space);
  179. end;
  180. Begin
  181. randomize();
  182. {$IFNDEF USE_CHIPMUNK_STATIC}
  183. if not cpLoad(libChipmunk) Then exit;
  184. {$ENDIF}
  185. TimePhisics := timer_Add(@Phisics, 16, t_Start);
  186. zgl_Reg(SYS_EVENTS, @KeyMouseEvent);
  187. zgl_Reg(SYS_LOAD, @Init);
  188. zgl_Reg(SYS_DRAW, @Draw);
  189. zgl_Reg(SYS_EXIT, @Quit);
  190. wnd_SetCaption(utf8_Copy('16 - Physics Simple'));
  191. zgl_Init();
  192. End.