2014-06-19 1 views
4

Я пытаюсь настроить качели с помощью userdragable объектов. После создания мира в физике JS взаимодействие с мышью добавляетсяКак настроить интерактивные и неинтерактивные объекты в PhysicsJS?

world.add(Physics.behavior('interactive', { el: renderer.el })); 

, который отлично работает. Впоследствии, я хочу, чтобы некоторые добавленные объекты перетаскивались (объекты коробки). Но рычаг нельзя перетаскивать, но он должен взаимодействовать с коробками. Поэтому рычаг должен вращаться в соответствии с замененной коробкой. Fulcurm помещают в неинтерактивном образом, установив его свойство treatment в static:

world.add(Physics.body('convex-polygon', { 
     name: 'fulcrum', 
     x: 250, 
     y: 490, 
     treatment: 'static', 
     restitution: 0.0, 
     vertices: [ 
      {x: 0, y: 0}, 
      {x: 30, y: -40}, 
      {x: 60, y: 0}, 
     ] 
    })); 

Как объекты могут взаимодействовать друг с другом, но только некоторые из них userdragable?

скрипку доступен по адресу: http://jsfiddle.net/YM8K8/

+0

+1 за давая мне знать physicsJS, выглядит абсолютно круто :) – davidkonrad

+0

Это многообещающий физический движок. Кажется довольно активным, по сравнению с другими проектами. – alex

ответ

2

На данный момент это не поддерживается ... но это должно быть. Я добавил его как ошибку в github. https://github.com/wellcaffeinated/PhysicsJS/issues/101

В то же время, если вы хотите, вы можете создать новое «интерактивное» поведение путем копирования и вставки и просто изменить имя.

Physics.behavior('interactive-custom', function(parent){ ... 

Затем в функции захвата просто сделать это небольшое дополнение:

body = self._world.findOne({ $at: new Physics.vector(pos.x, pos.y) }); 

Изменение к:

body = self._world.findOne({ $at: new Physics.vector(pos.x, pos.y), $in: self.getTargets() }); 

Что это делает, когда он искал тело в координатах мыши, он также проверяет, находится ли это тело в наборе, к которому вы применили это поведение.

Тогда вместо того, чтобы добавлять поведение перед органами в вашей скрипке, добавьте его в конце концов, и сделать это:

world.add( 
    Physics.behavior('interactive-custom', { el: renderer.el }) 
     .applyTo(world.find({ name: 'box' })) 
); 

Это позволит использовать world.find найти тело в настоящее время в мире, которые имеют " Имя ящика. Затем он отправляет этот массив тел в поведение и говорит, что поведение применяется только к этим телам.

Вот модифицированная скрипка:

http://jsfiddle.net/wellcaffeinated/YM8K8/1/