我一直试图删除已添加到物理引擎中的元素(球),但我找不到办法。
这是我用来将分子添加到物理引擎的代码:
var numBodies = 15;
function _addMolecules() {
for (var i = 0; i < numBodies; i++) {
var radius = 20;
var molecule = new Surface({
size: [radius * 2, radius * 2],
properties: {
borderRadius: radius + 'px',
backgroundColor: '#'+(0x1000000+(Math.random())*0xffffff).toString(16).substr(1,6)
}
});
molecule.body = new Circle({
radius: radius,
mass: 2
});
this.pe.addBody(molecule.body);
this.molecules.push(molecule);
this.moleculeBodies.push(molecule.body);
molecule.state = new Modifier({origin: [0.5, 0.5]});
//** This is where I'm applying the gravity to the balls and also where I'm checking the position of each ball
molecule.state.transformFrom(addBodyTransform.bind(molecule.body));
this._add(molecule.state).add(molecule);
}
}
并且在addBodyTransform函数中我将重力添加到球并检查它们的位置,对于视口顶部之外的任何部分我想完全删除它(我只使用视口左侧,右侧和底部边缘的墙壁。)
function addBodyTransform() {
var pos;
for (var i = 0; i < thisObj.moleculeBodies.length; i++) {
pos = thisObj.moleculeBodies[i].getPosition();
if(pos[1]<(-windowY/2)){
//I tried this but it doesn't work
thisObj.pe.removeBody(thisObj.moleculeBodies[i]);
thisObj.moleculeBodies[i].render = function(){ return null; };
}
}
thisObj.gravity.applyForce(this);
return this.getTransform();
}
它不起作用。我尝试了其他一些东西,但没有运气。而改变上述功能球的位置工作正常:
thisObj.moleculeBodies[i].setPosition([0, 0]);
有没有人知道如何移除身体(在这种情况下是一个圆圈)?
P.S。:thisObj是变量I&m 39指定&#34; this&#34;对象在构造函数中,thisObj.pe是PhysicsEngine()的实例。希望这是有道理的。
答案 0 :(得分:1)
经过一番调查,使用未经授权的源代码并尝试不同的东西,我意识到库中有一些奇怪的东西。
看一下存储库,我发现函数_getBoundAgent在定义之前就被使用了,它与我得到的错误相匹配(你可以在这里查看:https://travis-ci.org/Famous/physics)。所以看起来它是Famo.us源代码中的一个错误。希望它将在下一个版本中修复。
目前,我不得不创建一个hack,它基本上将所有代理(以及重力)从视口外部的球中分离,并将它们(固定)位置设置在视口外(约-2000px)在两个方向)。
我知道这不是最好的方法(确实是一个肮脏的方法),但是如果你遇到同样的问题并且想要使用它直到他们发布了修复,那么我就是这样做的:
function addBodyTransform() {
var pos = this.body.getPosition();
//Check if balls are inside viewport
if(pos[1]<(-(windowY/2)-100)){
if(!this.removed){
//flagging ball so the code below is executed only once
this.removed = true;
//Set position (x and y) of the ball 2000px outside the viewport
this.body.setPosition([(-(windowX/2)-2000), (-(windowY/2)-2000)]);
}
return this.body.getTransform();
}else{
//Add gravity only if inside viewport
thisObj.gravity.applyForce(this.body);
return this.body.getTransform();
}
}
在_addMolecules函数上,我添加了&#34; molecule.removed = false&#34;:
function _addMolecules() {
for (var i = 0; i < numBodies; i++) {
...
molecule.state = new Modifier({origin: [0.5, 0.5]});
//Flagging molecule so I know which ones are removed
molecule.removed = false;
molecule.state.transformFrom(addBodyTransform.bind(molecule));
this._add(molecule.state).add(molecule);
}
}
同样,我知道这不是最好的方法,我会热衷于听取有更好解决方案的人的意见。 :)