В прошлой статье мы добавили механику строительства железной дороги. Пути получились симпатичные, но надо бы теперь как-то заставить поезд двигаться по ним, чем обязательно займемся сегодня.
Буду с вами честен, у меня далеко не сразу получилось реализовать нормальную механику движения поезда, так что то что вы увидите здесь является результатом работы нескольких вечеров.
<Пыхтящие паровозы>
Паровоз сейчас выглядит как-то грустно... думаю, для динамики ему точно не помешает добавить дым из трубы) В Unreal engine дым можно реализовать просто с помощью частиц. Пока не будем переусложнять и сделаем просто круглые частицы, которые со временем увеличивают свой размер и степень прозрачности. Сразу привяжем получившуюся систему частиц к трубе паровоза чтобы оценить как это выглядит в игре. Получается неплохо)
<Описание механики>
В результате некоторых размышлений, я пришел к тому, что процесс игры должен состоять из двух этапов - строительства путей и старта работы железной дороги. То есть во время движения поездов делать уже ничего нельзя, можно только смотреть на результат своей работы. Это нам сильно упростит процесс просчета движения для поездов, поскольку он позволит нам не нагружать процессор постоянными расчетами. Расчет траекторий компьютеру нужно будет сделать всего лишь один раз - только при запуске движения.
<Кодим графы движения>
Пока повесим функцию запуска процесса движения на клавишу "Пробел". То есть при ее нажатии запускается просчет движения поездов и отключается интерфейс строительства, а при повторном нажатии поезда возвращаются на изначальные позиции и интерфейс включается обратно.
Для каждого локомотива добавим массив точек, через которые он должен будет проходить. Эти точки зависят от положения и типа железнодорожных путей. Каждый шаг мы прыгаем на одну клетку вперед, в случае если там нет ничего или рельсы повернуты не по пути движения, то движение останавливается, если по пути движения то движение продолжается прямо (при прямых путях) или поворачивается на 90 градусов (при поворотных путях). В целом все просто. На выходе мы имеем граф из точек для каждого локомотива, через которые он должен будет пройти до тех пор пока не пройдет всё. на случай зацикленных путей ограничим цикл (пусть это пока будет 1024 цикла).
Само движение реализуем просто с помощью постепенного перемещения от точки к точке и поворотами на 90 градусов на поворотных путях, с которыми, к слову, пришлось немного повозиться.
<Движение вагонов>
Фактически вагоны двигаются точно также как и локомотив, однако они всегда должны не доходить до финала одну или более клеток, в зависимости от того, какими по счету они стоят. Чтобы не дублировать работу, мы просто скопируем массив координат перемещения для каждого вагона от локомотива, удалив необходимое количество последних точек. Однако Поэтому каждому вагону нужно знать кто его локомотив и свое место в сцепке. Для этого локомотив просто трассирует обратно каждый вагон и нумерует его, передавая необходимые значения. Всё! В целом, всё просто)
На сегодня пока всё, в следующий раз разберемся со столкновениями поездов и их остановками на станциях и будет дальше работать над визуальным оформлением игры) Подписывайтесь чтобы не пропустить!
Ссылки на прошлые статьи:
Часть 1. Идея игры пришла в плацкарте
Часть 2. Генерация карты
Часть 3. 3D модель паровоза и вагона
Часть 4. Железнодорожные пути