1. Если вы хотите что-то близкое к вашему макету, я бы использовал частицы (это не обязательно должна быть полностью взорванная система частиц).
Визуализируйте ваши частицы в форме многоугольника на текстуре RenderTexture. Обязательно используйте присадки, смешивающиеся с частицами. Частицы внутри многоугольника будут плавно сливаться друг с другом, в то время как частицы снаружи дадут желаемый мягкий край. (Пример этого эффекта можно посмотреть в этом видео на YouTube: Видео аддитивных частиц
Теперь визуализируйте RenderTexture на главном экране, и все готово. RenderTexture необходима, чтобы частицы не смешивались с вашим фоном.
Вы можете попробовать поместить треугольники непосредственно на текстуру частицы и посмотреть, как это работает. В противном случае визуализируйте их поверх вашего «супа из частиц» как отдельный слой.
Создан быстрый макет в обновленном jsfiddle, который выглядит следующим образом.
Обновленную демонстрацию можно найти здесь.
2. Каждая частица имеет скорость и происхождение. Когда ваш игрок касается многоугольника, вы изменяете скорость каждой частицы пропорционально скорости игрока. Чем дальше частица от вашего игрока, тем меньше на нее влияет скорость игроков.
Формула для расчета скорости частиц будет выглядеть примерно так:
//player.velocity and particle.velocity are vectors
//k is a factor to enhance or weaken the influence of players velocity
var distanceToPlayer = (player.position - particle.position).length();
particle.velocity = particle.velocity + ((k * player.velocity) + particle.velocity) * (1/distanceToPlayer);
Чтобы вычислить положение частицы, вы положили это в свой метод обновления:
var speedY = -(springConstant * (particle.position.y - particle.origin.y)) - (dampingFactor * particle.velocity.y);
var speedX = -(springConstant * (particle.position.x - particle.origin.x)) - (dampingFactor * particle.velocity.x);
particle.position.y = particle.position.y + speedY;
particle.position.x = particle.position.x + speedX;
particle.velocity.x = particle.velocity.x + speedX;
particle.velocity.y = particle.velocity.y + speedY;
Это должно дать вам «жидкость», где каждая частица вращается вокруг своего источника, когда игрок размешивает жидкость. SpringConstant изменяет, насколько частица отклоняется от своего начала, а коэффициент демпфирования - как быстро частица останавливается. Возможно, вам придется настроить код, поскольку он является модифицированной версией 1d-симуляции, которую я использую в своей игре.
Теперь с демо: Демо
Просто настройте 3 константы в верхней части, пока жидкость не будет вести себя так, как вы этого хотите.