我已经成功实现了在屏幕上拖动精灵,只需记住touchbegan上的触摸位置并通过currentTouchPoint翻译精灵 - startingTouchPoint,这给了我很好的拖动效果。但现在我想用精灵跟踪我的手指,所以它也应该旋转。这将使我具有使用户能够旋转精灵以及只用一根手指拖动它的优势。
我得到了意想不到的结果,但我遇到了这段代码:
http://www.freeactionscript.com/2011/01/mouse-follow-with-easing-smooth-rotation-v2/
有一个演示,所以你可以在浏览器上试试。
它几乎和我需要的一样,除了精灵应该更快(一直靠近手指)并在到达目的地后停止而不是绕着轨道运行(同时保持触摸)。我试图将它移植到cocos2d-x,但它不起作用。好吧,updatePosition()看起来很好,精灵正在应该去的地方,但是updateRotation()是一团糟。它在奇怪的方向上旋转,有时甚至在相反的方向上形成一个非常快的圆圈。
onTouchBegan:
//check if any sprite is touched and then assign it to draggedItem
onTouchMove:
_destinationX = touchPoint.x;
_destinationY = touchPoint.y;
onTouchEnd:
//make draggedItem nullptr
void CreatorScene::update(float delta){
if(draggedItem != nullptr){
updateItemPosition();
updateItemRotation();
}
}
void CreatorScene::updateItemRotation()
{
// calculate rotation
_dx = draggedItem->getPositionX() - _destinationX;
_dy = draggedItem->getPositionY() - _destinationY;
// which way to rotate
float rad = atan2(_dy, _dx);
if(_dy < 0) rad += 2 * M_PI;
float rotateTo = CC_RADIANS_TO_DEGREES(rad);
// keep rotation positive, between 0 and 360 degrees
if (rotateTo > draggedItem->getRotation() + 180) rotateTo -= 360;
if (rotateTo < draggedItem->getRotation() - 180) rotateTo += 360;
// ease rotation
_trueRotation = (rotateTo - draggedItem->getRotation()) / ROTATE_SPEED_MAX;
// update rotation
draggedItem->setRotation(draggedItem->getRotation() + _trueRotation);
}
void CreatorScene::updateItemPosition()
{
// check if mouse is down
// if (_isActive)
// {
// update destination
// _destinationX = stage.mouseX;
// _destinationY = stage.mouseY;
// update velocity
_vx += (_destinationX - draggedItem->getPositionX()) / MOVE_SPEED_MAX;
_vy += (_destinationY - draggedItem->getPositionY()) / MOVE_SPEED_MAX;
// }
// else
// {
// // when mouse is not down, update velocity half of normal speed
// _vx += (_destinationX - _player.x) / _moveSpeedMax * .25;
// _vy += (_destinationY - _player.y) / _moveSpeedMax * .25;
// }
// apply decay (drag)
_vx *= DECAY;
_vy *= DECAY;
// if close to target, slow down turn speed
if (sqrtf((_dx*_dx)+(_dy*_dy)) < 50)
{
_trueRotation *= .5;
}
// update position
draggedItem->setPosition(draggedItem->getPosition() + Point(_vx, _vy));
}
这里有什么问题?我怎样才能实现如此平稳的运动?
编辑: 我想要完全实现的功能在这里: https://www.youtube.com/watch?v=RZouMyyNGG8 你可以在2:10看到它。