【问题标题】:AndEngine-Rotate a Steering Wheel like body using TouchAndEngine - 使用 Touch 旋转像身体一样的方向盘
【发布时间】:2013-08-25 11:59:12
【问题描述】:

我有一个必须在触摸时旋转的身体。不需要直线运动,它们的身体只需要沿着一个轴点旋转。

我在 onAreaTouched 事件中使用 setTransform 来旋转身体。像这样:

body.setTransform(body.getPosition(),((float)Math.atan2(-(pSceneTouchEvent.getX() - startX), (pSceneTouchEvent.getY() - startY)))); 

这是在“移动”操作中完成的。 StartX 和 StartY 表示起始 X 和 Y 点。在上述代码行之后,它们被重置,如:

startX = pSceneTouchEvent.getX();
startY = pSceneTouchEvent.getY();

如果触摸移动的速度很慢,代码确实会旋转身体,但身体会在旋转时抖动。随着触摸的更快移动,身体会顺畅地旋转。

如何让身体旋转顺畅(触摸动作是慢还是快)?

【问题讨论】:

    标签: box2d andengine


    【解决方案1】:

    使用触摸事件设置目标角度。然后使用 onUpdate 向目标角度缓和。

    这是一个 sn-p 代码,可以简化您向某个点的旋转。我这可能有错误,因为我只是在此处的框中输入了它,但是您应该能够看到我的方法。作为一个额外的好处,Math.atan() 的东西将确保它总是转向触摸事件的最短方向跳过一点:

    // SET THIS IN YOUR TOUCH EVENT
    // Rotate towards Touch.
    Float RADIANS_TO_DEGREES = 57.2957795;
    Float DEGREES_TO_RADIANS = 0.0174532925;
    Float EASE_AMOUNT = 0.05;
    PointF p = new PointF(body.x, body.y); // Save this as instance var so it persists.
    p.x -= pSceneTouchEvent.getX();
    p.y -= pSceneTouchEvent.getX();
    
    // THIS PART GOES IN THE ON UPDATE
    Float originalrotation = body.getRotation() * DEGREES_TO_RADIANS;
    Float targetrotation = Math.atan2(p.y, p.x);
    Float rotationdifference = Math.atan2(Math.sin(targetrotation-originalrotation),Math.cos(targetrotation-originalrotation));
    
    // To ease, we apply only a percentage of the rotation needed.
    circle.rotation += rotationdifference*RADIANS_TO_DEGREES* EASE_AMOUNT;      
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多