Симуляция воды в моей песочнице (YASG)
Проблема симуляции воды - это сложная задача для игр-песочниц, поэтому многие индюки (инди-разработчики) решают воду вообще не делать. Я подумал, что из этого получилась бы прикольная фишка, поэтому все же реализовал.
У меня в игрушке мир состоит из 2d блоков 32х32 пикселя. Вот представим, что у нас есть 1 такой блок воды. На блок воды действует сила тяжести. На гифке в яму падает по пол блока воды.
Блок воды делится на 4 части, которые "лежат" одна на другой. Количество воды в блоке - дискретная величина.
У каждого блока есть 2 параметра: объем (сколько там частей, от 1 до 4) и "псевдодавдение". Псевдодавление нужно, чтобы разравнивать поверхность воды - чтобы вода равномерно распределялась по доступной области.
Для каждого блока воды запускается конечный автомат, который проверяет, есть ли снизу, слева и справа место, куда вода может утечь из этого блока.
У этого подхода есть один недостаток: не работают сообщающиеся сосуды.
Водичка булькает :)
Если в воде кто-то плавает, то при поднятии уровня воды этот кто-то телепортируется на 1 блок наверх. Если сверху нет места, то появляется утопленник(и).
Пока оно работает вот так, но мне лично очень хочется когда-нибудь сделать сообщающиеся сосуды.
Показанное мне нравится. В смысле физика её, а вот визуальная часть слегка напрягает блочностью. Круглях хочу!
Как ты внутри обсчитываешь и управляешь ими тебе виднее, но ты ж не привязываешься конкретно к пикселям, верно? А значит выглядеть блок воды может как угодно. Я бы вообще предложил анимированным его сделать, пока вода в сводбодном падении, то выглядит как колышущаяся условно круглая полупрозрачная фигня.
А потом ещё партиклами брызги фигачить во все стороны при колизии!
Если у блока слева или справа есть блок воды на единицу выше - то этот блок сдвигается на единицу вверх(+проверка на границу).
Место передвинутого вверх блока занимает новый(место под ним занято), теперь сдвинутый блок может двигатся горизонтально до новой границы.