javascript – 如何在PhysicsJS中设置交互式和非交互式对象?

我正在尝试使用userdragable对象设置跷跷板.在PhysicsJS中创建世界之后,添加鼠标拖动交互

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

哪个工作正常.随后,我想要一些可添加的对象可以拖动(框对象).但杠杆不应该是可拖动的,但它应该与盒子相互作用.因此杠杆应根据更换的盒子旋转.通过将其处理属性设置为静态,以非交互方式放置fulcurm:

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},
        ]
    }) );

对象如何相互交互,但只有一些是用户可扩展的?

小提琴可在:http://jsfiddle.net/YM8K8/

最佳答案 目前这不受支持……但它应该是.我在github上添加了它作为bug.
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/

点赞