“Робот Фортран, чисть картошку!” или история передвижения одного куба из приложения " BUILDWAY"

1548098586191096727.png

Возможно некоторые из вас знакомы с прекрасной книгой “Энциклопедия профессора Фортрана”. В ней очень доступно рассказывается об устройстве компьютера а также о том что такое компьютерный язык. Не смотря на то что книга 1991 года выпуска, по моему мнению, она является лучшим введением в мир компьютеров как для взрослых так и для детей.

Особенно мне запомнился момент из книги, когда кот Икс пытается задать программу, для чистки картошки, профессору Фортран, но простая команда “Робот Фортран, чисть картошку!” не приносит желаемого результата, “робот” начинает полировать картошку носовым платком, или же шкрябать её ручкой от ножа.

1548098756146688247.png

Это очень наглядный пример к выражению: “Программа делает не то что хочет пользователь, а то на что её запрограммировали”.
Недавно мы создали пост о своей первой игре для андроид https://render.ru/ru/Desperationgame/post/15047

В этом посте я бы хотел рассказать об особенностях некоторых механик, а в частности о передвижении главного игрового куба.
Если вкратце геймплей Build Way заключается в том, что игрок строит дорогу на пути катящегося куба, помогая ему обходить препятствия и находить различные бонусы в виде монет и ключей. То есть самим кубом мы не управляем, катиться он автоматически. Куб должен не только двигаться в нужном направлении, но и адаптироваться к выдвижению блоков на стене, тем самым меняя направление движения динамически. Казалось бы что может быть проще чем катить куб по дороге?

1548099039191736288.png

Но поверьте я дочь программиста и тут не все так однозначно. Не всегда просто добиться естественного поведения движения от куба. Рассмотрим несколько примеров. Чтобы двигать куб вперед будем вращать его вокруг рёбер:
1) Простейший пример передвижения вперед без препятствий, для этого достаточно повернуть куб вокруг нижнего переднего ребра на 90°:

1548099107164093865.png

2) Допустим мы встретили препятствие и нужно на него взобраться, для этого нужно повернуть куб на 180° вокруг верхнего переднего ребра:

154809912414414834.png

3) Усложним еще ситуацию, на пути нашего куба оказалась яма, что же ему делать в этом случае? На самом деле выхода как обычно минимум два - первое забить на яму и крутиться вперед вокруг переднего нижнего ребра, или же закатиться в яму. Мы выбрали второе решение, так как оно показалось нам более естественным и таким образом куб сможет посетить все закоулки в которые заведет его игрок! В этом случае мы крутим куб не вокруг его ребр, а вокруг оси X:

1548099179175993424.png

еще схожий пример но теперь яма не внизу, а напротив нас, теперь крутим куб вокруг оси Y:

1548099207121827504.png

4) Дальше веселее =) Логично предположить что куб должен двигаться вперед(вправо), так как игровой процесс идет слева направо. Но иногда бывают ситуации когда куб должен, например двигаться назад. Для этого были добавлены приоритеты движения, а также исключительные ситуации:

1548099247169523947.png

Например в данной ситуации приоритет движение вперед больше чем движения назад.
Но мы решили что куб все-таки должен закатиться назад, вернуться и покатиться дальше вперед и вниз. Куб как-бы привязан к стене и должен её полностью обойти.
Пару слов о том как куб анализирует объекты вокруг себя. В Unity engine есть замечательная возможность это сделать с помощью sphere cast. Простыми словами можно сказать, что куб как-бы рисует сферу вокруг себя и возвращает все объекты, которые попали или пересеклись с этой сферой. На данном рисунке видно что вокруг игрового куба находится куб сверху, снизу и снизу справа:

1548099479191095574.png

Все эти механики были реализованы чтобы сделать поведение куба более предсказуемым (по нашему мнению =) а также разнообразить геймплей.
Думаю теперь вы убедились что даже такая банальная задача как движение объекта, ставит множество интересных и сложных вопросов перед программистом.

1548099614140016818.png

Ссылка на apk.

0
RENDER.RU