0

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

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

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

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

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

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

我怎样才能使身体旋转平滑(触摸运动是慢还是快)?

4

1 回答 1

0

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

这是一段代码,可以简化您向某个点的旋转。我这可能有错误,因为我只是在此处的框中输入了它,但是您应该能够看到我的方法。作为一个额外的好处,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;      
于 2013-08-22T17:01:04.150 回答