0

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

答案不必特定于 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;
        }}

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

4

3 回答 3

2

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

鼠标关节的默认行为非常有弹性。您必须根据您的要求更改它。一套价值,我提供给你,对我有用。你检查你的一面。

mouseJointDef.bodyA = this.mGroundBody;
mouseJointDef.bodyB = body;
mouseJointDef.dampingRatio = 4f;
mouseJointDef.frequencyHz = 30;
mouseJointDef.maxForce = (1000.0f * body.getMass());
mouseJointDef.collideConnected = true;
于 2013-07-12T16:23:26.727 回答
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));

于 2013-07-12T17:33:22.827 回答
0

据我所知, setPosition 无济于事(因为身体会失去它的速度,这会影响碰撞)?

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

尝试这样的事情:

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 我不知道什么 timeUnit 是正确的,但我假设秒,所以 (1000 * way) / (seconds*1000) 应该是正确的)或者如果它完全可以工作,从未尝试过。

也许,你必须使用 setPosition(x,y) 以防TouchEvent.ACTION_DOWNbc 没有 a 身体不会移动TouchEvent.ACTION_MOVE并且你没有时间测量(除以零)

于 2013-07-12T16:22:57.533 回答