AndEgine / Box2D的,如何将动态物体,而无需使用鼠标合资?(AndEgine/Box2

2019-10-30 02:16发布

我已经尝试了很多寻找在屏幕上顺畅地移动动感的车身的解决方案。 鼠标接头不工作对我来说,它有橡皮筋效果不是流畅的动作非常有用。 我也曾尝试运用线性速度使球移动,但却无法做到这样。 怎么样才能使身体上的一个简单的触摸移动的选项? 例如,类似于夜光曲棍球?

答案不一定具体到AndEngine。 Cocos2D中会为我正常工作。

我已经注册触摸监听器,并试图移动身体上使用“移动”操作:

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;
        }}

身体不动,并在正确的方向,但如果手指动作快一点它运行从手指离开,随着速度的增加幅度。

Answer 1:

如果不使用物理身体的鼠标关节运动变得不那么容易。 如果更改鼠标的联合定义一些值,那么你一定得到你的愿望的效果。

鼠标接头的默认行为是如此的弹性。 你必须改变它按您的要求。 一个值而定,我提供给你,为我工作。 您检查您的身边。

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


Answer 2:

感谢大家的建议。 我终于得到它使用线性速度工作。 现在是相当顺利。 当用户尝试通过使用触摸屏移动身体,手指有时接触到身体,有时你必须从中逃脱。 所以,线速度是在两种情况下被分配:

  1. 当手指正在触摸的身体,而其移动(onAreaTouched)
  2. 当手指不接触身体,它仍然是移动(onSceneTouchEvent)

    在使用它都取得了运动流畅的事件下面几行:

    情况下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));



Answer 3:

据我可以看到它,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 i'don't知道什么TIMEUNIT是正确的,但我相信秒,所以(1000 *方式)/(秒* 1000)应该是正确的),或者如果它会在所有的工作,从来没有尝试过。

也许,你将不得不使用的情况下,setPosition两种(X,Y) TouchEvent.ACTION_DOWN BC身体没有一个不会动TouchEvent.ACTION_MOVE ,你有没有时间(被零除)测定



文章来源: AndEgine/Box2d-How to move a dynamic body without using mouse joint?