О чем этот пример

Создание сложных, последовательных изменений свойств игровых объектов обычно требует написания громоздкого кода с таймерами и твинами. Таймлайн (Timeline) в Phaser решает эту задачу элегантно, позволяя описывать цепочку событий в декларативном стиле. Эта статья покажет, как использовать `this.add.timeline()` для создания управляемых временем последовательностей, где вы можете изменять `alpha`, `scale`, `tint` и другие свойства спрайтов в заданные моменты времени. Это мощный инструмент для нелинейных скриптовых сцен, интро или реакций объектов на игровые события.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.atlas('timeline', 'assets/atlas/timeline.png', 'assets/atlas/timeline.json');
        this.load.image('bg', 'assets/skies/spookysky.jpg');
    }

    create ()
    {
        this.add.image(400, 300, 'bg');

        const bat = this.add.sprite(400, 300, 'timeline', 'bat');

        const timeline = this.add.timeline([
            {
                at: 2000,
                target: bat,
                set: {
                    alpha: 0.2
                }
            },
            {
                at: 4000,
                target: bat,
                set: {
                    alpha: 1,
                    scaleX: 2,
                    scaleY: 2
                }
            },
            {
                at: 6000,
                target: bat,
                set: {
                    tint: 0xff0000,
                    angle: 22
                }
            }
        ]);

        timeline.play();
    }
}

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    backgroundColor: '#000000',
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Что такое таймлайн и зачем он нужен

Таймлайн — это контейнер для событий, привязанных к конкретным временным меткам. В отличие от классических анимаций спрайтов, он не управляет кадрами, а позволяет задавать мгновенные изменения любых свойств объекта в указанный момент времени.

Это идеально для сценариев, где нужно: * Постепенно раскрывать интерфейс. * Создавать сценарные последовательности (например, объект появляется, увеличивается, затем меняет цвет). * Синхронизировать действия нескольких объектов по времени без связывания их жесткой логикой.

В предоставленном примере мы управляем одним объектом — летучей мышью (bat), — но таймлайн может одновременно управлять множеством разных target.

Создание и конфигурация таймлайна

Таймлайн создается с помощью метода this.add.timeline(), который принимает массив объектов-событий. Каждое событие описывает, **когда** (at) и **с каким объектом** (target) что произойдет.

Ключевое свойство set внутри события определяет, какие именно свойства объекта будут изменены в указанный момент. Изменения применяются мгновенно.

const timeline = this.add.timeline([
    {
        at: 2000,
        target: bat,
        set: {
            alpha: 0.2
        }
    }
]);

В этом фрагменте через 2000 миллисекунд (2 секунды) после старта таймлайна свойство alpha (прозрачность) спрайта bat будет мгновенно изменено на 0.2.

Метка времени at всегда указывается в миллисекундах относительно момента запуска таймлайна командой timeline.play().

Строим последовательность событий

Сила таймлайна раскрывается при создании цепочек событий. Каждое новое событие в массиве выполняется независимо в свое время, создавая последовательный сценарий.

Посмотрите на полную цепочку из примера:

const timeline = this.add.timeline([
    {
        at: 2000,
        target: bat,
        set: { alpha: 0.2 } // Через 2 сек. мышь почти исчезает
    },
    {
        at: 4000,
        target: bat,
        set: { // Через 4 сек. (еще +2 сек.)
            alpha: 1,     // Полная видимость
            scaleX: 2,    // Увеличение по X в 2 раза
            scaleY: 2     // Увеличение по Y в 2 раза
        }
    },
    {
        at: 6000,
        target: bat,
        set: { // Через 6 сек. (еще +2 сек.)
            tint: 0xff0000, // Окрашивание в красный
            angle: 22       // Поворот на 22 градуса
        }
    }
]);

Таким образом, мы получаем сценарий: объект плавно (но мгновенно в каждый момент времени) тускнеет, затем резко становится крупным и видимым, и, наконец, краснеет и поворачивается. Все интервалы четко контролируются.

Запуск и управление

Созданный таймлайн по умолчанию не активен. Для старта последовательности необходимо явно вызвать метод play().

timeline.play();

Phaser также предоставляет другие методы для управления, такие как stop(), pause() и resume(), которые позволяют гибко интегрировать таймлайн в игровую логику (например, останавливать скриптовую сцену, если игрок ушел в меню).

Важно: время at отсчитывается от момента вызова play(), а не от создания таймлайна.

Что попробовать дальше

Таймлайн — это простой и мощный инструмент для создания временных последовательностей в Phaser. Он избавляет от необходимости ручного управления множеством таймеров и делает код сценариев чистым и наглядным. **Идеи для экспериментов:** 1. Сделайте таймлайн цикличным, используя свойство loop при создании. 2. Назначьте одно и то же время at для нескольких событий с разными target, чтобы синхронизировать действия нескольких объектов (например, взрыв и тряску камеры). 3. Используйте свойства `xиyвнутриset` для мгновенных телепортаций объекта по сцене по сценарию. 4. Скомбинируйте таймлайн с обычными твинами (tweens) для более плавных переходов между ключевыми состояниями.