Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Прыгающая точка

Райский сад. Всюду деревья с сочными плодами. Знаменитости прогуливаются. Ангелы всюду порхают. Музыка нежная. В общем, рай. Поднимается лифт, оттуда выползает окровавленный DOOM'ер с BFG в руках, оглядывается вокруг и орет: "ХA-A-A-A-A!!!! BONUS LEVEL!!!!!!!!"

Прежде всего, определим сначала, какие навыки нам нужны, многие из вас изучали или изучаете язык программирования Pascal, именно с его помощью мы попробуем написать несколько программ. Сейчас почти все игры разрабатываются для Windows, так что нам придётся работать со средой Delphi. Программы в среде Delphi (Delphi не язык программирования) пишутся на языке Object Pascal, специальном диалекте Паскаля. От языка Pascal этот диалект отличается тем, что он имеет большое количество дополнительных возможностей. Также вам следует уметь работать хотя бы с одним графическим редактором, хотя бы с Paint. В следующих статьях мы рассмотрим ряд других возможностей, например, как создать движущийся объект с помощью программы AutoCAD или как создать множество визуальных эффектов: тень, отражение. В данной статье мы рассмотрим несколько самых аспектов: как с помощью точек нарисовать простой движущийся объект, как управлять объектами с помощью клавиатуры.

Сейчас графика для Windows программируется одним из двух средств: DirectX или OpenGL. Работать с DirectX пришлось бы с помощью языка C++, который является слишком громоздким для начинающего программиста, так что лучше использовать второе.

Если вы еще не работали с Delphi, рекомендую прочитать любую книгу на эту тему.

Сейчас нам предстоит сделать самый первый шаг, сделав который, вы сможете с уверенностью двигаться дальше. Для начала убедитесь, что вы установили Delphi пятую или четвертую версию этого пакета. Если у вас не установлен данный пакет, сделайте это как можно быстрее, так как без Delphi вы не сможете написать ни одной программы из книги.

Для начала мы рассмотрим очень простой пример графической программы. Она представляет собой квадрат, появляющийся в различных точках экрана. Причем, координаты будут определяться случайно.

Теперь перейдем непосредственно к программе.

  • Запустите среду разработки Delphi
  • Нанесите элемент управления Timer на форму
  • Переименуйте имя формы как frmGL
  • Вставьте программный код в событие таймера
  • Вы также можете получить этот проект из Интерната, посетив узел http://softmaker.narod.ru

procedure TfrmGL.Timer1Timer(Sender: TObject);

  procedure SetDCPixelFormat (hc : HDC);
  var
    pFormat : TPixelFormatDescriptor;
    Npixel : Integer;
  begin
    FillChar (pFormat, SizeOf (pFormat), 0);
    pFormat.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
    NPixel := ChoosePixelFormat (hc, @pFormat);
    SetPixelFormat (hc, NPixel, @pFormat);
  end;

var
  hc: HGLRC;
  x, y: real;
begin
  SetDCPixelFormat(Canvas.Handle);
  hc := wglCreateContext(Canvas.Handle);
  wglMakeCurrent(Canvas.Handle, hc);
  glViewPort (0, 0, ClientWidth, ClientHeight);
  glClearColor (0.1, 0.4, 0.65, 1.0);
  glClear (GL_COLOR_BUFFER_BIT);
  glPointSize (5);
  glColor3f (1.0, 0.4, 0.5);
  y:=random;
  y:=round(y*100);
  y:=y/100;
  x:=random;
  x:=round(x*100);
  x:=x/100;
  glVertex2f (x, y);
  glEnd;
  SwapBuffers(Canvas.Handle);
  wglMakeCurrent(0, 0);
end;

Строки 16-18.
Делаем экран активным и устанавливаем формат пикселя, соответственно возможностям компьютера.
Строка 19.
На этом операторе нужно остановиться и разобраться с ним. Если вам доводилось программировать на Visual Basic или Turbo Pascal или на Delphi, то вы сталкивались с системами координат, принятыми в данных системах. Во всех этих средах оси координат были направлены так:
  • При использовании библиотеки OpenGL применяется прямоугольная, декартова система координат. В нашем случае она выглядит так:

    Первый и второй аргумент команды glViewPort означает, что середина системы координат будет располагаться по середине экрана, остальные два параметра, будут указывать какую площадь экрана будет выделена под область рисования. В нашем случае мы заняли весь экран.

Строки 20-21.
Этими командами мы задаём цвет фона тремя параметрами, первый означает: сколько в оттенке должно присутствовать красного, второй синего, а третий зелёного цветов. После того как цвет задан, мы окрашиваем им экран с помощью команды glClear.
Строка 22.
С помощью этой команды мы задаём размер пикселя. Значение аргумента команды glPointSize можно изменять на дробные, например, на 0.5, это очень пригодится, если требуется нарисовать маленький объект или требуется высокая точность передачи изображения.
Строка 23.
После того как формат пикселя задан, можно задать его цвет. Цвет мы задаём тремя параметрами, а что они означают вы узнали из вышеупомянутого.
Строки 24-29.
С помощью команды Random задаём случайные координаты.
Строка 30.
Все предыдущие процедуры были лишь подготовкой к рисованию. Рисование начинается с открытия командной скобки – glBegin. В скобках после команды glBegin мы указываем, что мы хотим изобразить, так как нам нужна точка, то аргументов команды является константа GL_POINTS. Далее с помощью команды glVertex2f мы рисуем точку с указанными координатами. С помощью команды glEnd мы закрываем командную скобку – рисование окончено.
Строки 26-27.
При Рисовании с использованием библиотеки OpenGL вся графика накапливается в буфере, а потом при помощи оператора SwapBuffers всё содержимое буфера выводится на экран.
Полноэкранный режим

Все, или почти все современные игры полностью используют площадь экрана, так что верхняя панель экрана и нижнее меню Windows становятся невидимыми. Такого эффекта легко добиться:

  • Щёлкните левой кнопкой мыши по главной форме (При запуске ей присваивается имя Form1).
  • Выберите из меню Object Inspector свойство WindowState. Справа от этого свойства будет находиться его значения, щёлкнув по нему мышкой, выберите из списка значение wsMaximized. Это свойство задаёт возможность окну максимально разворачиваться, но этого пока не достаточно, для того чтобы форма полностью закрывала экран.
  • Чтобы форма действительно была полноэкранная нужно изменить ещё одно свойство. Из Object Inspector выберите свойство BorderStyle, по умолчанию значение этого свойства – bsSizeable. Измените значение этого свойства на bsNone.

Начнём с того, что подключим графическую библиотеку к списку используемых модулей.

Щелкните два раза левой кнопкой мыши по главной форме. Перед вами появятся заготовки программного кода.

Перейдите в самое начало окна программного кода и найдите список подключенных модулей.


uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, ExtCtrls;

Измените этот список так, как показано ниже:


uses
  Windows, Messages, SysUtils, Classes, Graphics,
  Controls, Forms, Dialogs, OpenGL, ExtCtrls;

Для начала проанализируем сам принцип работы программы. Вначале мы присваиваем переменным x и y случайные координаты и заносим их в буфер памяти, после чего выводим их на экран. После этого закрашиваем точку в цвет фона, и цикл повторяется до тех пор, пока мы не остановим программу. До начала работы сервер OpenGL должен определить многие характеристики аппаратурного обеспечения, также важно узнать размер пикселя, его цвет.

Именно переменная nPixelFormat содержит в себе такие характеристики.

Можно изменить интервал времени на меньший или больший, тогда точка будет появляться чаще или реже. Вам, наверное, интересно узнать, почему точка появляется только в одной четверти экранной формы. Все очень просто

Так как значения x и y могут быть только положительными, то и точка может появляться только в первой четверти системы координат. Такую систему координат мы задали оператором glViewPort (0,0,Clientwidth,Clientheight). Оператором glPointSize(20) мы задаем размер точки, а оператором glColor3f задаем ее цвет. Самый важный оператор программы (строка 57) выводит двумерную точку на экран со случайными координатами. Оператор glBegin открывает командную скобку, а оператор glEnd закрывает ее. Обратите внимание на аргумент оператора glBegin(GL_POINTS). Этот аргумент определяет, что на экране должна появится именно точка, а не какой-нибудь другой объект (линии, многоугольники также задаются с помощью оператора glVertex2f).

С помощью функции glVertex3f можно задавать точку в пространстве. Чтобы содержимое буфера выводилось на экран, мы используем функцию SwapBuffers. Не пугайтесь, что программный код получился столь громоздким. Большую его часть можно использовать как шаблон, изменяя лишь содержимое между двумя командными скобками glBegin и glEnd. Или можете создать процедуру, содержащую строки от 1 до 25, параметры которой были бы цвет, размер точек и область вывода.

Теперь можете поэкспериментировать с программой, изменяя цвет точки, ее размер, скорость появления и т. д.

Упражнения:

  • Измените программу так, чтобы точка появлялась в пространстве. Для этого используйте функцию glVertex3f.
  • Сделайте так, чтобы точка появлялась во всех четвертях системы координат.

Вопросы:

  • Какая система координат используется библиотекой OpenGL?
    1. Полярная
    2. Декартова
    3. Другая
  • Какой оператор задает цвет точки?
    1. glVertex2f
    2. glVertex3f
    3. glColor3f
  • С помощь оператора glVertex2f и glVertex3f рисуются только точки?
    1. Да
    2. Нет

Ответы:

  • b
  • c
  • b

Итоги:

Освоив первую главу, вы смогли написать простейшую графическую программу с использованием OpenGL, теперь можно переходить к изучению более сложного материала. Но, если вы не уверены, что прочитанное вам понятно рекомендую прочитать еще раз, так как без этих основ вы не сможете разобраться с более сложными темами.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay