RaceDay

Как сделать видеоигру за неделю? Хотя бы маленькую.

Придумать

Для начала нужно решить, что это будет за игра.

Пусть это будет что-то навеянное первым "Fast and Furious", "Need for Speed Underground" и "Initial D" – гонки.

В гонках нужно приехать первым. Каким ты приедешь, зависит от того, как быстро ты разгоняешься и как хорошо поворачиваешь. Чтобы было проще, выберем что-то одно.

Разгон кажется проще сделать, так что возьмем его. Получится игра про драгрейсинг – гонки по прямой.

С видом сверху будет хорошо видно, какая машина впереди. Буду делать двухмерную гоночную игру про драгрейсинг с видом сверху.

Разобраться

Машина двигается, потому что колеса крутятся. Чем быстрее они крутятся – тем быстрее она двигается.

Работает примерно так: двигатель крутит коробку передач, коробка передач в свою очередь крутит колеса.

На сколько быстро двигатель будет крутиться зависит от его мощности. При этом мощность двигателя зависит от скорости с которой он крутится. При 1000 оборотов в минуту мощность одна, а при 3000 уже другая. Зависимость нелинейная, её обычно графиком показывают (BHP - мощность, RPM – обороты).

В коробке передач есть шестерёнки разного размера. Одна связана с двигателем, а другая – с колесами. Изменяя размер шестерёнок, можно контролировать, насколько легко двигатель вращает колеса. Если шестерёнка колес вдвое больше двигательной, то на один оборот двигателя колесо сделает половину оборота. Если они одинаковые, то один оборот двигателя поворачивает колесо один раз. Эта система помогает двигателю сдвинуть машину с места (на первой передаче шестерёнка двигателя меньше), а затем машина может быстро разогнаться (на последней передаче шестерёнка колёс меньше).

Например, передаточные числа коробки передач Nissan GTR R34:

  1. передача: 2.97 – шестерёнка колес почти в 4 раза больше двигательной
  2. передача: 2.07 – шестерёнка колес всё ещё сильно больше
  3. передача: 1.43 – колеса в полтора раза медленнее
  4. передача: 1 – можно сказать что двигатель напрямую соединен с колесами
  5. передача: 0.84 – колеса крутятся быстрее двигателя
  6. передача: 0.56 – ну вы поняли

Двигатель крутится с частотой от 0 до 8000 оборотов в минуту. С помощью передаточного числа можно перевести обороты двигателя в обороты колёс. Зная диаметр колеса и обороты, можно вычислить скорость. Для игры этого будет достаточно.

Кривые Безье

Мощность двигателя нелинейно зависит от оборотов.

При переключении передачи вверх обороты двигателя падают, потому что шестерёнка колес становится меньше, и для той же скорости нужно меньше оборотов. На графике мощности (BHP - мощность, RPM – обороты) верхняя точка дуги – место, где разгон самый быстрый. Если в этот момент переключать передачу – получится быстрее разогнаться. На поиск этого момента и будет построена игра.

Осталось придумать, как задать эту нелинейную зависимость изменения оборотов от времени. Я подумал про параболу, гиперболу и даже модуль арктангенса. Но это всё негибко, на самом деле мне нужны были Кривые Безье.

Их придумал Пьер Безье, чтобы делать плавные изгибы кузовов Peugeot.

Нам понадобится кубическая версия кривой. Она задаётся четырьмя числами. Первое – начальное значение, четвёртое – конечное значение, второе и третье – параметры траектории движения между начальным и конечным значениями.

Представьте отрезок, по которому с постоянной скоростью двигается точка. В 0% времени она в начале отрезка, в 100% – в конце. За 1% времени она пройдёт 1% длины отрезка.

Соединим такими отрезками точки: первую со второй, вторую с третьей, третью с четвёртой.

Теперь у нас есть три отрезка, по которым ездят точки на 1% длины за 1% времени. Соединим отрезками эти три точки. Получится ещё два отрезка. Остаётся соединить их точки последним отрезком. Точка на нём будет двигаться по плавной кривой, которая нам нужна.

Нужно подобрать четыре числа так, чтобы итоговая кривая была похожа на график мощности нужной машины, подставить в формулу, и можно будет вычислить значение текущей мощности в зависимости от оборотов.

Графика

Обычно я картинки для игр в интернете ищу, но в этом году решил графику сделать сам.

Выбрал машины для гонки:

Нарисовал длинный город с дорогой.

Всю трассу разделил на 4 квадрата, которые при движении сменяют друг друга. Начало и конец трассы соединяются бесшовно. На самом деле за конку игрок проезжает весь город несколько раз. Это чтобы скорость ощущалась.

А вот спрайты для приборной панели и выхлопа:

После этого осталось собрать всё вместе и научить работать.

🎮 Вот что получилось.

Чтобы начать игру первый раз надо решить головоломку с коробкой передач в заголовке.

Играть можно и с телефона и с компа.

Если интересно, как работает внутри – вот исходный код на GitHub.