在famo.us中两个可拖动表面之间的弹簧

时间:2014-05-30 12:04:24

标签: javascript famo.us

我试图实现两个与弹簧连接的表面,这些表面会对famo.us中的拖动作出反应。到目前为止,我已经设置了曲面,可以拖动它们,有一个弹簧在页面加载过程中进行交互,但不是拖动。所以问题是:a)我应该如何用弹簧连接两个表面?b)当我拖动一个表面以便另一个表面跟随拖动表面时如何更新物理?

到目前为止,我的代码是

define(function(require) {

  var Engine          = require('famous/core/Engine');
  var Surface         = require('famous/core/Surface');
  var StateModifier   = require('famous/modifiers/StateModifier');
  var PhysicsEngine   = require('famous/physics/PhysicsEngine');
  var Circle          = require('famous/physics/bodies/Circle');
  var Draggable       = require('famous/modifiers/Draggable');
  var Spring          = require('famous/physics/forces/Spring');
  var Vector          = require('famous/math/Vector');

  var context = Engine.createContext();
  var physicsEngine = new PhysicsEngine();

  var ball = new Surface ({
    size: [100,100],
    properties: {
          backgroundColor: 'red',
          borderRadius: '50px'
    }
  });

  var ball2 = new Surface ({
    size: [100,100],
    properties: {
          backgroundColor: 'blue',
          borderRadius: '50px'
    }
  });

  var draggable = new Draggable();
  var draggable2 = new Draggable();

  ball.state = new StateModifier({origin:[0.2,0.2]});
  ball2.state = new StateModifier({origin:[0.3,0.3]});

  ball.particle = new Circle({radius:100});
  ball2.particle = new Circle({radius:100});

  var spring = new Spring({
      anchor:         ball.particle,
      period:         400,  // <= Play with these values :-)
      dampingRatio:   0.07, // <=
      length:         50
  });
//    var spring2 = new Spring({anchor: ball2.particle});

//    physicsEngine.attach(spring, ball2.particle);
//    physicsEngine.attach(spring2, ball.particle);

  draggable.subscribe(ball);
  draggable2.subscribe(ball2);

  draggable.on('update', function() {
      console.info('update');
      ball2.particle.applyForce(new Vector(0, 0, -0.005 * 100));
//        ball.state.setTransform(ball.particle.getTransform())
//        ball.state.setTransform(ball.particle.getTransform())
//        ball.particle.setVelocity([0.001,0,0]);
//        physicsEngine.wake();
//        physicsEngine.step();
  });
  draggable2.on('update', function() {
//        ball2.particle.setVelocity([0.001,0,0]);
//        console.info('update');
//        physicsEngine.wake();
//        physicsEngine.step();
  });


  physicsEngine.attach(spring, ball2.particle);
//    spring.applyForce(ball.particle);
  physicsEngine.addBody(ball.particle);
  physicsEngine.addBody(ball2.particle);


//    ball.on("click",function(){
//      ball.particle.setVelocity([10,0,0]);
//    });
//
//    ball2.on("click",function(){
//      ball2.particle.setVelocity([0,10,0]);
//    });

  context.add(draggable).add(ball.state).add(ball);
  context.add(draggable2).add(ball2.state).add(ball2);

  Engine.on('prerender', function(){
    ball.state.setTransform(ball.particle.getTransform());
    ball2.state.setTransform(ball2.particle.getTransform());
  });

});

1 个答案:

答案 0 :(得分:3)

到目前为止,您似乎对PE非常了解。我仍然可以看到一些你可以改进的地方。这是一个附加弹簧拖动的工作示例。虽然这个实现还不完善,但它应该让你开始..如果你开始拖动红色圆圈,一切都按预期工作.Draggable有自己的位置,粒子也是如此。因此,当您抓住蓝色圆圈时,粒子中仍然存在偏移。这是什么让你95%..

希望有所帮助......

var Engine          = require('famous/core/Engine');
var Surface         = require('famous/core/Surface');
var Transform       = require('famous/core/Transform');
var Modifier        = require('famous/core/Modifier');

var Draggable       = require('famous/modifiers/Draggable');

var PhysicsEngine   = require('famous/physics/PhysicsEngine');
var Circle          = require('famous/physics/bodies/Circle');
var Spring          = require('famous/physics/forces/Spring');

var context = Engine.createContext();
var physicsEngine = new PhysicsEngine();

var ball = new Surface ({
  size: [100,100],
  properties: {
        backgroundColor: 'red',
        borderRadius: '50px'
  }
});

var ball2 = new Surface ({
  size: [100,100],
  properties: {
        backgroundColor: 'blue',
        borderRadius: '50px',
  }
});

ball.mod = new Modifier({origin:[0.5,0.5]});
ball.draggable = new Draggable();
ball.pipe(ball.draggable);
ball.particle = new Circle({radius:100});
ball.mod.transformFrom(function(){ return Transform.translate(0,0,0) });

ball.spring = new Spring({
  anchor:         ball.particle,
  period:         400,
  dampingRatio:   0.07,
  length:         50
});

ball2.mod = new Modifier({origin:[0.5,0.5]});
ball2.draggable = new Draggable();
ball2.pipe(ball2.draggable);
ball2.particle = new Circle({radius:100});
ball2.mod.transformFrom(function(){ return ball2.particle.getTransform()});

ball2.spring = new Spring({
  anchor:         ball2.particle,
  period:         400,
  dampingRatio:   0.07,
  length:         50
});

ball.draggable.on('start',function(){

  ball2.setProperties({pointerEvents:'none'});

  if (ball2.springID) physicsEngine.detach(ball2.springID);
  if (ball.springID) physicsEngine.detach(ball.springID);

  ball.springID = physicsEngine.attach(ball.spring, ball2.particle);
  ball2.springID = null;

  ball.mod.transformFrom(function(){ return Transform.translate(0,0,0) });
  ball2.mod.transformFrom(function(){ return ball2.particle.getTransform()});

})

ball.draggable.on('update', function() {
    pos = ball.draggable.getPosition();
    ball.particle.setPosition(pos);
});

ball.draggable.on('end', function() {
  ball2.setProperties({pointerEvents:'all'});
});

ball2.draggable.on('start',function(){

  ball.setProperties({pointerEvents:'none'});

  if (ball2.springID) physicsEngine.detach(ball2.springID);
  if (ball.springID) physicsEngine.detach(ball.springID);

  ball2.springID = physicsEngine.attach(ball2.spring, ball.particle);
  ball.springID = null;

  ball2.mod.transformFrom(function(){ return Transform.translate(0,0,0) });
  ball.mod.transformFrom(function(){ return ball.particle.getTransform()});

})

ball2.draggable.on('update', function() {
    pos = ball2.draggable.getPosition();
    ball2.particle.setPosition(pos);
});

ball2.draggable.on('end', function() {
  ball.setProperties({pointerEvents:'all'});
});

ball.springID = physicsEngine.attach(ball.spring, ball2.particle);

physicsEngine.addBody(ball.particle);
physicsEngine.addBody(ball2.particle);

context.add(ball.mod).add(ball.draggable).add(ball);
context.add(ball2.mod).add(ball2.draggable).add(ball2);