AndEgine / Box2d-如何在不使用鼠标关节的情况下移动动态体?

时间:2013-07-12 09:56:08

标签: box2d andengine

我已经尝试了很多方法来找到在屏幕上平滑移动动态身体的解决方案。鼠标关节对我不起作用,它具有橡皮筋效果,对平滑运动无效。我也试图应用线性速度来使球移动,但不能这样做。在身体上进行简单的触摸运动有哪些选择?例如,类似于Glow Hockey?

答案无需特别针对AndEngine。 Cocos2d也适合我。

我已经注册了Touch监听器,并尝试使用以下方式移动“移动”操作:

public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
         switch(pSceneTouchEvent.getAction()){
         case TouchEvent.ACTION_DOWN:

             break;
            case TouchEvent.ACTION_MOVE:
                strikerBody.setLinearVelocity((pSceneTouchEvent.getX()-strikerBody.getPosition().x * PIXEL_TO_METER_RATIO_DEFAULT),(pSceneTouchEvent.getY()-strikerBody.getPosition().y * PIXEL_TO_METER_RATIO_DEFAULT));

                break;
            case TouchEvent.ACTION_UP:

                 break;
            default:
                break;
        }}

身体确实朝着正确的方向移动,但如果手指移动得快一点,它就会远离手指,因为速度的大小会增加。

3 个答案:

答案 0 :(得分:2)

不使用鼠标关节运动的物理体不会变得那么容易。 如果你在鼠标关节定义中改变一些值,那么你肯定会得到你想要的效果。

鼠标关节的默认行为是如此有弹性。您必须根据您的要求进行更改。 一个价值集,我提供给你的工作。那你检查一下。

mouseJointDef.bodyA = this.mGroundBody;
mouseJointDef.bodyB = body;
mouseJointDef.dampingRatio = 4f;
mouseJointDef.frequencyHz = 30;
mouseJointDef.maxForce = (1000.0f * body.getMass());
mouseJointDef.collideConnected = true;

答案 1 :(得分:1)

感谢大家的建议。我终于使用线性速度工作了。现在很顺利。 当用户尝试使用触摸在屏幕上移动身体时,手指有时会触摸身体,偶尔会远离身体。因此,在两种情况下分配线速度:

  1. 当手指移动时手指触摸身体( onAreaTouched
  2. 当手指没有接触到身体并且它仍在移动时( onSceneTouchEvent

    在两个事件中使用以下行,使移动平稳:

    case TouchEvent.ACTION_MOVE: body.setLinearVelocity((pSceneTouchEvent.getX() - body.getPosition()。x * PIXEL_TO_METER_RATIO_DEFAULT),(pSceneTouchEvent.getY() - body.getPosition()。y * PIXEL_TO_METER_RATIO_DEFAULT));

答案 2 :(得分:0)

据我所知,setPosition不会有帮助(因为身体会失去它的速度,这会影响碰撞)?

测量两个触摸事件之间的时间并根据它计算速度,因为速度是方式/时间,而你的velo只是方式(有恒定的时间) - 这可以解释快速手指运动期间的低速度,不会不是吗?

尝试这样的事情:

public class YourTouchListener {
  long lastTouch = 0;
  public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, 
    final ITouchArea pTouchArea, final float pTouchAreaLocalX, 
    final float pTouchAreaLocalY) {

      switch(pSceneTouchEvent.getAction()){
      case TouchEvent.ACTION_DOWN:
        this.lastTouch = System.currentTimeMillis();
        break;
      case TouchEvent.ACTION_MOVE:
        long time = System.getCurrentTimeMillis() - lastTouch;
        if (time > 0)
          strikerBody.setLinearVelocity(
            1000* (pSceneTouchEvent.getX() - strikerBody.getPosition().x * 
              PIXEL_TO_METER_RATIO_DEFAULT)/time,               
            1000 * (pSceneTouchEvent.getY()-strikerBody.getPosition().y * 
              PIXEL_TO_METER_RATIO_DEFAULT)/time);
        break;
      case TouchEvent.ACTION_UP:
        this.lastTouch = 0;
        break;
      default:
        break;
    }
  }
}

我不能保证,这在第一次尝试时是正确的(bc我不知道什么时候单位是正确的,但我假设秒,所以(1000 *方式)/(秒* 1000)应该是正确的)或者它是否会起作用,从未尝试过。

也许,你必须在TouchEvent.ACTION_DOWN bc的情况下使用setPosition(x,y)bc在没有TouchEvent.ACTION_MOVE的情况下身体不会移动而你没有时间测量(除以零)