对象在指定帧数上减慢到目标坐标

时间:2013-12-02 18:15:12

标签: target easing

我搜索过并找不到解决方案(也许我使用了错误的条款?),我觉得有点傻,因为我相信我忽略了一些简单的事情。这就是我想做的事情:

我的游戏中有一个物体需要在指定的帧数内行进特定的x距离。但是,我想让它轻松进入目标点,而不是每帧移动相同的距离/速度。

因此,不仅仅是将帧数除以距离,而是每帧应用该速度,我想让自己慢慢放松到指定帧数的目标坐标

所以例如(我很难解释,也许一个例子可以帮助)...说我有一个宇宙飞船,他需要向右移动32个像素。我想输入一个值,指定他将行进32像素...比如4帧。在一个线性系统中,他每帧移动8个像素,但我希望他能够轻松进入它,所以也许在第1帧(我使用的是完全随机的值)他会移动16个像素,第2帧他会移动10,第3帧他移动4,第4帧他移动2,他将最终在这4帧中移动32像素距离,慢慢地进入目标点。

首先想到的是以某种方式使用指数/对数,但我想要一些建议。任何帮助将不胜感激,谢谢! :d

1 个答案:

答案 0 :(得分:0)

一般解决方案如下:

您有一个值(distanceTravelled),其范围为0.0到1.0。 你有一个函数(fancyCurve),它接受从0.0到1.0的浮点数,并将其重新映射为0.0到1.0,曲线除外。

每一帧,你增加的距离都会以线性量增加。但是你可以通过调用fancyCurve(distanceTravelled)获得实际值。

这是一个伪代码示例

float linearFunction(float t) { return t; }

float speedUpFunction(float t) { return t*t; }

float slowDownFunction(float t)
{
    //do your own research. Theres plenty of curves from http://easings.net/
}

float easingCurve(float t) {
    //choose one.
    //return linearFunction(t);
    //return speedUpFunction(t);
    return slowDownFunction(t);
}

int main() {
    //setting up a spaceship with starting x coordinate
    spaceshipX = 2;
    spaceshipTargetX = 34;
    animationFrames = 8;


    //Below is the actual algorithm
    distanceTravelled = 0;
    startValue = spaceshipX;
    animRange = spaceshipTargetX - startValue; // 32
    distancePerFrame = 1.0f / animationFrames; // 0.125, since 8 frames

    while (distanceTravelled < 1.0f) {
        WaitForEndOfFrame();
        distanceTravelled += distancePerFrame;
        spaceshipX = startValue + (easingCurve(distanceTravelled) * animRange);
    }
}