ZenGL Tutorial/ru

From Lazarus wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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.