Difference between revisions of "ZenGL Tutorial/ru"

From Lazarus wiki
Jump to navigationJump to search
m (added index)
m (Fixed syntax highlighting; deleted category included in page template)
 
(9 intermediate revisions by 5 users not shown)
Line 17: Line 17:
 
Откройте "''Project > Project Options''". В "''Compiler Options > Paths''" добавьте путь к "''Other Unit Files''":
 
Откройте "''Project > Project Options''". В "''Compiler Options > Paths''" добавьте путь к "''Other Unit Files''":
  
<delphi>headers
+
<syntaxhighlight lang=pascal>headers
 
extra
 
extra
 
src
 
src
Line 24: Line 24:
 
lib\msvcrt\$(TargetCPU)
 
lib\msvcrt\$(TargetCPU)
 
lib\ogg\$(TargetCPU)-$(TargetOS)
 
lib\ogg\$(TargetCPU)-$(TargetOS)
lib\zlib\$(TargetCPU)-$(TargetOS)</delphi>
+
lib\zlib\$(TargetCPU)-$(TargetOS)</syntaxhighlight>
 +
 
 +
== Сборка ==
 +
 
 +
Приложение можно собрать с ZenGL статически либо с использованием динамических библиотек (so/dll/dylib).
 +
 
 +
Подробнее можно прочесть в [http://zengl.org/wiki/doku.php?id=compilation compilation] на [http://zengl.org/wiki/ ZenGL Wiki].
 +
 
 +
Статическая сборка:
 +
<syntaxhighlight lang=pascal>{$DEFINE STATIC}</syntaxhighlight>
 +
Сборка с использованием загружаемых библиотек:
 +
<syntaxhighlight lang=pascal>//{$DEFINE STATIC}</syntaxhighlight>
 +
 
 +
==== Windows DLL ====
 +
 
 +
Откройте "''src\Lazarus\ZenGL.lpi''" а потом: "''Run > Compile (Ctrl + F9)''".
 +
 
 +
После,  в директории "''src\''" вы можете увидеть файл "''ZenGL.dll''": скопируйте его в директорию "''bin\i386''"
 +
При использовании динамической линковки, вам придется постоянно копировать DLL в выходную директорию проекта.
 +
 
 +
== Первая программа ==
 +
Сперва, создайте новое приложение Free Pascal ("Free Pascal Program"), измените пути к исходным кодам, как было указано выше.
 +
Также, смените ''Syntax Mode'' в '' Project > Project Options > Compiler Options > Parsing'' на ''Delphi (-Mdelphi)''.
 +
Запомните: если вы используете динамическую линковку (so/dll/dylib), скопируйте необходимые библиотеки в директорию выполнения программы.
 +
 
 +
Добавьте ресурсы, назовите программу:
 +
<syntaxhighlight lang=pascal>program demo01;
 +
 
 +
{$R *.res}</syntaxhighlight>
 +
 
 +
Выберите режим компиляции, для использования so/dll/dylib:
 +
<syntaxhighlight lang=pascal>{$DEFINE STATIC}</syntaxhighlight>
 +
 
 +
Добавьте модули ZenGL.
 +
<syntaxhighlight lang=pascal>uses
 +
  {$IFNDEF STATIC}
 +
  zglHeader
 +
  {$ELSE}
 +
  zgl_main,
 +
  zgl_screen,
 +
  zgl_window,
 +
  zgl_timers,
 +
  zgl_utils
 +
  {$ENDIF}
 +
  ;</syntaxhighlight>
 +
 
 +
Задаем переменные:
 +
<syntaxhighlight lang=pascal>
 +
var
 +
  DirApp  : String;
 +
  DirHome : String;</syntaxhighlight>
 +
 
 +
...Процедуры::
 +
<syntaxhighlight lang=pascal>procedure Init;
 +
begin
 +
  // Загрузка основных ресурсов
 +
end;
 +
 
 +
procedure Draw;
 +
begin
 +
  // Рисуем то, что необходимо нам
 +
end;
 +
 
 +
procedure Update( dt : Double );
 +
begin
 +
  // Эта функция - лучший метод для реализации плавного движения
 +
end;
 +
 
 +
procedure Timer;
 +
begin
 +
  // Заголовок будет показывать количество кадров в секунду.
 +
  wnd_SetCaption( '01 - Initialization[ FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) + ' ]' );
 +
end;
 +
 
 +
procedure Quit;
 +
begin
 +
//
 +
end;</syntaxhighlight>
 +
 
 +
Вот начало программы:
 +
<syntaxhighlight lang=pascal>Begin
 +
  {$IFNDEF STATIC}
 +
  zglLoad( libZenGL );
 +
  {$ENDIF}
 +
  // Для загрузки/создания каких-то своих настроек/профилей/etc. можно получить путь к
 +
  // домашенему каталогу пользователя, или к исполняемому файлу(не работает для GNU/Linux).
 +
  DirApp  := u_CopyStr( PChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
 +
  DirHome := u_CopyStr( PChar( zgl_Get( DIRECTORY_HOME ) ) );
 +
 
 +
  // Создаем таймер с интервалом 1000мс.
 +
  timer_Add( @Timer, 1000 );
 +
 
 +
  // Регистрируем процедуру, что выполнится сразу после инициализации ZenGL.
 +
  zgl_Reg( SYS_LOAD, @Init );
 +
  // Регистрируем процедуру, где будет происходить рендер.
 +
  zgl_Reg( SYS_DRAW, @Draw );
 +
  // Регистрируем процедуру, которая будет принимать разницу времени между кадрами.
 +
  zgl_Reg( SYS_UPDATE, @Update );
 +
  // Регистрируем процедуру, которая выполнится после завершения работы ZenGL.
 +
  zgl_Reg( SYS_EXIT, @Quit );
 +
 
 +
  // Т.к. модуль сохранен в кодировке UTF-8 и в нем используются строковые переменные
 +
  // следует указать использование этой кодировки.
 +
  zgl_Enable( APP_USE_UTF8 );
 +
 
 +
  // Устанавливаем заголовок окна.
 +
  wnd_SetCaption( '01 - Initialization' );
 +
 
 +
  // Разрешаем курсор мыши.
 +
  wnd_ShowCursor( TRUE );
 +
 
 +
  // Указываем первоначальные настройки.
 +
  scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );
 +
 
 +
  // Инициализируем ZenGL.
 +
  zgl_Init();
 +
End.</syntaxhighlight> 
 +
 
 +
=== Результат ===
 +
 
 +
Наш результат -  ''шаблон'' для проектов ZenGL:
 +
<syntaxhighlight lang=pascal>program template;
 +
 
 +
{$DEFINE STATIC}
 +
 
 +
{$R *.res}
 +
 
 +
uses
 +
  {$IFNDEF STATIC}
 +
  zglHeader
 +
  {$ELSE}
 +
  zgl_main,
 +
  zgl_screen,
 +
  zgl_window,
 +
  zgl_timers,
 +
  zgl_utils
 +
  {$ENDIF}
 +
  ;
 +
 
 +
var
 +
  DirApp  : String; DirHome : String;
 +
 
 +
procedure Init;
 +
begin
 +
end;
 +
 
 +
procedure Draw;
 +
begin
 +
end;
 +
 
 +
procedure Update( dt : Double );
 +
begin
 +
end;
 +
 
 +
procedure Timer;
 +
begin
 +
  wnd_SetCaption( '01 - Initialization[ FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) + ' ]' );
 +
end;
 +
 
 +
procedure Quit;
 +
begin
 +
end;
 +
 
 +
Begin
 +
  {$IFNDEF STATIC}
 +
  zglLoad( libZenGL );
 +
  {$ENDIF}
 +
  DirApp  := u_CopyStr( PChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
 +
  DirHome := u_CopyStr( PChar( zgl_Get( DIRECTORY_HOME ) ) );
 +
  timer_Add( @Timer, 1000 );
 +
  zgl_Reg( SYS_LOAD, @Init );
 +
  zgl_Reg( SYS_DRAW, @Draw );
 +
  zgl_Reg( SYS_UPDATE, @Update );
 +
  zgl_Reg( SYS_EXIT, @Quit );
 +
  zgl_Enable( APP_USE_UTF8 );
 +
  wnd_SetCaption( '01 - Initialization' );
 +
  wnd_ShowCursor( TRUE );
 +
  scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );
 +
  zgl_Init();
 +
End.
 +
</syntaxhighlight>

Latest revision as of 12:31, 3 March 2020

Deutsch (de) English (en) español (es) français (fr) русский (ru)


ZenGL/ru | Tutorial 1 | Tutorial 2 | Tutorial 3 | Edit

Скачать

ZenGL для Linux, Windows и Mac можно скачать тут.

Установка

Для инсталляции достаточно распаковать скачанный архив в удобную директорию.

Настройка путей

Перед использованием модулей не забудьте добавить в пути к исходным кодам путь к исходникам ZenGL

Откройте "Project > Project Options". В "Compiler Options > Paths" добавьте путь к "Other Unit Files":

headers
extra
src
src\Direct3D
lib\jpeg\$(TargetCPU)-$(TargetOS)
lib\msvcrt\$(TargetCPU)
lib\ogg\$(TargetCPU)-$(TargetOS)
lib\zlib\$(TargetCPU)-$(TargetOS)

Сборка

Приложение можно собрать с ZenGL статически либо с использованием динамических библиотек (so/dll/dylib).

Подробнее можно прочесть в compilation на ZenGL Wiki.

Статическая сборка:

{$DEFINE STATIC}

Сборка с использованием загружаемых библиотек:

//{$DEFINE STATIC}

Windows DLL

Откройте "src\Lazarus\ZenGL.lpi" а потом: "Run > Compile (Ctrl + F9)".

После, в директории "src\" вы можете увидеть файл "ZenGL.dll": скопируйте его в директорию "bin\i386" При использовании динамической линковки, вам придется постоянно копировать DLL в выходную директорию проекта.

Первая программа

Сперва, создайте новое приложение Free Pascal ("Free Pascal Program"), измените пути к исходным кодам, как было указано выше. Также, смените Syntax Mode в Project > Project Options > Compiler Options > Parsing на Delphi (-Mdelphi). Запомните: если вы используете динамическую линковку (so/dll/dylib), скопируйте необходимые библиотеки в директорию выполнения программы.

Добавьте ресурсы, назовите программу:

program demo01;

{$R *.res}

Выберите режим компиляции, для использования so/dll/dylib:

{$DEFINE STATIC}

Добавьте модули ZenGL.

uses
  {$IFNDEF STATIC}
  zglHeader
  {$ELSE}
  zgl_main,
  zgl_screen,
  zgl_window,
  zgl_timers,
  zgl_utils
  {$ENDIF}
  ;

Задаем переменные:

var
  DirApp  : String;
  DirHome : String;

...Процедуры::

procedure Init;
begin
  // Загрузка основных ресурсов
end;

procedure Draw;
begin
  // Рисуем то, что необходимо нам
end;

procedure Update( dt : Double );
begin
  // Эта функция - лучший метод для реализации плавного движения
end;

procedure Timer;
begin
  // Заголовок будет показывать количество кадров в секунду.
  wnd_SetCaption( '01 - Initialization[ FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) + ' ]' );
end;

procedure Quit;
begin
 //
end;

Вот начало программы:

Begin
  {$IFNDEF STATIC}
  zglLoad( libZenGL );
  {$ENDIF}
  // Для загрузки/создания каких-то своих настроек/профилей/etc. можно получить путь к
  // домашенему каталогу пользователя, или к исполняемому файлу(не работает для GNU/Linux).
  DirApp  := u_CopyStr( PChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  DirHome := u_CopyStr( PChar( zgl_Get( DIRECTORY_HOME ) ) );

  // Создаем таймер с интервалом 1000мс.
  timer_Add( @Timer, 1000 );

  // Регистрируем процедуру, что выполнится сразу после инициализации ZenGL.
  zgl_Reg( SYS_LOAD, @Init );
  // Регистрируем процедуру, где будет происходить рендер.
  zgl_Reg( SYS_DRAW, @Draw );
  // Регистрируем процедуру, которая будет принимать разницу времени между кадрами.
  zgl_Reg( SYS_UPDATE, @Update );
  // Регистрируем процедуру, которая выполнится после завершения работы ZenGL.
  zgl_Reg( SYS_EXIT, @Quit );
  
  // Т.к. модуль сохранен в кодировке UTF-8 и в нем используются строковые переменные
  // следует указать использование этой кодировки.
  zgl_Enable( APP_USE_UTF8 );

  // Устанавливаем заголовок окна.
  wnd_SetCaption( '01 - Initialization' );

  // Разрешаем курсор мыши.
  wnd_ShowCursor( TRUE );

  // Указываем первоначальные настройки.
  scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );

  // Инициализируем ZenGL.
  zgl_Init();
End.

Результат

Наш результат - шаблон для проектов ZenGL:

program template;

{$DEFINE STATIC}

{$R *.res}

uses
  {$IFNDEF STATIC}
  zglHeader
  {$ELSE}
  zgl_main,
  zgl_screen,
  zgl_window,
  zgl_timers,
  zgl_utils
  {$ENDIF}
  ;

var
  DirApp  : String; DirHome : String;

procedure Init;
begin
end;

procedure Draw;
begin
end;

procedure Update( dt : Double );
begin
end;

procedure Timer;
begin
  wnd_SetCaption( '01 - Initialization[ FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) + ' ]' );
end;

procedure Quit;
begin
end;

Begin
  {$IFNDEF STATIC}
  zglLoad( libZenGL );
  {$ENDIF}
  DirApp  := u_CopyStr( PChar( zgl_Get( DIRECTORY_APPLICATION ) ) );
  DirHome := u_CopyStr( PChar( zgl_Get( DIRECTORY_HOME ) ) );
  timer_Add( @Timer, 1000 );
  zgl_Reg( SYS_LOAD, @Init );
  zgl_Reg( SYS_DRAW, @Draw );
  zgl_Reg( SYS_UPDATE, @Update );
  zgl_Reg( SYS_EXIT, @Quit );
  zgl_Enable( APP_USE_UTF8 );
  wnd_SetCaption( '01 - Initialization' );
  wnd_ShowCursor( TRUE );
  scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );
  zgl_Init();
End.