demo16.lpr 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // RU: ВНИМАНИЕ! Т.к. на данный момент Chipmunk собран с soft float - производительность довольно низкая.
  2. // EN: WARNING! Chipmunk is built with soft float and because of this performance is not good.
  3. library demo16;
  4. {$I zglCustomConfig.cfg}
  5. {$I zgl_config.cfg}
  6. uses
  7. zgl_application,
  8. zgl_file,
  9. zgl_screen,
  10. zgl_window,
  11. zgl_timers,
  12. zgl_mouse,
  13. zgl_touch,
  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. zglChipmunk,
  22. zgl_utils;
  23. var
  24. dirRes : UTF8String = 'assets/';
  25. fntMain : LongWord;
  26. space : PcpSpace;
  27. bCount : Integer;
  28. Bodies : array of PcpBody;
  29. Shapes : array of PcpShape;
  30. balls : Boolean = false;
  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. zgl_Enable(CORRECT_RESOLUTION);
  98. scr_CorrectResolution(800, 600);
  99. file_OpenArchive(PAnsiChar(zgl_Get(DIRECTORY_APPLICATION)));
  100. fntMain := font_LoadFromFile(dirRes + 'font.zfi');
  101. file_CloseArchive();
  102. cpInitChipmunk();
  103. // RU: Создаем новый "мир".
  104. // EN: Create new world.
  105. space := cpSpaceNew();
  106. // RU: Задаем количество итераций обработки(рекомендуется 10).
  107. // EN: Set count of iterations of processing(recommended is 10).
  108. space^.iterations := 10;
  109. space^.elasticIterations := 10;
  110. // RU: Задаем силу гравитации.
  111. // EN: Set the gravity.
  112. space^.gravity := cpv(0, 256);
  113. // RU: Задаем коэффициент "затухания" движения объектов.
  114. // EN: Set the damping for moving of objects.
  115. space^.damping := 0.9;
  116. e := 1;
  117. u := 0.9;
  118. // RU: Создадим статичное "тело".
  119. // EN: Create a static "body".
  120. staticBody := cpBodyNew(INFINITY, INFINITY);
  121. // RU: Добавим три отрезка для ограничения мира. Первый параметр - указатель на созданное тело, два последующих - координаты точек отрезка, последний - толщина отрезка.
  122. // 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.
  123. ground := cpSegmentShapeNew(staticBody, cpv(5, 0), cpv(5, 590), 1);
  124. ground^.e := e;
  125. ground^.u := u;
  126. cpSpaceAddStaticShape(space, ground);
  127. ground := cpSegmentShapeNew(staticBody, cpv(795, 0), cpv(795, 590), 1);
  128. ground^.e := e;
  129. ground^.u := u;
  130. cpSpaceAddStaticShape(space, ground);
  131. ground := cpSegmentShapeNew(staticBody, cpv(0, 590), cpv(800, 590), 1);
  132. ground^.e := e;
  133. ground^.u := u;
  134. cpSpaceAddStaticShape(space, ground);
  135. // RU: Добавим треугольник.
  136. // EN: Add the triangle.
  137. staticBody := cpBodyNew(INFINITY, INFINITY);
  138. ground := cpSegmentShapeNew(staticBody, cpv(400, 300), cpv(200, 350), 1);
  139. ground^.e := e;
  140. ground^.u := u;
  141. cpSpaceAddStaticShape(space, ground);
  142. ground := cpSegmentShapeNew(staticBody, cpv(200, 350), cpv(700, 350), 1);
  143. ground^.e := e;
  144. ground^.u := u;
  145. cpSpaceAddStaticShape(space, ground);
  146. ground := cpSegmentShapeNew(staticBody, cpv(700, 350), cpv(400, 300), 1);
  147. ground^.e := e;
  148. ground^.u := u;
  149. cpSpaceAddStaticShape(space, ground);
  150. setFontTextScale(20, fntMain);
  151. end;
  152. procedure Draw;
  153. begin
  154. batch2d_Begin();
  155. // RU: Рендерим объекты указанного "мира". Второй аргумент функции отвечает за показ точек соприкосновения.
  156. // EN: Render objects for specified "world". Second argument responsible for rendering of collision points.
  157. cpDrawSpace(space, TRUE);
  158. text_Draw(fntMain, 10, 5, 'FPS: ' + u_IntToStr(zgl_Get(RENDER_FPS)));
  159. text_Draw(fntMain, 10, 25, 'Double tap to change the shape type');
  160. batch2d_End();
  161. end;
  162. procedure KeyMouseEvent;
  163. begin
  164. if touch_Click(0) Then
  165. begin
  166. if not balls Then
  167. begin
  168. cpAddBox(touch_X(0) - 10, touch_Y(0) - 10, 48, 32, 1, 0.5, 0.5);
  169. balls := not balls;
  170. end
  171. else begin
  172. cpAddBall(touch_X(0), touch_Y(0), 16, 1, 0.5, 0.9);
  173. balls := not balls;
  174. end;
  175. end;
  176. end;
  177. procedure Update(dt : Double);
  178. begin
  179. cpSpaceStep(space, 1 / (1000 / dt));
  180. end;
  181. procedure Restore;
  182. begin
  183. file_OpenArchive(PAnsiChar(zgl_Get(DIRECTORY_APPLICATION)));
  184. font_RestoreFromFile(fntMain, dirRes + 'font.zfi');
  185. file_CloseArchive();
  186. end;
  187. procedure Quit;
  188. begin
  189. // не надеемся, что массивы сами освободятся
  190. Bodies := nil;
  191. Shapes := nil;
  192. // RU: Очистка объектов и "мира".
  193. // EN: Free objects and "world".
  194. cpSpaceFreeChildren(space);
  195. cpSpaceFree(space);
  196. end;
  197. procedure Java_zengl_android_ZenGL_Main(var env; var thiz); cdecl;
  198. begin
  199. randomize();
  200. zgl_Reg(SYS_EVENTS, @KeyMouseEvent);
  201. zgl_Reg(SYS_LOAD, @Init);
  202. zgl_Reg(SYS_DRAW, @Draw);
  203. zgl_Reg(SYS_UPDATE, @Update);
  204. zgl_Reg(SYS_ANDROID_RESTORE, @Restore);
  205. zgl_Reg(SYS_EXIT, @Quit);
  206. scr_SetOptions();
  207. end;
  208. exports
  209. Java_zengl_android_ZenGL_Main,
  210. {$I android_export.inc}
  211. End.