demo03.pas 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. program demo03;
  2. {$I zglCustomConfig.cfg}
  3. {$I zgl_config.cfg}
  4. // RU: Включите KEYBOARD_OLD_FUNCTION в zgl_config.cfg, если хотите использовать старые функции клавиатуры.
  5. // С введением Green Engine - они стали не актуальны, но я их пока оставляю.
  6. // EN: Enable KEYBOARD_OLD_FUNCTION in zgl_config.cfg if you want to use the old keyboard functions.
  7. // With the introduction of the Green Engine - they are no longer relevant, but I leave them for now.
  8. uses
  9. {$IFDEF UNIX}
  10. cthreads,
  11. {$ENDIF}
  12. zgl_screen,
  13. zgl_window,
  14. zgl_timers,
  15. zgl_mouse,
  16. zgl_keyboard,
  17. zgl_joystick,
  18. zgl_primitives_2d,
  19. zgl_render_2d,
  20. zgl_font,
  21. zgl_text,
  22. zgl_textures_png,
  23. zgl_types,
  24. {$IfDef KEYBOARD_OLD_FUNCTION}
  25. zgl_collision_2d,
  26. {$Else}
  27. gegl_VElements,
  28. gegl_utils,
  29. // Rus: Включите Define USE_VKEYBOARD в zgl_config.cfg если хотите попробовать использовать виртуальную клавиатуру.
  30. // Eng: Enable Define USE_VKEYBOARD in zgl_config.cfg if you want to try using the virtual keyboard.
  31. {$IfDef USE_VKEYBOARD}
  32. gegl_draw_gui,
  33. gegl_menu_gui,
  34. {$EndIf}
  35. {$EndIf}
  36. gegl_color,
  37. zgl_utils
  38. ;
  39. var
  40. dirRes : UTF8String {$IFNDEF MACOSX} = '../data/' {$ENDIF};
  41. // Rus: номера шрифтов. Вся работа со шрифтами происходит именно от этих номеров.
  42. // Eng: font numbers. All work with fonts comes from these numbers.
  43. fntMain, fntEdit: LongWord;
  44. // Rus: номер цвета. Работа с цветом происходит именно от этого номера.
  45. // Eng: color number. Work with color comes from this number.
  46. EditColor: LongWord;
  47. joyCount : Integer;
  48. // RU: строка для получения значения из поля ввода
  49. // EN: string to get value from input field
  50. userInput : UTF8String;
  51. {$IfDef KEYBOARD_OLD_FUNCTION}
  52. trackInput : Boolean;
  53. inputRect : zglTRect;
  54. lineAlpha : LongWord;
  55. TimeStart : LongWord;
  56. {$Else}
  57. // RU: прямоугольник описывающий поле ввода
  58. // EN: rectangle describing the input field
  59. myRect: zglTRect2D;
  60. // "перепись" полей ввода для того, чтоб знать с каким полем работаем.
  61. // RU: объявляем переменную для работы с полем ввода
  62. // EN: we declare a variable to work with the input field
  63. myEdit, myEdit2: LongWord;
  64. // RU: прорисовываем основание поля ввода. Всё ограничено только вашим воображением. )))
  65. // EN: draw the base of the input field. Everything is limited only by your imagination. )))
  66. procedure EditCont;
  67. begin
  68. // RU: при прорисовке поля ввода, смешениt и поворот уже будут сделаны. Я показываю как нарисовать рамку.
  69. // Текст будет выведен поверх того, что вы здесь нарисуете.
  70. // EN: displacement and rotation will be done prior to performing the procedure. I am showing you how to draw a frame.
  71. // The text will be drawn on top of what you draw here.
  72. pr2d_Rect(- 2, - 1, myRect.W + 5, myRect.H, cl_White, PR2D_FILL);
  73. end;
  74. {$EndIf}
  75. procedure Init;
  76. {$IfNDef KEYBOARD_OLD_FUNCTION}
  77. var
  78. EScale: LongWord;
  79. {$EndIf}
  80. begin
  81. fntMain := font_LoadFromFile( dirRes + 'font.zfi' );
  82. {$IfNDef KEYBOARD_OLD_FUNCTION}
  83. // RU: Загружаем данные о шрифте.
  84. // EN: Load the font.
  85. fntEdit := font_LoadFromFile( dirRes + 'CalibriBold50pt.zfi');
  86. {$IfDef USE_VKEYBOARD}
  87. //------------------------------------------------------------------------------
  88. // RU: Данные для виртуальной клавиатуры. Раскомментируйте, если будете использовать виртуальную клавиатуру для ПК.
  89. // EN: Data for the virtual keyboard. Uncomment if you will use the virtual keyboard for PC.
  90. // обязательный код! Данные для отображения клавиатуры.
  91. // RU: Загружаем данные о шрифте.
  92. // EN: Load the font.
  93. fontUse := font_LoadFromFile(dirRes + 'CalibriBold50pt.zfi');
  94. JoyArrow := tex_LoadFromFile(dirRes + 'arrow.png'); // загрузили текстуру
  95. tex_SetFrameSize(JoyArrow, 64, 64); // и разбили её на части, но в записях не будет указано количество полученных текстур
  96. // RU: Данные для виртуальной клавиатуры.
  97. // EN: Data for the virtual keyboard.
  98. txt_LoadFromFile(dirRes + 'Rus.txt', LoadText);
  99. // RU: Создаём виртуальную клавиатуру. Для мобильных систем это будет обязательным кодом в дальнейшем.
  100. // EN: We create a virtual keyboard. For mobile systems, this will be a mandatory code in the future.
  101. CreateTouchKeyboard;
  102. // RU: здесь данные для виртуальной клавиатуры заканчиваются.
  103. // EN: here the data for the virtual keyboard ends.
  104. //------------------------------------------------------------------------------
  105. {$EndIf}
  106. // RU: устанавливаем размеры шрифтов
  107. // EN: set font sizes
  108. setFontTextScale(15, fntMain);
  109. setFontTextScale(20, fntEdit);
  110. // RU: размер шрифта поля ввода (для понимания что происходит). Изменяя размер шрифта, мы должны менять и
  111. // размеры поля ввода - myRect в данном случае. Сами они не изменятся.
  112. // EN: the font size of the input field (to understand what's going on). By changing the font size,
  113. // we must also change the size of the input field - myRect in this case. They themselves will not change.
  114. EScale := 20;
  115. setFontTextScale(EScale, fntEdit);
  116. // RU: указываем размеры поля ввода
  117. // EN: specify the size of the input field
  118. myRect.X := 200;
  119. myRect.Y := 150;
  120. myRect.W := 200;
  121. myRect.H := 33;
  122. // RU: указываем точку вращения, в данном случае центр поля ввода (по необходимости) и угол поворота (например 45)
  123. // EN: specify the point of rotation, in this case the center of the input field (if necessary) and the angle of rotation (for example 45)
  124. SetOfRotateAngleAndPoint(myRect.x + myRect.W / 2, myRect.y + myRect.H / 2, 30);
  125. // RU: указываем цвет текста (добавляем новый номер цвета, хотя данная функция вам возвратит цвет, если он уже был прописан).
  126. // EN: specify the color of the text (we add a new color number, although this function will return the color to you if it
  127. // has already been assigned).
  128. EditColor := Color_FindOrAdd($208055FF);
  129. // Ru: устанавливаем цвета по умолчанию для всех элементов API. Эти цвета будут задействованы только при создании
  130. // определённого элемента. Для изменения цвета в самом (уже созданном) элементе, ни чего не прилагается.
  131. // Дальнейшие измениня этих значений цвета, ни как не скажется на уже созданных элементах.
  132. // En: set default colors for all API elements. These colors will only be used when creating a specific element.
  133. // To change the color in the (already created) element itself, nothing is attached. Further changes to these
  134. // color values will not affect the already created elements in any way.
  135. SetDefColor(EditColor, cl_Green, cl_Black);
  136. // RU: создаём само поле ввода с данными указанными выше и передаваемыми данными
  137. // EN: create the input field itself with the data specified above and the data that needs to be transferred
  138. myEdit := CreateEdit(myRect, fntEdit, EScale, @EditCont);
  139. // RU: корректируем курсор
  140. // EN: adjust the cursor
  141. CorrectEditCursor(myEdit, 2);
  142. // RU: задаём очистку экрана заданным цветом
  143. // EN: set the screen to clear with a specified color
  144. scr_SetClearColor(true, $7090af);
  145. {$Else}
  146. inputRect.X := 400 - 192;
  147. inputRect.Y := 300 - 100 - 32;
  148. inputRect.W := 384;
  149. inputRect.H := 96;
  150. setFontTextScale(15, fntMain);
  151. {$EndIf}
  152. // RU: Инициализируем обработку ввода джойстиков и получаем количество подключенных джойстиков.
  153. // EN: Initialize processing joystick input and get count of plugged joysticks.
  154. joyCount := joy_Init();
  155. end;
  156. procedure Draw;
  157. {$IfDef KEYBOARD_OLD_FUNCTION}
  158. var
  159. w : Single;
  160. {$EndIf}
  161. begin
  162. batch2d_Begin;
  163. // Ru: балуемся цветом шрифта.
  164. // En: indulge in the color of the font.
  165. setTextColor(Get_Color(cl_Blue));
  166. text_Draw( fntMain, 0, 0, 'Escape - Exit' );
  167. setTextColor(Get_Color(cl_White));
  168. // RU: Координаты мыши можно получить при помощи функций mouse_X и mouse_Y.
  169. // EN: Mouse coordinates can be got using functions mouse_X and mouse_Y.
  170. text_Draw( fntMain, 0, 18, 'Mouse X, Y: ' + u_IntToStr( mouseX ) + '; ' + u_IntToStr( mouseY ) );
  171. {$IfDef KEYBOARD_OLD_FUNCTION}
  172. // RU: Выводим введённый пользователем текст.
  173. // EN: Show the inputted text.
  174. pr2d_Rect( inputRect.X, inputRect.Y, inputRect.W, inputRect.H, $FFFFFF, 255 );
  175. if trackInput Then
  176. begin
  177. text_Draw( fntMain, 400, 300 - 100, 'Press Enter to stop track text input:', TEXT_HALIGN_CENTER );
  178. w := text_GetWidth( fntMain, userInput );
  179. pr2d_Rect( 400 + w / 2 + 2, 300 - 70, 10, 20, $FFFFFF, lineAlpha, PR2D_FILL );
  180. end else
  181. text_Draw( fntMain, 400, 300 - 100, 'Click here to enter text(maximum - 24 symbols):', TEXT_HALIGN_CENTER );
  182. text_Draw( fntMain, 400, 300 - 70, userInput, TEXT_HALIGN_CENTER );
  183. {$Else}
  184. text_Draw(fntMain, 0, 36, 'Press F5 to copy from Edit and draw'); // какой я нафиг англичанин? ))))
  185. text_Draw(fntMain, 0, 54, 'Press F12 - Rus/Eng');
  186. if userInput <> '' then
  187. text_Draw(fntMain, 400, 300 - 70, userInput, TEXT_HALIGN_CENTER);
  188. {$EndIf}
  189. // RU: Вывод состояния осей и кнопок первого джойстика в системе.
  190. // EN: Show the state of axes and buttons of first joystick in the system.
  191. text_Draw( fntMain, 400, 360, 'JOYSTICK ( Found: ' + u_IntToStr( joyCount ) + ' )', TEXT_HALIGN_CENTER );
  192. setTextColor(Get_Color(cl_Black));
  193. text_Draw( fntMain, 100, 400, 'Axis X: ' + u_FloatToStr( joy_AxisPos( 0, JOY_AXIS_X ) ) );
  194. text_Draw( fntMain, 100, 420, 'Axis Y: ' + u_FloatToStr( joy_AxisPos( 0, JOY_AXIS_Y ) ) );
  195. setTextColor(Get_Color(cl_Black05));
  196. text_Draw( fntMain, 100, 440, 'Axis Z: ' + u_FloatToStr( joy_AxisPos( 0, JOY_AXIS_Z ) ) );
  197. setTextColor(Get_Color(cl_Green));
  198. text_Draw( fntMain, 100, 460, 'Axis R: ' + u_FloatToStr( joy_AxisPos( 0, JOY_AXIS_R ) ) );
  199. text_Draw( fntMain, 100, 480, 'Axis U: ' + u_FloatToStr( joy_AxisPos( 0, JOY_AXIS_U ) ) );
  200. setTextColor(Get_Color(cl_Green05));
  201. text_Draw( fntMain, 100, 500, 'Axis V: ' + u_FloatToStr( joy_AxisPos( 0, JOY_AXIS_V ) ) );
  202. text_Draw( fntMain, 100, 520, 'POVX: ' + u_FloatToStr( joy_AxisPos( 0, JOY_POVX ) ) );
  203. text_Draw( fntMain, 100, 540, 'POVY: ' + u_FloatToStr( joy_AxisPos( 0, JOY_POVY ) ) );
  204. setTextColor(Get_Color(cl_Red05));
  205. text_Draw( fntMain, 400, 400, 'Button1: ' + u_BoolToStr( joy_Down( 0, 0 ) ) );
  206. text_Draw( fntMain, 400, 420, 'Button2: ' + u_BoolToStr( joy_Down( 0, 1 ) ) );
  207. text_Draw( fntMain, 400, 440, 'Button3: ' + u_BoolToStr( joy_Down( 0, 2 ) ) );
  208. text_Draw( fntMain, 400, 460, 'Button4: ' + u_BoolToStr( joy_Down( 0, 3 ) ) );
  209. text_Draw( fntMain, 400, 480, 'Button5: ' + u_BoolToStr( joy_Down( 0, 4 ) ) );
  210. text_Draw( fntMain, 400, 500, 'Button6: ' + u_BoolToStr( joy_Down( 0, 5 ) ) );
  211. text_Draw( fntMain, 400, 520, 'Button7: ' + u_BoolToStr( joy_Down( 0, 6 ) ) );
  212. text_Draw( fntMain, 400, 540, 'Button8: ' + u_BoolToStr( joy_Down( 0, 7 ) ) );
  213. text_Draw( fntMain, 550, 400, 'Button9: ' + u_BoolToStr( joy_Down( 0, 8 ) ) );
  214. text_Draw( fntMain, 550, 420, 'Button10: ' + u_BoolToStr( joy_Down( 0, 9 ) ) );
  215. text_Draw( fntMain, 550, 440, 'Button11: ' + u_BoolToStr( joy_Down( 0, 10 ) ) );
  216. text_Draw( fntMain, 550, 460, 'Button12: ' + u_BoolToStr( joy_Down( 0, 11 ) ) );
  217. text_Draw( fntMain, 550, 480, 'Button13: ' + u_BoolToStr( joy_Down( 0, 12 ) ) );
  218. text_Draw( fntMain, 550, 500, 'Button14: ' + u_BoolToStr( joy_Down( 0, 13 ) ) );
  219. text_Draw( fntMain, 550, 520, 'Button15: ' + u_BoolToStr( joy_Down( 0, 14 ) ) );
  220. text_Draw( fntMain, 550, 540, 'Button16: ' + u_BoolToStr( joy_Down( 0, 15 ) ) );
  221. batch2d_End;
  222. end;
  223. {$IfDef KEYBOARD_OLD_FUNCTION}
  224. procedure Timer;
  225. begin
  226. if lineAlpha > 5 Then
  227. DEC( lineAlpha, 10 )
  228. else
  229. lineAlpha := 255;
  230. end;
  231. {$EndIf}
  232. procedure KeyMouseEvent;
  233. begin
  234. {$IfDef KEYBOARD_OLD_FUNCTION}
  235. // RU: Проверить нажата ли левая кнопка мыши в пределах inputRect и начать отслеживать ввод текста.
  236. // EN: Check if left mouse button was pressed inside inputRect and start to track text input.
  237. if mouseBClick( M_BLEFT ) and col2d_PointInRect( mouseX, mouseY, inputRect ) Then
  238. begin
  239. trackInput := TRUE;
  240. key_BeginReadText( userInput, 24 );
  241. end;
  242. // RU: Если был нажат Enter прекращаем отслеживать ввод текста.
  243. // EN: Finish to track text input if Enter was pressed.
  244. if key_Press( K_ENTER ) Then
  245. begin
  246. trackInput := FALSE;
  247. key_EndReadText();
  248. end;
  249. // RU: Получаем введённый пользователем текст.
  250. // EN: Get inputted by user text.
  251. if trackInput Then
  252. userInput := key_GetText();
  253. {$Else}
  254. // RU: по нажатию F5 копируем то, что написано в поле ввода
  255. // EN: by pressing F5, copy what is written in the input field
  256. if keysDown[K_F5] then
  257. begin
  258. userInput := GetEditToText(myEdit);
  259. end;
  260. {$EndIf}
  261. end;
  262. Begin
  263. {$IfDef KEYBOARD_OLD_FUNCTION}
  264. TimeStart := timer_Add( @Timer, 16, t_Start );
  265. {$EndIf}
  266. zgl_Reg(SYS_EVENTS, @KeyMouseEvent);
  267. zgl_Reg( SYS_LOAD, @Init );
  268. zgl_Reg( SYS_DRAW, @Draw );
  269. wnd_SetCaption(utf8_Copy('03 - Input'));
  270. zgl_Init();
  271. End.