Отключить столкновение на лету в Box2D: не работает, когда объект уже сталкивается
Я пишу игру с Impactjs, и я использую Box2D в качестве физического движка (Box2DFlash, чтобы быть конкретным). Таким образом, есть движение от игрока, где он не должен сталкиваться с врагами. Чтобы достичь этого, фильтрация столкновений кажется лучшим методом.
Итак, я установил для противника крепость:
var shapeDef = new b2.PolygonDef();
shapeDef.filter.categoryBits = 0x0002;
И для игрока:
var shapeDef = new b2.PolygonDef();
shapeDef.filter.categoryBits = 0x0004;
Когда я хочу включить / выключить столкновение игрока с врагом, я вызываю эти функции:
ghost: function(){
this.setMaskBits( 0x0001 ); // only collide with boundary
},
deghost: function () {
this.setMaskBits( 0xFFFF ); // collide with everything
},
setMaskBits: function (bits) {
this.body.GetShapeList().m_filter.maskBits = bits;
}
И это работает... но только тогда, когда они не сталкиваются друг с другом. Та же проблема возникает, когда я смотрю на стену, и я устанавливаю биты категории на 0x0000
,
ОБНОВИТЬ
Хорошо, я исправил это с помощью грязного хака: проблема была в том, что контакты все еще существовали, поэтому я должен был как-то удалить их. Я попытался удалить их сначала вручную, но не получилось.
В Руководстве по Box2D написано:
Контакты разрушены с AABBs перестают перекрываться.
Поэтому я написал функцию, которая перемещает игрока примерно на 6 пикселей (наименьшее количество, которое, кажется, работает) в каталоге, с которым он сталкивается (если он не сталкивается со стеной в этот момент), это перекрывает сущности и решает проблему.
Вот эта функция:
changePosition: function (x,y) {
this.facingWall = false;
this.collision(); // will set facingWall to true if he's facing a wall.
if(!this.facingWall) {
this.body.m_xf.position.x = x;
this.body.m_xf.position.y = y;
}
}
2 ответа
Вы можете вызвать Refilter() для приборов, для которых были изменены параметры столкновения.
Хорошо, я исправил это с помощью грязного хака: проблема была в том, что контакты все еще существовали, поэтому я должен был как-то удалить их. Я попытался удалить их сначала вручную, но не получилось.
В Руководстве по Box2D написано:
Контакты разрушены с AABBs перестают перекрываться.
Поэтому я написал функцию, которая перемещает игрока примерно на 6 пикселей (наименьшее количество, которое, кажется, работает) в каталоге, с которым он сталкивается (если он не сталкивается со стеной в этот момент), это перекрывает сущности и решает проблему.
Вот эта функция:
changePosition: function (x,y) {
this.facingWall = false;
this.collision(); // will set facingWall to true if he's facing a wall.
if(!this.facingWall) {
this.body.m_xf.position.x = x;
this.body.m_xf.position.y = y;
}
}