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 - максимальная величина случайного значения
С того момента по текущий день "земля" была так же частично улучшена, вместо простого чёрного цвета, она получила импровизированную текстурку, в виде штрихов (в нижней части выделено зелёным для наглядности):
текстура "земли"
На десерт видео, на котором демонстрируется последняя компиляция проекта, с двумя новыми объектами "птица" и "персонаж", о которых пойдет речь в следующем посте:
Click to view
Если вы хотите поддержать мой проект, это можно сделать по
ссылке или пополнив один из счетов
WebMoney:
R163522901261
Z180352303030
X054099745452
Благодарю всех, читателей и тех, кто оставляет свои отзывы!