Библиотека Интернет Индустрии I2R.ru |
|||
|
Что нам стоит Doom построить...Думаю, что такое компьютерные игры, знает каждый читатель, но вряд ли всем известен процесс их создания. Если читатель увлекается программированием, то, наверное, в его библиотеке имеется несколько книг на данную тему, но редко в книгах по программированию найдешь хотя бы пару слов о том, как разрабатываются компьютерные игры или какие программы для этого нужны. В этой статье мы попробуем рассмотреть несколько важнейших азов, без которых не создаётся ни одна приличная игра. Прежде всего, определим, какие навыки нам нужны. Многие из вас изучали язык программирования Pascal, именно с его помощью мы попробуем написать несколько программ. Сейчас почти все игры разрабатываются для Windows, так что нам придётся работать со средой Delphi. Программы в среде Delphi (Delphi не язык программирования) пишутся на языке Object Pascal, специальном диалекте Паскаля. От языка Pascal этот диалект отличается тем, что он имеет большое количество дополнительных возможностей. Ну и, конечно, вам нужно уметь работать с графическими редакторами, хотя бы с Paint. В следующих статьях мы рассмотрим ряд других возможностей, например, как создать движущийся объект с помощью программы AutoCAD или как создать множество визуальных эффектов: тень, отражение. А пока разберем несколько самых базовых вещей: как с помощью точек нарисовать простой движущийся объект, как управлять объектами с помощью клавиатуры. Сейчас графика для Windows программируется одним из двух средств: DirectX или OpenGL. Работать с DirectX пришлось бы с помощью языка C++, который является слишком громоздким для начинающего программиста, так что лучше использовать второе. Если вы еще не работали с Delphi, рекомендую прочитать любую книгу на эту тему. Приступаем к работеПервым делом нужно установить среду Delphi. Все примеры данной статьи будут работать как в Delphi четвертой, так и в пятой версиях. Если у вас инсталлирована третья версия пакета, рекомендую сделать обновление. После запуска перед вами появится пустая форма, панель инструментов и инспектор объектов. Скажу сразу, что для программирования игр нам не понадобятся мощные средства визуальной разработки. Полноэкранный режимВсе, или почти все современные игры полностью используют площадь экрана, так что верхняя панель экрана и нижнее меню Windows становятся невидимыми. Такого эффекта легко добиться. Щёлкните левой кнопкой мыши по главной форме (при запуске ей присваивается имя Form1). Выберите из меню Object Inspector свойство WindowState. Справа от этого свойства будет находиться его значения, щёлкнув по нему мышкой, выберите из списка значение wsMaximized. Это свойство задаёт возможность окну максимально разворачиваться, но этого пока недостаточно для того, чтобы форма полностью закрывала экран. Чтобы форма действительно была полноэкранной, нужно изменить ещё одно свойство. Из Object Inspector выберите свойство BorderStyle, по умолчанию значение этого свойства - bsSizeable. Измените значение этого свойства на bsNone. Если вы всё сделали правильно, то, нажав на клавишу F9 (запуск программы), вы увидите чистый экран, в зависимости от настроек Windows он будет окрашен в определённый цвет. Один важный шаг сделан, теперь осталось сделать еще несколько. Первая наша программа будет относительно простой, с помощью точек мы нарисуем простой объект и будем перемещать его с клавиатуры. Наш объект будет представлять небольшой квадрат, двигающийся по синему фону. В эпоху DOS вся графика игр программировалась пикселями, т. е. все предметы и героев приходилось вначале рисовать на миллиметровой бумаге, а потом вводить координаты в файлы. Это был очень трудоёмкий процесс. Всё же принцип работы этой простой программы стоит разобрать. Начнём с того, что подключим графическую библиотеку к списку используемых модулей. Щелкните два раза левой кнопкой мыши по главной форме. Перед вами появятся заготовки программного кода. Перейдите в самое начало окна программного кода и найдите список подключенных модулей. uses Измените этот список так, как показано ниже: uses Теперь нужно объявить две переменные, которые послужат координатами объекта. Эти переменные должны быть глобальными, т.е. ими можно пользоваться из любой процедуры программы. Найдите вначале программы слово public и впишите после него такую строку: public После всех этих процедур осталось сделать два заключительных шага. Сначала нужно определить, как будут изменяться координаты точки при нажатии на клавишу. Для этого проделайте следующее. Щелкните один раз по главной форме. Из панели Object Inspector выберите вкладку Events. Выберите событие от клавиатуры - OnKeyDown. Данное событие генерируется сразу при нажатии на клавишу. Щелкните два раза по пустому полю рядом со строкой OnKeyDown. Перед вами должна появиться заготовка события: procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin end;Между строками begin и end впишите такие строки: If Key=VK_LEFT then x:=x-0.05; if Key=VK_RIGHT then x:=x+0.05; if Key=VK_UP then y:=y+0.05; if Key=VK_DOWN then y:=y-0.05; Если вам хорошо знаком школьный курс программирования, то смысл этого кода вам будет понятен. Но для тех, кто слабо ориентируется в программировании, поясняю: при нажатии на клавишу <влево> уменьшается абсцисса объекта, на клавишу <вправо> - наоборот. Аналогично действует нажатие на клавиши <вверх> и <вниз>. Теперь, когда координаты объекта известны, можно нарисовать по ним и сам объект. Из списка визуальных компонентов выберите таймер - он находится на вкладке System. Таймер - второй элемент слева:
Два раза щелкните по элементу Timer, после чего он появится на форме. Из меню свойств в Object Inspector выберите свойство Interval и измените его значение с 1000 на 100. Свойство Interval задаёт промежуток времени в миллисекундах. В нашем случае каждые 100 миллисекунд (1\10 секунды) будут циклически исполняться операторы таймера. После этих процедур два раза щёлкните по таймеру и измените заготовку события так: 1. procedure TForm1.Timer1Timer(Sender: TObject); 2. procedure SetDCPixelFormat (hdc : HDC); 3. var 4. pfd : TPixelFormatDescriptor; 5. nPixelFormat : Integer; 6. begin 7. FillChar (pfd, SizeOf (pfd), 0); 8. pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL Пояснение к процедуреПри инициализации графики, работая с библиотекой OpenGL, нужно определить характеристику графических возможностей компьютера. Для этого мы создали специальную функцию SetDCPixelFormat, именно с помощью этой функции определяется тип видеокарты. Я не стану подробно рассматривать операторы этой функции, так как для многих даже опытных программистов это было бы сложновато. Строки 15-17. Делаем экран активным и устанавливаем формат пикселя, соответственно возможностям компьютера. Строка 18. На этом операторе нужно остановиться и разобраться с ним. Если вам доводилось программировать на Visual Basic, Turbo Pascal или на Delphi, то вы сталкивались с системами координат, принятыми в данных системах. Во всех этих средах оси координат были направлены так:
При использовании библиотеки OpenGL применяется прямоугольная, декартова система координат. В нашем случае она выглядит так:
Первый и второй аргумент команды glViewPort означают, что середина системы координат будет располагаться посередине экрана, остальные два параметра будут указывать, какая площадь экрана будет выделена под область рисования. В нашем случае мы заняли весь экран. Строки 19-20. Этими командами мы задаём цвет фона тремя параметрами. Первый показывает, сколько в оттенке должно присутствовать красного, второй - синего, а третий - зелёного цветов. После того, как цвет задан, мы окрашиваем им экран с помощью команды glClear. Строка 21. С помощью этой команды мы задаём размер пикселя. Значение аргумента команды glPointSize можно изменять на дробные, например, на 0.5, это очень пригодится, если требуется нарисовать маленький объект или требуется высокая точность передачи изображения. Строка 22. После того, как размер пикселя задан, можно задать его цвет. Цвет мы задаём тремя параметрами, а что они означают, вы узнали выше. Строки 23-25. Все предыдущие процедуры были лишь подготовкой к рисованию. Рисование начинается с открытия командной скобки - glBegin. В скобках после команды glBegin мы указываем, что мы хотим изобразить. Так как нам нужна точка, то аргументом команды является константа GL_POINTS. Далее с помощью команды glVertex2f мы рисуем точку с указанными координатами. Хочу вам напомнить, что максимальное значение координат по модулю равно единице, именно поэтому в событие от клавиатуры мы указали такой малый шаг смещения. Строки 26-27. При рисовании с использованием библиотеки OpenGL вся графика накапливается в буфере, а потом при помощи оператора SwapBuffers всё содержимое буфера выводится на экран. Теперь можете нажать на клавишу F9, и если вы набрали текст программы правильно, то перед вами появится маленький квадрат, которым можно управлять с помощью клавиатуры. Вы, наверное, заметили, что в процессе работы программы мигает курсор мышки. От этого эффекта можно избавиться. Для этого щёлкните один раз левой кнопкой мыши по главной форме, потом перейдите к Object Inspector, далее найдите свойство Cursor и его значение измените на -1. В заключение хочется сказать пару слов о достоинствах OpenGL. Сама библиотека работает с графикой в режиме реального времени, то есть при перемещении объектов не видно рывков. Скорость работы таких графических программ прямо пропорционально возможностям компьютера, а для современных игр, как известно, компьютер должен быть быстрым. На этом всё, надеюсь, это ещё далеко не последняя статья по программированию игр. Александр Ковяков |
|
2000-2008 г. Все авторские права соблюдены. |
|