arshehremen

Categories:

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

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 — максимальная величина случайного значения

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

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

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

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

R163522901261 

Z180352303030 

X054099745452

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


Error

default userpic

Your reply will be screened

When you submit the form an invisible reCAPTCHA check will be performed.
You must follow the Privacy Policy and Google Terms of use.