Статья 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
на главную