Игра

21 шаг создания компьютерной игры

Определяем, что хотим в конце иметь (какую игру делаем; внешний вид; структуру игры; взаимодействие разных частей программы)

Например

  • есть форма, на форме дорога, на дороге машинка (из внешнего файла), лейбл, в котором указывается пройденная скорость;

  • ещё одна форма с предварительными настройками к игре (скорость, кол-во встречных машин, кол-во попутных машин);

  • где будут храниться эти данные: во внешнем файле или в реестре

1-4 шаги:

  • если создаётся свой .bmp файл, то расположение объектов в нём такие же, как в .bmp файле примера: высота машинки – 31 пк, ширина – 23 пк.;прорисовать дорогу и бордюр

  • создать стандартный проект .exe и сохранить его под именем AutoRoad; изменить параметры у формы: name: frmMain; Caption: AutoRoad; Icon: файлы с расширением .ico в стандартном Windows; ScaleMode: 3 – измерение в пк. В произвольной форме разместить на форме два PictureBox

1-й PictureBox.

Свойства:

Name: picRoad :

AutoRedraw: True - всё, что мы нарисовали будет видимо

BorderStyle: 0 – чтобы не было рамочки

Height: 461 – высота нашего PictureBox (будущего фона)

Left: 8 – смещение к левому краю

ScaleMode: 3 – измерение в пк.

Top: 0 – высота (чтобы дорога сместилась к самому верху)

Wigth: 331 (ширина)

Подготовили поле под дорогу

2-й PictureBox:

Свойства:

Name: picSrc

AutoRedraw: True

AutoSize: True

BorderStyle: 0

Left: 368

Picture: загрузить .bmp ( с рисунком машинок) файл из нужной папки

ScaleMode: 3

Top: 364

Visible: False – пользователь не будет видеть эту картинку

  • в разделе деклараций записать процедуру, которая будет рисовать игровое поле (в форме frmMain записываем с разработки шаг 3) Для копирования автомобиля на игровое поле используем IP–функцию StrechBet. Это функция копирования объекта с одной формы на другую. Добавим к программе модуль:меню Project – AddModule сохранить его под именем: mdtAuto (щёлкнув в окне решений на модуле правой кнопкой мыши – выбрать Save As… и сохранить в нужной папке под именем mdtAuto; Name самого модуля при этом не менять ). Опишем функцию в разделе деклараций модуля (смотри в разработке)

  • Затем выполняем шаг 4а. В декларации формы запишем процедуру (1 в шаге 4а), которая вырезает из общей картинки первую машинку и копирует его на дорогу (открываем форму AutoRoad и печатаем пункт 1 из шага 4а). Объединим процедуры прорисовки дороги и нашего авто в единую процедуру, к которой будем затем неоднократно возвращаться (в этой же форме AutoRoad печатаем пункт 2 из шага 4а). Чтобы всё заработало вернутся в модуль и напишем запускающую процедуру (3 в шаге 4а).Сделаем процедуру Main стартовой при запуске: в окне решений выполнить щелчок правой кнопкой мыши на названии Project1 и выбираем Project Properties – в раскрывающемся списке StarTup Obiect выбрать frmMain

  • Делаем .exe и сохраняем

  • Тип POINTAPI (описанный ранее смотри шаг 4) даёт начальное положение X,Y всегда равным 0. Исправим это, расположив наш автомобиль на середине правой полосы дороги. Допишем две процедуры в Main, которые инициализируют начальные координаты авто (6 в шаге 4а), который получаем исправлением (а точнее дописыванием)

шаг 5

  • Автомобиль должен уметь перемещаться влево и вправо. Для этого будем использовать событие KeyDown (обработчик нажатия клавиш на клавиатуре). Сделаем так, чтобы при нажатии на левую стрелку будем смещаться влево на 2 пк, а при нажатии на стрелку вправо – смещаться на 2 пк вправо (вписать в основную форму frmMain код 1 шага 5).

  • Если долго держать кнопку со правой стрелкой, то объект благополучно «уйдёт» за границу форму. Чтобы этого не допустить, ограничим перемещение машины границами нашего «бордюра» (вписать в уже написанный код ещё две строки (смотри пункт 2 шага 5)

шаг 6

  • Отобразим остальные автомобили. Каждая машинка вырезается из своего ряда и ставится на место.Отличие между нашей машиной и другими только в количестве. Сделаем исключение для упрощения просчёта координат. Объявим массив в модуле до Main (пункт 1 в шаге 6)

  • Напишем функцию, описывающую прорисовку одного из оставшихся автомобилей (отличного от нашего) (пункт 2 в шаге 6 – пишем в форме) В процедуру RedrawPic (которая была записана на шаге 2 в 4а шаге) и находится на форме frmMain внести дополнения (смотри пункт 3 шага 6), для отображения одного (из оставшихся других) автомобиля

  • В запускающей процедуре Main (которая в модуле) сделаем изменения, которые отобразят координаты других из оставшихся автомобилей. Для машин от 0 до 5 – координата Х будет равна порядковый № машины + его ширина (23 пк). Чтобы машины не «слипались», добавим на ширину ещё по 2 пк. Для машин от 6 до 11 – то же самое, но расчёт будет вестись от середины дороги.

шаг 7

  • Создадим меню

    • Откроем форму frmMain и расположим на ней Timer со следующими параметрами:Name: tmrMove, Enable: False. Вставим пункт главного меню. Вставим первый пункт подменю (та буква, перед которой стоит & будет в меню подчёркиваться )

    • Вставим второй пункт подменю

    • Вставим в меню пустую строку (в Caption лучше вставить «______________________________» (без кавычек)

    • Вставим последний пункт подменю Выход

шаг 8

  • Опишем действия меню (чтобы оно работало)(пункт 1 шага 8 – пишется на форме в самом конце)

  • Пишем процедуру работы таймера (пункт 2 шага 8 – пишется на форме в самом конце)

  • Исправим программу так, чтобы при полном исчезновении за «краем» дороги, машины повторили цикл движения заново. Дописываем программку таймера по аналогии с пунктом 3 (пункт 3 шага 8)

  • Внесём изменение в движение транспорта и в смещении каждого авто (13-i в программе) на (2 пк + порядковый № авто) (пункт 4 шага 8 , что надо добавить обведено)

шаг 9

  • Сделаем генерацию случайных чисел, для предания «хаотичности» в движение автомобилей Внесём в процедуру Main (которая расположена в модуле) изменение

шаг 10

  • Движение вперёд с «различной скоростью»

  • Откроем форму и добавим два лейбла

1 Label

Свойства:

Name: lblCaption

Caption: Скорость

Font: размер – 10; жирный

Height: 16

Index: 0

Left: 348

Top: 64

Width: 74

2 Label

Свойства:

Name: lblSpeed

Name: lblSpeed

Caption: 0

Avtosize: True

Font: размер – 10; жирный

Height: 16

Index:

Left: 428

Top: 64

шаг 11

  • Добавим новую переменную в разделе декларации модуля до процедуры Main (пункт 2 шага 10)

  • В форме процедуры PicRoad внесём дополнение для клавиш вверх, вниз Для клавиши «стрелка вниз» исключим отрицательные значения скорости. Изменения отразим в лейбле (пункт 3 шага 10)

шаг 12

  • Сделаем «видимым» наше изменение скорости. Попутные машины с увеличением скорости должны двигаться относительно нас «медленнее», а встречные «быстрее». Для этого добавим в значение переменной Speed скорости перемещения всех авто. (пункт 4 шага 10)

шаг 13

  • Отразим столкновение автомобилей. Это должно произойти, когда любая точка нашего авто пересечётся с любой другой точкой другого авто. (пункт 1 шага 11 – Когда совпадают координаты по горизонтали или вертикали, скорости обнуляются – процедура Crash) Данная процедура должна проверятся постоянно. Вызовем в процедуре таймера (tmrMoveTime) эту процедуру перед прорисовкой всех автомобилей.

  • Добавим ещё 2 лейбла для отображения пройденного пути

1 Label

Свойства:

Name: lblCaption

Caption: Пройденный путь

Font: размер – 10; жирный

Height: 16

Index: 1

Left: 348

Top: 84

Width: 136

2 Label

Свойства:

Name: lblPath

Name: lblPath

Caption: 0

Avtosize: True

Font: размер – 10; жирный

Height: 16

Index:

Left: 488

Top: 84

шаг 14

  • В событие таймера внесём изменение пройденного расстояния. В лейбле Patch отобразить пройденное расстояние. Выполняем шаг 12 из разработки.

шаг 15

  • Ограничим пользователя во времени. Отсчёт времени должен быть виден. Создадим ещё два лейбла и новый таймер.

1 Label

Свойства:

Name: lblCaption

Caption: Время игры

Font: размер – 10; жирный

Height: 16

Index: 2

Left: 348

Top: 104

Width: 90

2 Label

Свойства:

Name: lblTime

Name: lblTime

Caption: 0

Avtosize: True

Font: размер – 10; жирный

Height: 16

Index:

Left: 488

Top: 84

  • Добавим в программу инициализацию второго таймера

шаг 16

  • Создаём форму настройки (добавим ещё одну форму)

  • Её параметры name: frmOption; BorderStyle: 1 (в рамочке) Caption: Настройки; Height: 1815 Icon: файлы с расширением .ico в стандартном Windows; ScaleMode: 3 – измерение в ПК

шаг 17

  • Разместим на форме 4-ре лейбла со следующими свойствами:

  • Добавим два текстовый поля:

  • Строим два выпадающих списка. У обоих имена – cboNumAuto

  • Строим две кнопки

  • В форме Main сделать вызов новой формы (в конце уже написанных процедур) (шаг 14 )

шаг 18

  • Работа с реестром. Будем использовать 4-ре функции: GetSetting – для считывания данных из реестра; SaveSetting – для записи данных из реестра; Delete – для удаления данных из реестра; – считывание всех данных из реестра

  • Так как к реестру мы будем обращаться из разных форм, то разместим эти функции в модуле: в разделе деклараций опишем две нумерованные константы. Для этого списываем 2 пункт из шага 15 в модуль после Main

  • Дописываем функцию, которая будет считывать данные из реестра и выводить в окно формы frmOption, пишем её в модуле

  • Запустим функцию в работу. Самый первый запуск программы мы должны сделать запись в реестр со значениями по умолчанию. В дальнейшем будем устанавливать свои значения. В процедуру Main впишем проверку о наличии записи о нашей программы в реестр. Далее проверим наличие данных в реестре Перейдём в форму Main и запишем в лейбл считывание времени (пункт 2 в шаге 16)

шаг 19

  • В форме Options она должна считать данные из реестра, занести их в соответствующие поля и при выходе сохранить сделанные изменения ёё

шаг 20

  • Процедура проверки на допустимость символов (1 пункт 18 шага)

  • Чтобы заставить пользователя ввести правильное время набрать в шаге 18 пункт 2 проверку каждого знака

  • Изменим параметры в форме Main при загрузке формы Options

шаг 21

  • Количество попутных и встречных машин

  • Вывести из процедуры Main , расположенной в модуле, часть кода для определения случайного положения машин и назовём её RndAuto, а цикл привяжем к данным о количестве машин.

  • В форме Настройки которая заставит перерисовать форму Main

@akaVeta