我该如何实现一个缓慢平滑的背景滚动sdl
我想实现使用SDL 2的背景滚动。 据我所知,只能通过整数值移动源矩形。 当我每移动一次游戏循环时,我的滚动效果就会很好。 但我想慢一点。我尝试使用此代码我该如何实现一个缓慢平滑的背景滚动sdl
moved += speed;
if (moved >= 1.0) {
++src_rect.x;
moved -= 1;
}
这里moved
和speed
是double
s到移动。我希望我的背景移动速度慢十倍,因此我将speed
设置为0.1
。它确实移动了十倍,但动画不再流畅。它从一个像素跳到另一个像素,当速度很低时看起来和感觉都很难看。
我想让我的背景更大,并使用整数滚动它。也许当背景足够大时,1
的速度似乎会变慢。
有没有一种方法可以缓慢而平滑地同时滚动一个非常大的背景?
谢谢。
我会做的是有一组浮点数来跟踪虚拟屏幕的位置,然后当你实际渲染时你只需将浮点数转换为整数,这样你就永远不会失去浮点精度。
给你举个例子,我有一个SDL_Rect,我想把它移动到每一帧。我有一个追踪每一帧我会更新这些x和y位置,将它们转换成整数,然后渲染矩形的矩形的x和y位置,两个浮点变量,EX:
// Rect position
float XPos = 0.0f;
float YPos = 0.0f;
SDL_Rect rect = {0, 0, 64, 64};
// Update virtual positions
XPos += 20.0f * DeltaTime;
YPos += 20.0f * DeltaTime;
// Move rect down and to the right
rect.x = (int)XPos;
rect.y = (int)YPos;
虽然这并不能给你想要的确切结果,这是我知道要做到这一点的唯一方式,它会让你更准确地延迟你的动作,而不会让你在运动中变得丑陋,它也会让你添加更加精确的加速。希望这可以帮助。
我刚刚试过你的代码。也许你的代码比我的代码好,但动画仍然像颤抖一样,因为当每次迭代的速度都是“浮动”时,位移距离将会不同。因此浮动滚动不会平滑。 – sasha199568
为了解决这个问题,你可以考虑做一个添加,我的确这样做是因为它将每一帧的位置相乘,尝试添加一个平坦的浮动并且看看你得到了什么。 –
我试着用'1'滚动背景,用'5'滚动。当瓷砖在其前面移动五倍时,背景运动看起来很缓慢且平滑。也许只是让背景变大一点,用“1”来滚动它就是要走的路。 – sasha199568