Box2d setTransform

时间:2015-10-13 04:59:29

标签: java android ios libgdx box2d

设置场景: •我们的环境:LibGdx Android& iOS //如果你不了解LibGdx,那很好,只要知道这个程序是为iOS和Android构建的

•我们的屏幕上没有任何内容,只有Box2d Circle

好的,那么,我需要做什么? 我需要将我的Box2d Circle变为"传送"屏幕被点击的地方...但我需要它有一些速度,所以如果它与其他东西发生碰撞,它会抛弃另一个物体。

我目前正在使用body.setTransform(),但我没有速度,人们说这是非常错误的。

我该怎么做?谢谢!

1 个答案:

答案 0 :(得分:2)

setTransform 方法本身并不是错误的。 由于忽略了

时出现的物理因素,可能会造成一些麻烦
  • 使用关节 - 关节提供一些约束,这种“暴力”变化会使身体表现得很奇怪
  • 碰撞存在 - 因为转化的身体可以“推”到其他身体

您正在描述的情况是使用 setTransform 时的完全典型情况,我认为没有理由害怕它。你也不需要任何速度。

但是,如果您决定将“传送”机制更改为应用速度将对象移动到世界点,您应该:

  • 通过减去目标位置和身体位置来计算速度矢量

    Vector2 velocity = target.sub( body.getPosition() ) ); //where target is Vector2 of touched point
    
  • 将速度限制到某个最大值我猜如果你需要(这是可选的)

    //optional
    velocity.nor();
    velocity.mul( MAX_VALUE ); //MAX_VALUE is a float
    
  • 将速度设置为正文

    body.setLinearVelocity( velocity );
    
  • 添加到主循环(渲染方法)检查​​主体是否处于目标位置(或在某个范围内 - 由于精度,如果您将限制速度,它很可能精确地在目标位置 - 如果不是我猜它应该在world.update())的一次迭代后处于目标位置

    if( body.getPosition().sub( target ).len() < SOME_PRECISION )
    {
        body.setLinearVelocity( new Vector2(0, 0) );
    }
    

你也可以看一下Box2D MouseJoint,虽然我从来没有使用过这个,但不能提供任何提示。