Земля в иллюминаторе видна или там где штормит, там новые объекты

Apr 03, 2018 13:00


Version in English

В данном посте, я напишу об одном из первых проектов, на движке Pixel Walker'а и об одном из объектов для него. Этот проект получил тематическое название "Where The Storm". Это игра в которой игроку предстоит управлять птицей и разгребать препятствия, перед идущим в шторм персонажем.

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

Первым делом, я взялся за "землю", а потом как поднял её над головой, и стою, жду,  на черепахе рядом с тремя слонами! И так оно может быть и было, если бы я в своём посте " Небо и земля pixel walker'а" не доказал бы, что земля круглая. =)

По задумке, "земля" должна была быть некоторым контуром, случайно изменяющий свою высоту. Но в процессе реализации всплыли некоторые подводные камни:



Первая версия рельефа "земли"



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



Цикличность рельефа

Дело в том, что для каждого объекта был реализован механизм повторения последовательности случайных чисел, это нужно было для сериализации и десериализации объектов. Заранее генерировались N значений, которые повторялись при N вызове случайных чисел.

Для решения проблемы, я решил увеличить число случайных значений, и конкретно для "земли" сбить чётность вызовов:

random( random( random( H ) ) )

где random - функция, которая возвращает значение от 0 до заданного параметра.

Было так же учтено и то, что в результате таких манипуляций среднее значение было меньше в 4 раза.

После некоторых попыток:



Неудачные попытки генерации рельефа

Получилась следующая картинка:



Рельеф

Рельеф получился достаточно плавный, не цикличный, и в тоже время нелинейный и достаточно рандомизированный.

В последствии, текущий механизм был так же переделан. Уже когда возникла задача сериализации объектов, число хранимых случайных значений для каждого объекта было уменьшено с порядка 100 до всего 9! При этом качество генерации в данном случае не пострадало, а в некоторых случаях давало даже более оптимистичные результаты!

Для уменьшения количества хранимых случайных значений, в результате долгих расчётов, была выведена следующая формула:

Res = ( (Pos -RV) * (Pos -RV ) XOR ( Pos - RV) XOR 1 ) MOD Max

где

· Res - случайное число

· Pos - счетчик вызова функции

· RV - записанное случайное значение, по порядку

· Max - максимальная величина случайного значения

С того момента по текущий день "земля" была так же частично улучшена, вместо простого чёрного цвета, она получила импровизированную текстурку, в виде штрихов (в нижней части выделено зелёным для наглядности):



текстура "земли"

На десерт видео, на котором демонстрируется последняя компиляция проекта, с двумя новыми объектами "птица" и "персонаж", о которых пойдет речь в следующем посте:

image Click to view



Если вы хотите поддержать мой проект, это можно сделать по ссылке или пополнив один из счетов WebMoney:

R163522901261

Z180352303030

X054099745452

Благодарю всех, читателей и тех, кто оставляет свои отзывы!

Previous post Next post
Up