demo01.pas 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. program demo01;
  2. // RU: Этот файл содержит некоторые настройки(например использовать ли статическую компиляцию) и определения ОС под которую происходит компиляция.
  3. // EN: This file contains some options(e.g. whether to use static compilation) and defines of OS for which is compilation going.
  4. {$I zglCustomConfig.cfg}
  5. {$I zgl_config.cfg}
  6. {$I GLdefine.cfg}
  7. uses
  8. {$IFDEF UNIX}
  9. cthreads,
  10. {$ENDIF}
  11. {$IFDEF USE_ZENGL_STATIC}
  12. // RU: При использовании статической компиляции необходимо подключать модули ZenGL содержащие необходимый функционал.
  13. // EN: Using static compilation needs to use ZenGL units with needed functionality.
  14. zgl_window,
  15. zgl_screen,
  16. zgl_timers,
  17. zgl_utils,
  18. zgl_types,
  19. zgl_log
  20. {$ELSE}
  21. // RU: Используя ZenGL в качестве библиотеки(so, dll или dylib) нужен всего один заголовочный файл.
  22. // EN: Using ZenGL as a shared library(so, dll or dylib) needs only one header.
  23. // zglHeader
  24. {$ENDIF}
  25. ;
  26. var
  27. DirApp : UTF8String;
  28. DirHome : UTF8String;
  29. TimeStart : LongWord = 0;
  30. procedure Init;
  31. begin
  32. // RU: Тут можно выполнять загрузку основных ресурсов.
  33. // EN: Here can be loading of main resources.
  34. end;
  35. procedure Draw;
  36. begin
  37. // RU: Тут "рисуем" что угодно :)
  38. // EN: Here "draw" anything :)
  39. end;
  40. procedure Update( dt : Double );
  41. begin
  42. // RU: Эта функция наземенима для реализация плавного движения чего-либо, т.к. точность таймеров ограничена FPS.
  43. // EN: This function is the best way to implement smooth moving of something, because accuracy of timers are restricted by FPS.
  44. end;
  45. // RU: Пример использования таймера.
  46. // EN: An example of using a timer.
  47. procedure Timer;
  48. begin
  49. // RU: Будем в заголовке показывать количество кадров в секунду.
  50. // EN: Caption will show the frames per second.
  51. wnd_SetCaption( '01 - Initialization[ FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) + ' ]' );
  52. end;
  53. procedure KeyMouseEvent;
  54. begin
  55. // RU: Функция обработки клавиатуры, мыши, джойстика и тачпада. Все события связанные с ними очищаются после её обработки.
  56. // Все попытки обработать клавиатуру, мышь или тачпад в других функциях могут привести к непредвиденным ситуациям.
  57. // EN: Keyboard, mouse, joystick and touchpad handling function. All events associated with them are cleared after processing it.
  58. // Any attempt to handle the keyboard, mouse, or touchpad in other functions may lead to unexpected situations.
  59. end;
  60. procedure Quit;
  61. begin
  62. // RU: События которые надо произвести по завершению программы.
  63. // EN: Events to be performed at the end of the program.
  64. end;
  65. Begin
  66. (*
  67. // RU: Код ниже загружает библиотеку если статическая компиляция не используется.
  68. // EN: Code below loads a library if static compilation is not used.
  69. {$IFNDEF USE_ZENGL_STATIC}
  70. {$IFDEF LINUX}
  71. // RU: В GNU/Linux все библиотеки принято хранить в /usr/lib, поэтому libZenGL.so должна быть предварительно установлена.
  72. // Но zglLoad сначала проверить есть ли libZenGL.so рядом с исполняемым файлом.
  73. //
  74. // EN: In GNU/Linux all libraries placed in /usr/lib, so libZenGL.so must be installed before it will be used.
  75. // But zglLoad will check first if there is libZenGL.so near executable file.
  76. if not zglLoad( libZenGL ) Then exit;
  77. {$ENDIF}
  78. {$IFDEF WINDOWS}
  79. if not zglLoad( libZenGL ) Then exit;
  80. {$ENDIF}
  81. {$IFDEF DARWIN}
  82. // RU: libZenGL.dylib следует предварительно поместить в каталог MyApp.app/Contents/Frameworks/, где MyApp.app - Bundle вашего приложения.
  83. // Также следует упомянуть, что лог-файл будет создаваться в корневом каталоге поэтому либо отключайте его, либо указывайте свой путь и имя, как описано в справке.
  84. //
  85. // EN: libZenGL.dylib must be placed into this directory MyApp.app/Contents/Frameworks/, where MyApp.app - Bundle of your application.
  86. // Also you must know, that log-file will be created in root directory, so you must disable a log, or choose your own path and name for it. How to do this you can find in documentation.
  87. if not zglLoad( libZenGL ) Then exit;
  88. {$ENDIF}
  89. {$ENDIF}
  90. *)
  91. // RU: Для загрузки/создания каких-то своих настроек/профилей/etc. можно получить путь к домашенему каталогу пользователя, или к исполняемому файлу(не работает для GNU/Linux).
  92. // EN: For loading/creating your own options/profiles/etc. you can get path to user home directory, or to executable file(not works for GNU/Linux).
  93. DirApp := utf8_Copy( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  94. DirHome := utf8_Copy( PAnsiChar( zgl_Get( DIRECTORY_HOME ) ) );
  95. // RU: Устанавливаем интервал на обработку событий клавиатуры, мыши, тачпада. И регистрируем процедуру.
  96. // Вызывать zgl_SetEventInterval не обязательно. Значение 16 стоит по умолчанию.
  97. // EN: We set the interval for processing keyboard, mouse, touchpad events. And we register the procedure.
  98. // Calling zgl_SetEventInterval is optional. The default is 16.
  99. zgl_SetEventsInterval(16);
  100. zgl_Reg(SYS_EVENTS, @KeyMouseEvent);
  101. // RU: Создаем таймер с интервалом 1000мс.
  102. // EN: Create a timer with interval 1000ms.
  103. TimeStart := timer_Add( @Timer, 1000, t_Start );
  104. // RU: Регистрируем процедуру, что выполнится сразу после инициализации ZenGL.
  105. // EN: Register the procedure, that will be executed after ZenGL initialization.
  106. zgl_Reg( SYS_LOAD, @Init );
  107. // RU: Регистрируем процедуру, где будет происходить рендер.
  108. // EN: Register the render procedure.
  109. zgl_Reg( SYS_DRAW, @Draw );
  110. // RU: Регистрируем процедуру, которая будет принимать разницу времени между кадрами.
  111. // EN: Register the procedure, that will get delta time between the frames.
  112. zgl_Reg( SYS_UPDATE, @Update );
  113. // RU: Регистрируем процедуру, которая выполнится после завершения работы ZenGL.
  114. // EN: Register the procedure, that will be executed after ZenGL shutdown.
  115. zgl_Reg( SYS_EXIT, @Quit );
  116. // RU: Устанавливаем заголовок окна.
  117. // EN: Set the caption of the window.
  118. wnd_SetCaption(utf8_Copy('01 - Initialization'));
  119. // RU: Разрешаем курсор мыши.
  120. // EN: Allow to show the mouse cursor.
  121. wnd_ShowCursor( TRUE ); // по умолчанию стоит
  122. // RU: Указываем первоначальные настройки.
  123. // EN: Set screen options.
  124. zgl_SetParam(800, 600, false, false);
  125. {$IfNDef USE_MIN_OPENGL}
  126. // RU: Устанавливаем контекст OpenGL 3.3. Для этого надо отключить дефайн USE_MIN_OPENGL в GLdefine.cfg
  127. // EN: Setting context OpenGL 3.3. Disable "USE_MIN_OPENGL" in GLdefine.cfg
  128. SetGLVersionAndFlags(3, 3);
  129. {$EndIf}
  130. // RU: Инициализируем ZenGL.
  131. // EN: Initialize ZenGL.
  132. zgl_Init();
  133. End.