1

編集:非常に長いので、質問を要約します(指摘してくれてありがとうLen)

私が見つけようとしているのは、X 時間後にプレーヤーの新しい位置を取得することです。次の変数が既知です。 - 速度 - 2 点間の長さ - ソース位置 (X、Y) - 宛先位置 (X、Y)

これらの変数を指定して、ソースと宛先の間の位置を計算するにはどうすればよいですか?

例えば:

ソース: 0、0 宛先: 10、0 速度: 1

したがって、1 秒後にプレイヤーの位置は 1, 0 になります。

以下のコードは機能しますが、かなり長いので、より短い/より論理的なものを探しています

================================================== ====================

ゲーム内でプレーヤーの新しい位置を計算する方法を理解するのに苦労しています。

このコードは、プレーヤーを追跡するためにサーバー側で使用されます (これはエミュレーターであるため、クライアント コードにはアクセスできません)。

サーバーの衝突検出は正常に機能します。bresenham のライン アルゴリズムとレイキャストを使用して、衝突が発生するポイントを特定しています。

衝突を特定したら、プレイヤーが歩こうとしている経路の長さと合計時間を計算します。

プレーヤーの毎秒の新しい位置を知りたいです。

これは私が現在使用しているコードです。これは C++ ですが、サーバーを C# に移植していて、まだ C# でコードを書いていません。

        // Difference between the source X - destination X 
        //and source y - destionation Y
        float xDiff, yDiff;

        xDiff = xDes - xSrc;
        yDiff = yDes - ySrc;

        float walkingLength = 0.00F;

        float NewX = xDiff * xDiff;
        float NewY = yDiff * yDiff;

        walkingLength = NewX + NewY;

        walkingLength = sqrt(walkingLength);



        const float PI = 3.14159265F;
        float Angle = 0.00F;

        if(xDes >= xSrc && yDes >= ySrc)
        {
            Angle = atanf((yDiff / xDiff));
            Angle = Angle * 180 / PI;
        }
        else if(xDes < xSrc && yDes >= ySrc)
        {
            Angle = atanf((-xDiff / yDiff));
            Angle = Angle * 180 / PI;
            Angle += 90.00F;
        }
        else if(xDes < xSrc && yDes < ySrc)
        {
            Angle = atanf((yDiff / xDiff));
            Angle = Angle * 180 / PI;
            Angle += 180.00F;
        }
        else if(xDes >= xSrc && yDes < ySrc)
        {
            Angle = atanf((xDiff / -yDiff));
            Angle = Angle * 180 / PI;
            Angle += 270.00F;
        }

        float WalkingTime = (float)walkingLength / (float)speed;



        bool Done = false;
        float i = 0;
        while(i < walkingLength)
        {
            if(Done == true)
            {
                break;
            }
            if(WalkingTime >= 1000)
            {
                Sleep(1000);
                i += speed;
                WalkTime -= 1000;
            }
            else
            {
                Sleep(WalkTime);
                i += speed * WalkTime;
                WalkTime -= 1000;
                Done = true;
            }

            if(Angle >= 0 && Angle < 90)
            {
                float xNew = cosf(Angle * PI / 180) * i;
                float yNew = sinf(Angle * PI / 180) * i;

                float NewCharacterX = xSrc + xNew;
                float NewCharacterY = ySrc + yNew;
            }

ループの最後の部分をカットしました。これは、他の 3 つの角度条件を持つ他の 3 つの if ステートメントであり、唯一の変更は sin と cos であるためです。

指定された速度パラメーターは速度/秒です。

上記のコードは機能しますが、ご覧のとおりかなり長いので、これを計算する新しい方法を探しています。

ところで、それぞれの新しい位置を計算する while ループを気にしないでください C# でタイマーを使用します

どうもありがとうございました

4

1 に答える 1

1

角度を忘れてください。三角法は、コードと時間の両方を消費します。代わりにベクトルを使用する必要があります。

これがあなたのコードの書き直しです:

float xDiff = xDes - xSrc;
float yDiff = yDes - ySrc;

// Euclidean distance from source to destination
float walkingLength = sqrt(xDiff * xDiff + yDiff * yDiff);

float WalkingTime = walkingLength / speed;

bool Done = false;
float i = 0;
while(i < walkingLength && !Done)
{
    if(WalkingTime >= 1f)
    {
        Sleep(1000);
        i += speed;
        WalkingTime -= 1f;
    }
    else
    {
        Sleep((int) (WalkingTime * 1000f));
        i += speed * WalkingTime;
        WalkingTime -= 1f;
        Done = true;
    }

    float xNew = xDiff / walkingLength * i;
    float yNew = yDiff / walkingLength * i;

    float NewCharacterX = xSrc + xNew;
    float NewCharacterY = ySrc + yNew;
}

xDiff / walkingLengthコードと同じにcosf(Angle * PI / 180)なります。

于 2012-06-06T22:35:53.530 に答える