Игра
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