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

Эмиттеры частиц — мощный инструмент для создания динамичных эффектов в играх, от магии и огня до следов и взрывов. Часто требуется, чтобы частицы двигались не просто плавно ускоряясь или замедляясь, а меняли скорость рывками, создавая более механистичный или ритмичный визуальный ряд. В Phaser 3 для этого существует параметр `steps` (шаги) в настройках скорости. Он позволяет разбить интервал между начальным и конечным значением скорости на дискретные ступени, что открывает новые возможности для тонкой настройки поведения частиц и создания уникальных эффектов, которые сложно добиться обычной линейной интерполяцией.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.atlas('flares', 'assets/particles/flares.png', 'assets/particles/flares.json');
    }

    create ()
    {
        const particles = this.add.particles('flares');

        particles.createEmitter({
            frame: 'green',
            x: 100,
            y: 300,
            lifespan: 2000,
            speedX: { start: 100, end: 400, steps: 12 },
            speedY: { min: -20, max: 20 },
            scale: { start: 0.7, end: 0.2 },
            blendMode: 'ADD'
        });
    }
}

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

const game = new Phaser.Game(config);

Разбираем пример: Конфигурация эмиттера

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

speedX: { start: 100, end: 400, steps: 12 },
speedY: { min: -20, max: 20 },

Здесь по горизонтальной оси (speedX) скорость частицы будет меняться от 100 до 400 пикселей в секунду. Но не плавно, а через 12 дискретных шагов. Это значит, что частица 12 раз резко сменит свою горизонтальную скорость в течение жизни, создавая ступенчатый эффект движения. По вертикали (speedY) скорость выбирается случайно из диапазона для каждой частицы, добавляя хаотичности.

Как работает параметр `steps`?

Параметр steps применяется к свойствам, которые могут иметь начальное (start) и конечное (end) значение, например, скорость, масштаб (scale) или альфа-канал (alpha).

Без steps Phaser интерполирует значение линейно от start к end за время жизни частицы. С steps этот интервал разбивается на указанное количество равных отрезков. Значение свойства "перескакивает" на новую величину в конце каждого отрезка времени, а не меняется непрерывно.

// Плавное изменение скорости (без steps)
speed: { start: 100, end: 400 }

// Ступенчатое изменение скорости (со steps)
speed: { start: 100, end: 400, steps: 4 }
// Скость будет принимать значения: 100, 175, 250, 325, 400.

В нашем примере за время жизни в 2000 мс скорость по X сменится 12 раз, т.е. примерно каждые 166 мс.

Практическое применение и комбинации

Ступенчатость можно комбинировать с другими параметрами для сложных эффектов. Например, создание эффекта "дрожащего" или "пульсирующего" огня, где частицы резко меняют размер и скорость.

Рассмотрим эмиттер для имитации искр от точильного станка:

particles.createEmitter({
    frame: ['red', 'yellow', 'white'], // Используем несколько цветов
    x: 400,
    y: 300,
    lifespan: 1500,
    quantity: 2,
    speedX: { start: 50, end: 250, steps: 8 },
    speedY: { start: -300, end: -50, steps: 5 },
    scale: { start: 0.5, end: 0.1, steps: 3 },
    blendMode: 'ADD',
    radial: false
});

Здесь speedY также задан ступенчато, создавая эффект "подпрыгивающих" искр, которые теряют вертикальную скорость рывками. Масштаб (scale) уменьшается в 3 резких шага, что может выглядеть как быстрое затухание.

Отличие от `ease` и случайных значений

Важно не путать steps с другими способами управления свойствами.

* **steps vs Функции плавности (ease):** ease управляет *кривой* непрерывного изменения (например, ускорение в начале, замедление в конце). steps же полностью заменяет плавность на дискретные скачки. * **steps vs Случайный диапазон (min/max):** min и max задают случайное значение для каждой *новой* частицы в момент ее создания. Параметр steps управляет изменением свойства *во время жизни* одной конкретной частицы.

// Случайная начальная скорость для каждой новой частицы
speed: { min: 100, max: 400 }

// Ступенчатое изменение скорости в течение жизни одной частицы
speed: { start: 100, end: 400, steps: 12 }

// Можно совместить: случайная начальная скорость + ступенчатое изменение
speedX: { start: { min: 50, max: 150 }, end: 400, steps: 6 }

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

Параметр steps — это отличный способ добавить вашим визуальным эффектам ритм, механистичность или более контролируемую динамику. Он особенно полезен для стилизованных эффектов, технологичных интерфейсов (сканирующие лучи, цифровые частицы) или имитации прерывистых физических процессов. **Идеи для экспериментов:** 1. Примените steps к свойству alpha, чтобы частицы мигали с определенной частотой. 2. Создайте эмиттер с steps для scale и speed, чтобы смоделировать движение капель дождя по стеклу. 3. Скомбинируйте эмиттер с обычным плавным эмиттером: один создает плавный шлейф, а второй — ритмичные всплески на его фоне.