编辑:我会解释我的问题,因为它很长(感谢Len指出来)
我想要找到的是在X时间后获得一名球员的新位置。 以下变量是已知的: - 速度 - 2点之间的长度 - 来源位置(X,Y) - 目的地位置(X,Y)
如何使用这些变量计算源和destion之间的位置?
例如:
来源: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个,并且唯一的变化是sin和cos。
给定的速度参数是速度/秒。
上面的代码有效但你可以看到它很长,所以我正在寻找一种新的计算方法。
顺便说一句,不介意用while循环来计算每个新位置我将在C#中使用一个计时器
非常感谢
答案 0 :(得分: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)
相同。