2010-10-22 2 views
6

У меня есть сетчатая игра (платформер), где я основывал все на плитки. У меня есть твердые и жидкие плитки. Я пытаюсь найти хороший способ сделать плитки для воды имитировать воду грубо.2D ситовое моделирование воды/жидкости (основано на платформенной плите)

В настоящий момент у меня есть действующая система: Когда водочная плитка добавляется над другой плитой для воды, она добавляет 1 к плите для воды ниже. Число указывает на давление.

Вот как это выглядит на данный момент:

[0] <- This water tile has 0 in pressure. 
[1] <- This water tile has 1 in pressure. 

если добавить еще воды плитку рядом с нижней один, он ищет слева, справа и выше, если есть какие-либо водные плитки и inheritates самый большой давление вокруг него.

Пример:

[0] 
[1][1] 

А вот больший пример после добавления нескольких воды плитки:

[0][0] 
[1][1][1][1] 
[2][2][2][2][2] 

Затем я делаю каждый воду плитку, которая имеет давление, равное или больше, чем 1 попытки двигаться влево/вправо, если есть свободное пространство, затем установите давление на 0 и проверьте, может ли оно наследовать давление вокруг себя из соседних водоемов, если таковые имеются.

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

Если удалить верхние плитки воды из последнего примера:

[1][1][1][1] 
[2][2][2][2][2] 

Тогда мы имеем верхний ряд с давлением 1, он должен иметь 0 там теперь и нижняя строка должна иметь 1.

Есть ли более разумная система, которую я могу реализовать, чтобы сделать это более правильным?

являются следующие ограничения:

Каждая плитка может только проверить его соседей плитки. Плитка может иметь любую функцию. Плитка может иметь любую переменную для хранения данных.

Можете ли вы, ребята, разработать лучшую систему, которая работает лучше, чем моя?

Обычный тест я делаю:

[] 
[] should become [][] 

[] 
[] 
[] should become [][][] 

    [] 
[][][] should become [][][][] 

Предполагая, что игра работает на некоторое время.

Любые предложения были бы более чем приветствуются!

ответ

0

Возможно, вы могли бы забыть о давлениях (поскольку вы на самом деле не используете их как давление) и просто используйте bool tryMove или что-то в этом роде.

Каждого шаг моделирования должно быть сломан в двух субшагах:

Первый цикл в плитках:

  1. Если пространство ниже свободно, установите tryMove истину, закончить эту плитку.
  2. Если у вас есть плитка выше, установите tryMove в true else, установите tryMove на false.
  3. Если какой-либо сосед пытается двигаться, установите tryMove в значение true.

Второй контур в плитках:

  1. Если пытаться двигаться и ниже пространство свободно, перемещать плитки вниз, установите tryMove ложному, отделка плиткой.
  2. Если вы пытаетесь переместиться и можете двигаться вбок (свободное место слева или справа), установите соседние точки tryMove как false, переместите его, установите этот tryMove как false, завершите плитки.

Я думаю, что это должно исправить вашу проблему.

0

Если у вас есть ресурсы для его поддержки, я рекомендую рекурсивную функцию, которая пытается нажимать плитки слева и справа сверху. Если функция найдет другую плиту ниже, она может попытаться вытеснить эту плиту в обе стороны. Лучшим методом было бы начать шаг влево и вправо, по одной плите за раз. Если он продолжает находить плитки, то он продолжает двигаться. В конце концов, он либо закончится из плитки, чтобы проверить (заканчивается у стены), либо найдет водопроводную плиту с свободным пространством для перемещения. После нескольких итераций вода должна выходить наружу и освобождать место для падения воды.

Позвольте мне прояснить левую, а затем правильную природу рекурсии. По сути, как только функция переместится на базовый уровень воды, он должен начать выбирать плитки для воды, чередуясь влево и вправо. Поэтому сначала проверьте плиту прямо слева, затем прямо справа, затем два налево, затем два справа и т. Д. Если он найдет воздушную плитку, он должен будет перемещать ближайшую водную плитку. Если он найдет что-то другое (обычно это стена), он должен отказаться от этой стороны. После того, как он сдался с обеих сторон, вы должны рассмотреть другие варианты поведения, например, самую верхнюю воду, случайно перемещающуюся по поверхности.

Если вы действительно хотите, чтобы поведение выглядело естественным, я настоятельно рекомендую случайную переменную, решающую, проверяет ли она сначала влево или вправо. В противном случае вы, вероятно, столкнетесь с необычно регулярными повторяющимися шаблонами.

Смежные вопросы