編集:非常に長いので、質問を要約します(指摘してくれてありがとう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# でタイマーを使用します
どうもありがとうございました