计算玩家的新位置

时间:2012-06-06 07:49:17

标签: math position

编辑:我会解释我的问题,因为它很长(感谢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#中使用一个计时器

非常感谢

1 个答案:

答案 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)相同。