Статья 1:

Часть 1.
( автор Сало Алексей ).


     Все мы играем, или играли в игры. Некоторые игры нам нравятся, в некоторых чего-то нам не хватает. Мы часто говорим: <Если б эту игру делал я, то я бы добавил\изменил...> и т.д. А вам никогда не приходило в голову написать свою собственную игру?

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

     Итак, что нам нужно для написания игры? Кроме мозгов, нам еще пригодится знание какого ни будь языка программирования, и библиотека OpenGL. Сегодня в этой статье мы не будем изучать OpenGL, так как наша главная цель- научиться писать игры. Мы будем пользоваться языком С++, и компилятором- Microsoft Visual C++ 6.0. Почему именно этим языком? Я думаю, что это отдельный разговор (отдельная статья).

     Что ж, пора приступать! Давайте настроим наш компилятор. Но, вначале нам придется скачать один файл (библиотеку GLUT). Он небольшой (всего 93кб) по адресу: www.opengl.fud.ru/glut.zip

     Теперь разархивируйте файлы (из только что скачанного вами архива glut.zip) mui32.lib и glut32.lib в папку Lib, где у вас установлен Visual C++ (скорее всего это: C:\Program Files\Microsoft Visual Studio\VC98\Lib).

     Файл glut.h поместите в папку Include\GL (C:\Program Files\Microsoft Visual Studio\VC98\Include\GL\).

     А файл glut32.dll в папку C:\Windows\System.

     На этом с установкой библиотеки закончили.

     Откройте Visual C++ и создайте приложение Win32 Console Application.Теперь нажмите Build\Set Active Configuration, и выберите Win32 Release. Затем, нажмите Project\Setting и перейдите на вкладку Link.

     В строке Object\library modules: допишите следующие библиотеки: opengl32.lib, glu32.lib, glaux.lib и glut32.lib.

     Перед тем, как начать писать свою игру, давайте немного определимся с терминологией, используемой в программировании 3D графики:

Рендеринг - это процесс подготовки, выдачи (прорисовки) изображения на экран. В общем, это все действия, которые связаны с выдачей картинки на экран.

Буфер - это область для временного хранения данных.

Двойная буферизация - это один из способов рендеринга, при котором существует два буфера. Содержимое первого (переднего) буфера (front buffer) показывается на экран, и вы видите какое-то изображение.
В это время на заднем буфере (back buffer) подготавливается следующий кадр (рисуется). Когда кадр на заднем буфере готов, тогда передний и задний буфер меняются местами. И затем все это повторяется. С помощью такой технологии избегается мерцание экрана.

Z-buffer - также часто вместо этого слова употребляется слово Буфер Глубины (Depth Buffer). Это буфер величиной с экран, в котором хранятся Z координаты пикселей. Z-ось добавляет третью величину- глубину.

     Пока что нам этого для начала хватит. И теперь переходим к написанию кода. Давайте сейчас рассмотрим из чего состоит приложение, написанное на OpenGL (это графическая библиотека, которую мы будем использовать при программировании игр и 3D графики. Есть, конечно, и альтернатива - это DirectX, которую мы трогать не будем :).

     Для работы с окнами мы будем использовать в наших приложениях, как я уже говорил, библиотеку GLUT. Первым делом нам нужно инициализировать (подготовить для работы) библиотеку OpenGL.

     Функция main(), которая всегда присутствует в приложениях, написаных на C++, будет включать вызовы функций GLUT, с помощью которых мы можем устанавливать параметры окна. Также в функцию main() мы должны включить функцию Display, с помощью который мы и будем рисовать.

     Вот пример функции main():

void main(int argc, char** argv)
{
     glutInit(&argc,argv); file://инициализация
     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); file://установка режима отображения
     glutInitWindowSize(400,500); file://размер окна
     glutInitWindowPosition(0,0); file://позиция окна
     glutCreateWindow("OpenGL first"); file://заглавие нашего окошка
     glutDisplayFunc(Display); file://функция для рисования
     glutMainLoop(); file://цикл
}

Теперь разберем каждую строчку нашего кода.

Начнем с первой:
glutInit(&argc,argv)
Это функция- инициализация. Эта функция проводит необходимые начальный действия по созданию окна.

glutInitDisplayMode(int Mode)
С помощью этой функции устанавливаются необходимые режимы отображения информации, которые можно использовать совместно с помощью операции побитового ИЛИ, в языке С++ это значок ' | '.

     Для начала рассмотрим самые необходимые нам пока что режимы:

GLUT_RGB
Режим RGB (отображение цвета с помощью трех основных цветов- красного, зеленого и синего). Используется по умолчанию.
GLUT_SINGLE
Окно с одиночным буфером. Этот режим используется также по умолчанию.
GLUT_DOUBLE
Окно с двойным буфером (о том, что это такое, написано выше).
GLUT_DEPTH
Окно с буфером глубины (или Z-buffer'ом, о котором также написано выше).

Следующая функция у нас идет: glutWindowSize(400,500).
С ее помощью мы определяем размер нашего окна (в данном случае 400- ширина, 500- высота). Размер задается в пикселях. Место, где будет расположено окно - (левый верхний угол окна), мы задаем функцией glutWindowPosition(int x, int y).
А теперь мы должны создать само окно.
Это делается с помощью glutCreateWindow(string), где в скобках мы пишем заголовок окна.

     Функция glutDisplayFunc (имя функции) определяет функцию, в которой мы будем рисовать, и делать различные вычисления (хотя, последнее- это необязательно делать в этой ф-и). В качестве параметра вы должны указать имя вашей функции.

Например, вы написали функцию:

void MyDisplay(void)
{
\\что-то, например, рисуем кружок:
}

Тогда наша функция будет иметь вид: glutDisplayFunc(MyDisplay)
То есть мы указали, что функция, которая ответственная за рисование всех объектов (в нашем примере, кружка), будет MyDisplay. Контроль всех событий происходит внутри бесконечного цикла glutMainLoop(void). Вот собственно и все!

Теперь давайте посмотрим полный листинг нашей программы:

#include file://Подключаем нужные библиотеки для работы с OpenGL
#include file://Библиотека GLUT
#include file://Библиотека GLU, которую мы будем использовать позже.

void Display(void)
{
file://тут рисуем что угодно
}

void main(int argc,char **argv)
{
     glutInit(&argc,argv);
     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
     glutInitWindowSize(400,500);
     glutInitWindowPosition(0,0);
     glutCreateWindow("OpenGL super game");
     glutDisplayFunc(Display);
     glutMainLoop();
}

Теперь, скомпилируйте весь этот код. Для этого в Microsoft Visual C++ нажмите клавишу F7 и посмотрите, что у нас получилось!
А получилось у нас- "прозрачное" некрасивое окошко (вы наверное хотели увидеть уже игру, но: не все сразу).

На этом на сегодня наша статья заканчивается. Ждите выхода части 2 этой статьи.

С уважением к Вам
Алексей (aka Virus) Сало.
"OpenGL/DirectX для начинающих"
http://www.opengl.fud.ru
Автор статей по программированию
в еженедельнике "Мой компьютер"
http://www.mycomp.com.ua



на главную

Используются технологии uCoz