Phaser — это мощная игровая библиотека на JavaScript, построенная на
объектно-ориентированных принципах. Основой работы с игровыми объектами
является класс
Phaser.GameObjects.GameObject и его производные.
Для создания уникальных объектов и добавления кастомного поведения
используется механизм расширения классов через
наследование.
В JavaScript наследование реализуется с помощью ключевых слов
class и extends. В контексте Phaser это
позволяет создавать собственные игровые объекты, которые имеют все
стандартные свойства и методы базового класса, но дополнены уникальной
функциональностью.
class MySprite extends Phaser.GameObjects.Sprite {
constructor(scene, x, y, texture) {
super(scene, x, y, texture);
scene.add.existing(this);
}
moveUp(speed) {
this.y -= speed;
}
}
Ключевые моменты:
super(scene, x, y, texture) вызывает конструктор
базового класса, инициализируя объект с необходимыми параметрами.scene.add.existing(this) добавляет объект на сцену, что
обязательно для отображения и взаимодействия с ним.moveUp) позволяют расширять стандартное
поведение без изменения исходного кода Phaser.Phaser предоставляет множество классов игровых объектов, таких как
Sprite, Image, Text,
Container. Наследование от этих классов позволяет:
Добавлять собственные свойства:
class Enemy extends Phaser.GameObjects.Sprite {
constructor(scene, x, y, texture, health) {
super(scene, x, y, texture);
scene.add.existing(this);
this.health = health;
}
takeDamage(amount) {
this.health -= amount;
if (this.health <= 0) {
this.destroy();
}
}
}Переопределять методы базового класса для кастомного поведения:
class Player extends Phaser.GameObjects.Sprite {
preUpdate(time, delta) {
super.preUpdate(time, delta);
this.x += 1; // Автоматическое движение игрока
}
}
Метод preUpdate вызывается каждый кадр, что делает его
идеальным для реализации постоянной логики движения или проверки
столкновений.
ContainerPhaser.GameObjects.Container позволяет объединять
несколько объектов в единый компонент. Наследование от
Container облегчает создание сложных игровых элементов:
class HealthBar extends Phaser.GameObjects.Container {
constructor(scene, x, y, width, height) {
super(scene, x, y);
scene.add.existing(this);
this.bar = scene.add.rectangle(0, 0, width, height, 0x00ff00);
this.add(this.bar);
}
setHealth(percent) {
this.bar.width = percent * this.bar.width;
}
}
Особенности использования:
Container управляет положением всех дочерних объектов
одновременно.Для повторного использования логики без множественного наследования применяются миксины:
const Movable = Base => class extends Base {
move(dx, dy) {
this.x += dx;
this.y += dy;
}
};
class Enemy extends Movable(Phaser.GameObjects.Sprite) {
constructor(scene, x, y, texture) {
super(scene, x, y, texture);
scene.add.existing(this);
}
}
Миксины позволяют комбинировать функционал нескольких классов, обходя ограничения одиночного наследования в JavaScript.
preUpdate(time, delta) – вызывается
каждый кадр, можно реализовать автоматическое поведение.destroy() – корректно удаляет объект
со сцены, освобождая память.setInteractive() – делает объект
интерактивным для ввода пользователя.scene.add.existing(this) –
обязательный шаг для отображения объекта на сцене.scene.add.existing(this).preUpdate для любых действий, требующих
постоянного обновления состояния.Container, чтобы сохранить структуру.Расширение классов в Phaser позволяет строить гибкие, переиспользуемые компоненты, упрощает поддержку больших игровых проектов и открывает возможности для сложной логики поведения объектов.