从物理引擎中移除物体(球)

时间:2014-07-10 12:04:28

标签: famo.us

我一直试图删除已添加到物理引擎中的元素(球),但我找不到办法。

这是我用来将分子添加到物理引擎的代码:

  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()的实例。希望这是有道理的。

1 个答案:

答案 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);
    }
  }

同样,我知道这不是最好的方法,我会热衷于听取有更好解决方案的人的意见。 :)