通过旋转跟随精灵跟踪触摸点

时间:2015-07-13 11:53:39

标签: c++ cocos2d-x

我已经成功实现了在屏幕上拖动精灵,只需记住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看到它。

0 个答案:

没有答案