В игровом движке Phaser физические объекты,
представленные через Arcade Physics, имеют тело (body),
которое отвечает за столкновения и взаимодействие с другими объектами.
Тело по умолчанию совпадает с размером спрайта, но в большинстве случаев
требуется более точная настройка хитбокса для корректной физики. Для
этого используются методы setSize и
setOffset.
setSizeМетод setSize(width, height, [center]) изменяет
ширину и высоту физического тела, не влияя на
визуальный спрайт.
Параметры:
width — новая ширина тела в пикселях.height — новая высота тела в пикселях.center (необязательный, по умолчанию
false) — если true, тело автоматически
центрируется относительно спрайта.Примеры использования:
player.body.setSize(50, 80);
player.body.setSize(50, 80, true);
Особенности:
setSize не изменяет сам спрайт, поэтому графика и
столкновения можно настраивать независимо.setOffsetМетод setOffset(x, y) задает смещение тела
относительно спрайта. Это позволяет перемещать хитбокс внутри
спрайта, не изменяя его размеров.
Параметры:
x — горизонтальное смещение в пикселях от левого края
спрайта.y — вертикальное смещение в пикселях от верхнего края
спрайта.Примеры использования:
player.body.setOffset(10, 20);
Комбинация с setSize:
player.body.setSize(50, 80);
player.body.setOffset(15, 10);
Точные столкновения с платформами: Для персонажей платформеров часто тело делают меньше спрайта по ширине, чтобы персонаж не «заедал» о края платформ.
Анимации: При смене кадра анимации хитбокс может
оставаться статичным. В таких случаях используется setSize
и setOffset динамически на каждом кадре.
Разные объекты: Для врагов, предметов и интерактивных элементов хитбокс может отличаться от визуального спрайта, чтобы обеспечить более удобный и предсказуемый геймплей.
Центрирование тела: Использование
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 позволяет
создавать точные и гибкие хитбоксы, которые не зависят
от визуального спрайта, обеспечивая реалистичное поведение объектов и
корректное взаимодействие с миром игры.