2017-01-02 10 views
2

Я пытаюсь использовать фильтрацию столкновений, как описано в "Matter.js body documentation". Однако для моего проекта мне нужно отключить коллизии между различными объектами Composite. Поэтому сталкиваются только те тела, которые находятся в одном и том же составе. Я планирую иметь более 32 композитов (32 - максимальное количество категорий столкновений, предоставляемых Matter.js). Как я могу это достичь?Matter.js отключить столкновение между различными композитами

// module aliases 
var Engine = Matter.Engine, 
    Render = Matter.Render, 
    World = Matter.World, 
    Bodies = Matter.Bodies, 
    Body = Matter.Body, 
    Vector = Matter.Vector, 
    Composite = Matter.Composite, 
    Constraint = Matter.Constraint, 
    MouseConstraint = Matter.MouseConstraint; 

// create an engine 
var engine = Engine.create(); 

// create a renderer 
var container = document.getElementById("container"); 
var canvas = document.getElementById("maincanvas"); 

var render = Render.create({ 
    element: container, 
    canvas: canvas, 
    engine: engine, 
    options: { 
     height: 400, 
     width: 400, 
     wireframes: false 
    } 
}); 

// This makes collision much easier to test 
engine.world.gravity = {x:0, y:0}; 

// Add a mouseconstraint to test 
var mc = MouseConstraint.create(engine, { 
    element: render.canvas 
}); 
Composite.add(engine.world, mc); 

var bodies1 = [] 
var bodies2 = [] 
var xpos = 30 
var ypos = 30 
for (var i = 0; i < 5; i++){ 
    bodies1.push(Bodies.circle(xpos, ypos, 10, { 
     collisionFilter: { 
      group:-1 
     }, 
     render: { 
      fillStyle: "blue" 
     } 
    }) 
    ); 
    xpos += 30; 
} 
for (var i = 0; i < 5; i++){ 
    bodies2.push(Bodies.circle(xpos, ypos, 10, { 
     collisionFilter: { 
      group:-1 
     }, 
     render: { 
      fillStyle: "red" 
     } 
    }) 
    ); 
    xpos += 30; 
} 

var composite1 = Composite.create(); 
Composite.add(composite1, bodies1); 
var composite2 = Composite.create(); 
Composite.add(composite2, bodies2); 

Composite.add(engine.world, [composite1, composite2]); 

Engine.run(engine); 
Render.run(render); 

Таким образом, я могу отключить столкновение между композитами, но это также отключает столкновения «внутри» композита. Я мог бы сделать это с помощью системы collisionFilter.category, но как это будет работать с более чем 32 композитами?

ответ

1

Нет поддержки для фильтрации столкновений на композитном уровне, вам нужно будет обрабатывать его на уровне тела. Чтобы упростить управление, просто создайте некоторые составные вспомогательные функции, например. compositeSetCollisionFilter(composite, filter) и итерации свыше Composite.allBodies(composite).

Что касается лимита в 32 категории, это связано с bitwise implementation (для исполнения, предположительно, хотя я сомневаюсь, что это имеет большое значение в действительности). Я поднял вопрос о проекте около reconsidering this.

На данный момент есть способ получить больше, если вы замените Matter.Detector.canCollide(filterA, filterB) своей функцией, которая может сравнивать два объекта body.collisionFilter. С этим вы можете использовать любую схему, которая вам нравится для body.collisionFilter объектов.