Куда прописывать исходный
код? Компоненты, используемые в программировании игр.
Всем доброго времени суток! В данной
статье хотелось бы по полочкам для новичков разобрать возможные варианты
прописывания исходного кода. А также разобраться с наиболее часто используемыми
компонентами Delphi,
необходимых для создания компьютерных и не только – игр.
Любой, кто хотя бы раз запускал среду Delphi знает, что перед ним сразу открывается
новый проект с пустой формой. Форма – это прямоугольная область, на которой могут
располагаться любые компоненты и рисоваться графика. Если Вы планируете
создавать игры без использования дополнительных графических библиотек типа DirectX и OpenGL, то форма, скорее всего, будет
представлять из себя игровое окно.
При разработке игр форма, в первую
очередь, используется для прорисовки графики (картинок) на ней. Для этого
случая у формы существует свойство Draw. Код прорисоки представляет из себя
следующую конструкцию:
Form1.Canvas.Draw(
0,0, Image );
Первые две цифры – два нуля. Это координаты
(икс и игрек) относительно верхнего левого угла формы. А Image – это переменная типа TBitmap, в которую загружена картинка.
Чаще всего прорисовка графики происходит
благодаря компоненту Timer. Да и вообще все игры, кроме пошаговых (Шахматы, Герои меча и
магии, Цивилизация и т.д.) не могут обходиться без данного компонента. Этот
компонент каждый промежуток времени (интервал задает программист). Чтобы
использовать данный компонент необходимо перейти на вкладку System. Затем кликнуть левой клавишей мыши по
компоненту, а потом по форме. Таким образом он будет на ней располагаться.
Дважды кликаем по компоненту и попадаем в то место, куда можно печатать
исходный код в созданную процедуру. Также стоит отметить что при звпуске
программы таймер не будет виден. Пользователь сможет лишь наблюдать за
результатом его действий, если они отображаются на форме.
Еще у таймера есть свойство Interval:
Timer1.Interval:=2000;
По умолчанию интервал равен 1000 (что
равно одной секунде). Тоесть каждую секунду будут запускаться действия,
прописанные в таймере. И от этого отталкиваются все расчеты времени:
·
2000
– обновление таймера происходит 1 раз в 2 секунды
·
5000
– обновление таймера происходит 1 раз в 5 секунд
·
500
– обновление таймера происходит 2 раз в 1 секунду
·
100
– обновление таймера происходит 10 раз в 1 секунду
·
10
– обновление таймера происходит 100 раз в 1 секунду
Кроме прорисовки графики в таймере
обычно прописывают искусственный интеллект игровых персонажей (их поведение) и
всевозможные игровые проверки:
·
Выход
персонажей за пределы игрового поля
·
Прорисовка
карты в обозначенных границах и со сдвигом
·
Проверка
на проходимые и непроходимые участки
·
Проверка
на имеющиеся квесты (задания) в наличии
Также при создании игр приходится
реализовывать управление персонажами. Для этого у формы есть несколько полезных
свойств:
·
OnClick – при клике (нужной) клавиши мыши
·
OnKeyPress – после того как была нажата, а заем отпущена клавиша клавиатуры
·
OnKeyUp – когда была отпущена клавиша клавиатуры
·
OnKeyDown – когда была зажата клавиша клавиатуры
·
OnMouseDown – когда была зажата клавиша мыши
·
OnMouseUp – когда была отпущена клавиша мыши
Дважды кликнув по нужному событию формы
мы получаем возможность прописать нужный код. Например можно изменить
координаты главного героя на 5 пикселей:
Влево: Player.X:=Player.X-5;
Вправо: Player.X:=Player.X+5;
Вверх: Player.X:=Player.Y-5;
Вниз: Player.X:=Player.Y+5;
И для диагоналей:
Вниз влево: Player.X:=Player.X-5; Player.Y:=Player.Y+5;
Вниз вправо: Player.X:=Player.X+5;
Player.Y:=Player.Y+5;
Вверх влево: Player.X:=Player.X-5; Player.Y:=Player.Y-5;
Вверх вправо: Player.X:=Player.X+5;
Player.Y:=Player.Y-5;
Также часто приходится отслеживать какая
именно мыши клавиша была нажата правая или левая:
If
key=Mb_Left then …
If
Key=Mb_Right then …
Для клавиш клавиатуры нужно отслеживать
или символ нарисованный на клавише или номер клавиши (специальный встроенный),
а иногда и отслеживать их специальные названия:
If
Key=’D’ then …
If
Key=’d’ then …
If
Key=64 then …
If
Key=Vk_Escape then …
В принципе здесь же в управлении можно
реализовать и проверки на проходимость клеток и на пересечение с другими
персонажами или игровыми обьектами. Также важно проверять по таймеру условия
победы и поражения. В случае поражения нужно или отключать таймер ( Timer1.Enabled:=false; ) или изменять переменные так, чтобы
выполнялись нужные условия, а ненужные не выполнялись.
Если возникла необходимость
использования DirtectX, то возникает необходимость использования библиотеки DelphiX. Тогда можно будет рисовать не на форме,
а непосредственно на экране монитора как и в варианте с OpenGL.
Для многих кажется тяжелой работа с
файлами. Например для загрузки игровых карт или других данных из внешних файлов
можно использовать компонент Memo, которы можно сделать невидимым, чтобы не мешал. Также нужно в
этот компонент в свойствах добавить и вертикальную и горизонтальную прокрутки,
чтобы данные не переносились сами на новые строки, а также правильно
отображались. Помните, что нужно очищать Memo каждый раз при загрузке новых данных иначе
новые данные добавяться снизу старых.
Memo1.Lines.Clear;
Для загрузки данных из файла нам
понадобиться лишь одна строка:
Memo1.Lines.LoadFromFile(‘Text.txt’);
Или:
Memo1.Lines.LoadFromFiles(‘C;\MyProgram\map.txt’);
Далее научимся брать нужную строку и
передавать ее данные в переменную. Допустим, нам нужна первая строка:
Var
S:String;
S:=Memo1.Lines.Strings[0]; (строки нумеруются с нуля)
Также рассмотрим вариант когда нам нужна
не вся строка, а лишь ее часть. К примеру выведем в заголовок формы первый
символ в строке:
Form1.Caption:=S[1];
Ведь строка представляет из себя массив
символов. А вот если нам необходимо не загружать, а сохранять данные в файл,
тогда строка будет выглядеть так:
Memo1.Lines.SaveToFile(‘D:\MyProgram\Maps.txt’);
Остальные компоненты используются реже.
Да и невозможно и не нужно рассматривать новичкам их все. На этом у меня все!
Желаю всем удачи в программировании игр!
Источник: delgame.at.ua
|