В библиотеке Phaser 3 плоскость (Plane)
используется для представления двухмерной поверхности, которую можно
визуализировать и деформировать с помощью вершинной сетки. Она является
основой для создания динамических эффектов, таких как волны, изгибы,
анимация текстур или растяжение спрайтов по кривым.
В Phaser Plane реализуется через
Phaser.GameObjects.Plane или с
использованием Mesh и DynamicTexture,
что позволяет работать с отдельными точками сетки для изменения формы
плоскости в реальном времени.
Создание плоскости включает определение размеров и положения:
const plane = this.add.plane(x, y, width, height, textureKey);
this.load.image.Плоскость автоматически получает сетку из 4 вершин, но для сложных деформаций необходимо использовать Mesh.
Для динамических изменений формы применяется
Phaser.GameObjects.Mesh. Mesh создаётся с
указанием сетки по ширине и высоте:
const mesh = this.add.mesh(x, y, textureKey, null, widthSegments, heightSegments);
mesh.vertices.mesh.vertices.forEach((vertex, index) => {
vertex.x += Math.sin(index + this.time.now / 1000) * 5;
vertex.y += Math.cos(index + this.time.now / 1000) * 5;
});
mesh.updateVertices();
Текстура плоскости можно деформировать через координаты UV каждой вершины. Это позволяет создавать эффекты движения текстуры, растяжения или изгиба:
mesh.vertices.forEach((vertex, index) => {
vertex.u += 0.01; // смещение текстурной координаты по X
vertex.v += 0.01; // смещение текстурной координаты по Y
});
mesh.updateVertices();
Использование UV-координат совместно с tileSprite
позволяет делать бесконечные текстурные анимации.
Для имитации физических эффектов, таких как волны или изгибы, вершины плоскости можно менять на основе математических функций:
mesh.vertices.forEach((vertex, index) => {
const wave = Math.sin((vertex.x + this.time.now / 200) * 0.1) * 20;
vertex.y += wave;
});
mesh.updateVertices();
Плоскость можно сделать интерактивной. Например, деформация по движению мыши:
this.input.on('pointermove', pointer => {
mesh.vertices.forEach(vertex => {
const dx = pointer.x - vertex.x;
const dy = pointer.y - vertex.y;
const dist = Math.sqrt(dx*dx + dy*dy);
if(dist < 50) {
vertex.y += (50 - dist) * 0.1;
}
});
mesh.updateVertices();
});
Работа с большим числом сегментов может быть ресурсоёмкой. Рекомендации:
Mesh.setDirty() вместо
полного обновления всех вершин, если изменяется только часть
плоскости.update цикла.Плоскость и Mesh находят применение в следующих сценариях:
Использование Phaser Mesh для деформируемой плоскости открывает широкие возможности визуальных эффектов, обеспечивая гибкость и высокую производительность.