demo01.pas 8.1 KB

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