О чем этот пример
Работа с игровыми объектами — основа любого проекта на Phaser. Часто начинающие разработчики сталкиваются с неожиданным поведением спрайтов при попытке их повернуть, масштабировать или изменить точку привязки. Этот пример наглядно демонстрирует ключевые методы класса `Phaser.GameObjects.Image`, которые позволяют полностью контролировать отображение графики в сцене. Понимание этих принципов критически важно для корректного позиционирования элементов интерфейса, анимации персонажей и создания визуальных эффектов.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
test7;
test6;
test5;
test4;
test3;
test2;
test1;
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('grid', 'assets/pics/debug-grid-1920x1920.png');
this.load.image('logo', 'assets/sprites/phaser3-logo-small.png');
}
create ()
{
this.add.image(0, 0, 'grid').setOrigin(0);
// Test 1
// Render object at given coordinates
this.test1 = this.add.image(400, 50, 'logo').setOrigin(0.5);
// Test 2
// Render object at given coordinates factoring in origin 1
this.test2 = this.add.image(400, 150, 'logo').setOrigin(1, 0.5);
// Test 3
// Render object at given coordinates factoring in origin 0
this.test3 = this.add.image(400, 150, 'logo').setOrigin(0, 0.5);
// Test 4
// Render object with scale
this.test4 = this.add.image(400, 250, 'logo').setOrigin(0.5).setScale(2);
// Test 5
// Render object with rotation
this.test5 = this.add.image(400, 350, 'logo').setOrigin(0.5);
// Test 6
// Render object with alpha
this.test6 = this.add.image(400, 450, 'logo').setOrigin(0.5).setAlpha(0.5);
// Test 7
// Render object with blend mode
this.test7 = this.add.image(400, 550, 'logo').setOrigin(0.5).setBlendMode(1);
}
update ()
{
this.test5.rotation += 0.01;
}
}
const config = {
type: Phaser.AUTO,
parent: 'phaser-example',
width: 800,
height: 600,
scene: Example
};
const game = new Phaser.Game(config);
Базовое создание и позиционирование
В методе create() сцены создается несколько объектов Image. Фундаментальный метод this.add.image(x, y, textureKey) создает новый объект-изображение. Первые два аргумента — это координаты на холсте.
Однако, куда именно на изображении "приходятся" эти координаты, определяет свойство Origin (точка привязки). По умолчанию значение Origin равно 0.5, что означает центр изображения. В первом тесте мы явно устанавливаем setOrigin(0.5), хотя это значение и так стоит по умолчанию. Объект test1 будет нарисован так, что его центр совпадет с точкой (400, 50).
this.test1 = this.add.image(400, 50, 'logo').setOrigin(0.5);
Второй и третий тесты показывают, как Origin влияет на позицию. При setOrigin(1, 0.5) точка привязки смещается к правому краю изображения по горизонтали и остается по центру по вертикали. Таким образом, координаты (400, 150) будут указывать на правую границу спрайта.
// Координата X (400) указывает на ПРАВЫЙ край спрайта
this.test2 = this.add.image(400, 150, 'logo').setOrigin(1, 0.5);
// Координата X (400) указывает на ЛЕВЫЙ край спрайта
this.test3 = this.add.image(400, 150, 'logo').setOrigin(0, 0.5);
Масштабирование и вращение
Метод setScale(factor) позволяет увеличить или уменьшить объект относительно его текущего размера. В четвертом тесте изображение масштабируется в 2 раза. Важно помнить, что масштабирование происходит относительно точки привязки (Origin). Так как мы установили Origin в 0.5 (центр), спрайт равномерно увеличится во все стороны от своего центра.
this.test4 = this.add.image(400, 250, 'logo').setOrigin(0.5).setScale(2);
Пятый тест демонстрирует вращение. В методе create() мы просто создаем объект. Вращение происходит в методе update(), который вызывается на каждом кадре игры. Свойство rotation увеличивается на 0.01 радиана за кадр, создавая плавную анимацию поворота. Вращение, как и масштабирование, происходит вокруг точки привязки объекта.
// В create()
this.test5 = this.add.image(400, 350, 'logo').setOrigin(0.5);
// В update()
this.test5.rotation += 0.01;
Прозрачность и режимы наложения
Метод setAlpha(value) управляет прозрачностью объекта, где 1 — полностью непрозрачный, а 0 — полностью прозрачный. В шестом тесте значение 0.5 делает логотип полупрозрачным.
this.test6 = this.add.image(400, 450, 'logo').setOrigin(0.5).setAlpha(0.5);
Седьмой тест использует setBlendMode(index). Blend Mode (режим наложения) определяет, как цвет пикселей объекта комбинируется с цветами пикселей под ним. Значение 1 соответствует константе Phaser.BlendModes.ADD. Этот режим добавляет значения цветов объекта и фона, создавая эффект "свечения". Это мощный инструмент для создания визуальных эффектов без дополнительных текстур.
this.test7 = this.add.image(400, 550, 'logo').setOrigin(0.5).setBlendMode(1);
Важность точки Origin
Как видно из примеров, точка привязки (Origin) — это центральное свойство, влияющее на все трансформации объекта: позицию, масштаб, вращение. Ее понимание избавляет от типичных проблем, когда объект вращается не вокруг своего центра или масштабируется "уплывая" в сторону.
- Origin (0, 0) — левый верхний угол. Координаты объекта указывают на его верхний левый угол. - Origin (0.5, 0.5) — центр (значение по умолчанию). Координаты объекта указывают на его центр. - Origin (1, 1) — правый нижний угол.
Все методы трансформации (setScale, setRotation) используют эту точку как опорную.
// Поворот вокруг левого верхнего угла
const spriteA = this.add.image(100, 100, 'logo').setOrigin(0, 0);
spriteA.rotation += 0.01;
// Поворот вокруг центра (более естественно)
const spriteB = this.add.image(100, 200, 'logo').setOrigin(0.5, 0.5);
spriteB.rotation += 0.01;
Что попробовать дальше
Управление объектами Image в Phaser сводится к комбинации методов setOrigin, setScale, setRotation и setAlpha. Ключевой вывод: всегда явно задавайте точку привязки (Origin), соответствующую вашей задаче, прежде чем применять трансформации. Для экспериментов попробуйте: анимировать масштаб объекта (scale) для эффекта пульсации, комбинировать несколько режимов наложения (blendMode) на одном объекте, используя setBlendMode, или вращать объект вокруг точки за его пределами, установив Origin больше 1 (например, setOrigin(1.5, 0.5)).
