Хитбокс тела: setSize, setOffset

В игровом движке Phaser физические объекты, представленные через Arcade Physics, имеют тело (body), которое отвечает за столкновения и взаимодействие с другими объектами. Тело по умолчанию совпадает с размером спрайта, но в большинстве случаев требуется более точная настройка хитбокса для корректной физики. Для этого используются методы setSize и setOffset.


Метод setSize

Метод setSize(width, height, [center]) изменяет ширину и высоту физического тела, не влияя на визуальный спрайт.

Параметры:

  • width — новая ширина тела в пикселях.
  • height — новая высота тела в пикселях.
  • center (необязательный, по умолчанию false) — если true, тело автоматически центрируется относительно спрайта.

Примеры использования:

player.body.setSize(50, 80);
  • Создает тело шириной 50px и высотой 80px, левый верхний угол совпадает с позицией спрайта.
player.body.setSize(50, 80, true);
  • Тело центрируется относительно спрайта, что особенно удобно для персонажей с анимациями, где спрайт может иметь прозрачные области.

Особенности:

  • setSize не изменяет сам спрайт, поэтому графика и столкновения можно настраивать независимо.
  • Полезно для точного попадания по коллизиям, например, когда у персонажа есть большая тень или элементы за пределами активной области столкновений.

Метод setOffset

Метод setOffset(x, y) задает смещение тела относительно спрайта. Это позволяет перемещать хитбокс внутри спрайта, не изменяя его размеров.

Параметры:

  • x — горизонтальное смещение в пикселях от левого края спрайта.
  • y — вертикальное смещение в пикселях от верхнего края спрайта.

Примеры использования:

player.body.setOffset(10, 20);
  • Тело будет смещено на 10 пикселей вправо и на 20 пикселей вниз относительно спрайта.

Комбинация с setSize:

player.body.setSize(50, 80);
player.body.setOffset(15, 10);
  • Размер тела устанавливается 50x80, а положение тела внутри спрайта смещается, что позволяет точно подогнать хитбокс под нужную область персонажа.

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

  1. Точные столкновения с платформами: Для персонажей платформеров часто тело делают меньше спрайта по ширине, чтобы персонаж не «заедал» о края платформ.

  2. Анимации: При смене кадра анимации хитбокс может оставаться статичным. В таких случаях используется setSize и setOffset динамически на каждом кадре.

  3. Разные объекты: Для врагов, предметов и интерактивных элементов хитбокс может отличаться от визуального спрайта, чтобы обеспечить более удобный и предсказуемый геймплей.

  4. Центрирование тела: Использование center: true в setSize часто упрощает работу, особенно когда спрайт содержит прозрачные области или асимметричные формы.


Взаимодействие с другими методами тела

  • setSize и setOffset работают с физикой Arcade Physics.
  • Метод body.updateFromGameObject() автоматически подгоняет тело под текущее положение спрайта после изменений размеров или смещений.
  • Для динамических объектов рекомендуется обновлять setSize и setOffset после изменения масштаба спрайта (setScale), чтобы хитбокс соответствовал визуальному объекту.

Пример динамической подгонки хитбокса под анимацию

function update() {
    if (player.anims.currentAnim.key === 'crouch') {
        player.body.setSize(50, 40);
        player.body.setOffset(10, 60);
    } else {
        player.body.setSize(50, 80, true);
    }
}
  • При приседании хитбокс уменьшается и смещается вниз.
  • При стоянии тело автоматически центрируется, что упрощает обработку столкновений с платформами и врагами.

Использование setSize и setOffset позволяет создавать точные и гибкие хитбоксы, которые не зависят от визуального спрайта, обеспечивая реалистичное поведение объектов и корректное взаимодействие с миром игры.