2

SFML を使用して C++ で基本的な小惑星ゲームを作成しようとしています。三角形 (プレイヤー) をかなり簡単に動かすことができますが、その動き方には満足できません。

現在、動き向いている方向に関連していません。たとえば、「w」を押して前方に移動すると、三角形は方向に関係なく単に画面を上に移動します。

私がしたいことは、「w」キーが押されたときに三角形が前方に移動することですが、実際の方向は、実際に向いている方向に対して (画面の寸法に関して) 移動します。

なので、三角形の先端が右を向いている場合、「W」​​を押すと右に移動します。この場合「S」を押すと左に移動します。「A」は上に移動し、もちろん「D」は下に移動します。

私の現在のコードはこれを少し達成していません.これには本当にハックな解決策があると思いますが、可能であれば、より数学的でエレガントな観点からアプローチしたいと思います.

では、これを達成するための最良の方法は何でしょうか?

関連するメソッドは 3 つあります。1 つはキーボード入力を処理するためのもの、もう 1 つはマウスの動きを処理するためのもの、そして更新メソッドです。


コード

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();
}
4

1 に答える 1

1

このゲームには2つのバージョンがあります。たとえば、「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;

左(または右)に移動するとき、および-=反対方向に移動するとき。

于 2012-10-04T17:01:17.097 に答える