Отключить столкновение на лету в 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;
    }
  } 
Другие вопросы по тегам