Matter.js, используемая в Phaser для физики, предоставляет мощный движок для симуляции столкновений. В основе лежат события collisionstart, collisionactive и collisionend, которые позволяют отслеживать начало, продолжение и окончание взаимодействия объектов.
collisionstartСобытие collisionstart возникает в момент, когда два
тела впервые сталкиваются. Оно используется для:
Пример регистрации события:
this.matter.world.on('collisionstart', function (event, bodyA, bodyB) {
event.pairs.forEach(pair => {
const { bodyA, bodyB } = pair;
console.log('Начало столкновения между', bodyA.label, 'и', bodyB.label);
});
});
Ключевой момент: объект event.pairs содержит массив всех
пар тел, которые начали контактировать в текущем обновлении. Каждая пара
предоставляет свойства bodyA и bodyB,
а также информацию о точках контакта и нормалях столкновения.
collisionendСобытие collisionend срабатывает, когда тела перестают
соприкасаться. Оно особенно полезно для:
isTouching = false);Пример использования:
this.matter.world.on('collisionend', function (event) {
event.pairs.forEach(pair => {
console.log('Окончание столкновения между', pair.bodyA.label, 'и', pair.bodyB.label);
});
});
Важно: collisionend вызывается только тогда, когда
контакт действительно завершён, а не на каждом кадре, что отличает его
от collisionactive.
collisionactivecollisionactive срабатывает каждый кадр, пока два тела
находятся в контакте. Оно позволяет:
Пример:
this.matter.world.on('collisionactive', function (event) {
event.pairs.forEach(pair => {
console.log('Тела продолжают соприкасаться:', pair.bodyA.label, pair.bodyB.label);
});
});
Для точного контроля часто используют свойства label, collisionFilter.category и collisionFilter.mask. Это позволяет ограничить обработку столкновений только определёнными группами объектов.
let player = this.matter.add.sprite(100, 100, 'player', null, {
label: 'Player',
collisionFilter: { category: 0x0002, mask: 0x0004 }
});
let enemy = this.matter.add.sprite(200, 100, 'enemy', null, {
label: 'Enemy',
collisionFilter: { category: 0x0004, mask: 0x0002 }
});
Таким образом, player будет сталкиваться только с
объектами категории 0x0004, игнорируя все остальные.
pair.collision.supports можно получать координаты точек
соприкосновения, что важно для точной реакции на столкновение.collisionstart и collisionend идеально
подходят для одноразовых действий, а collisionactive — для
постоянного влияния на объекты.this.matter.world.createDebugGraphic() в Phaser позволяет
визуализировать все тела и точки контакта, упрощая настройку и
устранение ошибок.События Matter.js интегрируются с другими системами Phaser, например:
collisionstart, остановка при
collisionend.Использование этих событий позволяет строить сложную физическую логику, комбинируя точное отслеживание столкновений с визуальными и аудиоэффектами, создавая динамичные и интерактивные сцены.