我搜索过并找不到解决方案(也许我使用了错误的条款?),我觉得有点傻,因为我相信我忽略了一些简单的事情。这就是我想做的事情:
我的游戏中有一个物体需要在指定的帧数内行进特定的x距离。但是,我想让它轻松进入目标点,而不是每帧移动相同的距离/速度。
因此,不仅仅是将帧数除以距离,而是每帧应用该速度,我想让自己慢慢放松到指定帧数的目标坐标
所以例如(我很难解释,也许一个例子可以帮助)...说我有一个宇宙飞船,他需要向右移动32个像素。我想输入一个值,指定他将行进32像素...比如4帧。在一个线性系统中,他每帧移动8个像素,但我希望他能够轻松进入它,所以也许在第1帧(我使用的是完全随机的值)他会移动16个像素,第2帧他会移动10,第3帧他移动4,第4帧他移动2,他将最终在这4帧中移动32像素距离,慢慢地进入目标点。
首先想到的是以某种方式使用指数/对数,但我想要一些建议。任何帮助将不胜感激,谢谢! :d
答案 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);
}
}