定向运动计算算法

时间:2012-10-04 16:46:30

标签: c++ rotation trigonometry sfml

我正在尝试使用SFML在C ++中编写一个基本的Asteroids游戏。虽然我能够轻松地移动我的三角形(玩家),但它移动的方式我并不十分满意。

目前,运动相对于其面向的方向 。例如,如果我按“w”向前移动,三角形将只是向上移动屏幕,无论其方向如何。

我想要三角形做的是在按下“w”键时向前移动,但是使实际方向相对于其面向的实际方向移动(相对于屏幕的尺寸)。

因此,如果三角形的前端朝向右侧,当按下“W”时,它将向右移动。如果在这种情况下按下“S”,它将向左移动。 “A”会让它向上移动,当然“D”会让它向下移动。

我目前的代码没有完成这一点 - 我认为这有一个真正的 hacky解决方案,但如果可能的话,我宁愿从更加数学和优雅的角度来解决这个问题。

那么,实现这一目标的最佳方式是什么?

我有三种相关方法:一种用于处理键盘输入,另一种用于处理鼠标移动,以及更新方法。


代码

void Game::OnKeyPress( void )
{
    int count = 0;

    const float playerCenterMag = Magnitude( mPlayer.GetShape().GetCenter() );
    //Shoddy attempt resulting in absolutely nothing of note
    const float moveRateX = ( cosf( mMouseAoR ) * playerCenterMag ) + mPlayer.MoveSpeed;
    const float moveRateY = ( sinf( mMouseAoR ) * playerCenterMag ) + mPlayer.MoveSpeed;

    if ( mInput.IsKeyDown( sf::Key::W ) ) // Up
    {
        mPlayer.Position.y -= moveRateY;
        ++count;
    }

    if ( mInput.IsKeyDown( sf::Key::S ) ) // Down
    {
        mPlayer.Position.y += moveRateY;
        ++count;
    }

    if ( mInput.IsKeyDown( sf::Key::A ) ) // Left
    {
        mPlayer.Position.x -= moveRateX;
        ++count;
    }

    if ( mInput.IsKeyDown( sf::Key::D ) ) // Right
    {
        mPlayer.Position.x += moveRateX;
        ++count;
    }

    std::cout << "Key Press Rate => " << count << " seconds" << std::endl;
}

void Game::OnMouseEvent( void )
{
    mPlayer.GetShape().Rotate( mMouseAoR + 5 );
}

void Game::Update( void )
{
    const int x = mInput.GetMouseX();
    const int y = mInput.GetMouseY();

    mMouseAoR = ( y == 0 ) ? 0
                           : tanf( x / y );

    PrintInfo();
}

1 个答案:

答案 0 :(得分:1)

这个游戏有两个版本。如果你想要'W'向前“推进”,那么你需要在每个周期添加moveRate并使用W来改变速率。

显然,只有按下按钮才会移动,所以你需要同时更新X和Y:

if ( mInput.IsKeyDown( sf::Key::W ) ) // Up
{
    mPlayer.Position.x += moveRateX;
    mPlayer.Position.y += moveRateY;
    ++count;
}

moveRate根据方向而变化。横向移动时,你会这样做

    mPlayer.Position.x += moveRateY;
    mPlayer.Position.y += moveRateX;
向左(或向右)移动时

,向另一个方向移动-=