Scroll 如何在sdl中实现缓慢平滑的背景滚动

Scroll 如何在sdl中实现缓慢平滑的背景滚动,scroll,bitmap,sdl,Scroll,Bitmap,Sdl,我正在尝试使用SDL2实现后台滚动。 据我所知,只能将源矩形移动整数值。 当我在游戏循环的每一次迭代中移动一次时,我的滚动效果很好。 但我想让它慢一点。我试着用这个代码移动它 moved += speed; if (moved >= 1.0) { ++src_rect.x; moved -= 1; } 这里的moved和speed是doubles。我希望我的背景移动速度慢十倍,因此我将速度设置为0.1。它的移动速度确实慢了十倍,但动

我正在尝试使用SDL2实现后台滚动。 据我所知,只能将源矩形移动整数值。 当我在游戏循环的每一次迭代中移动一次时,我的滚动效果很好。 但我想让它慢一点。我试着用这个代码移动它

    moved += speed;
    if (moved >= 1.0) {
        ++src_rect.x;
        moved -= 1;
    }
这里的
moved
speed
double
s。我希望我的背景移动速度慢十倍,因此我将
速度设置为
0.1
。它的移动速度确实慢了十倍,但动画不再平滑。它从一个像素跳到另一个像素,当速度低时,它看起来和感觉都很难看

我想把我的背景放大,用整数滚动。当背景足够大时,
1
的速度可能会变慢

有没有一种方法可以同时缓慢、平滑地滚动不太大的背景


谢谢。

我要做的是用一组浮点数来跟踪虚拟屏幕的位置,然后在实际渲染时将浮点数转换为整数,这样就不会丢失浮点数的精度

举个例子,我有一个SDL矩形,我想每帧移动一次。我有两个浮点变量跟踪rect的x和y位置,每帧我都会更新这些x和y位置,将它们转换为整数,然后渲染rect,例如:

   // 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; 

虽然这并不能给你想要的准确结果,但这是我知道的唯一一种方法,它可以让你更精确地延迟你的动作,而不会让你在动作中出现丑陋的块状,它还可以让你添加像更精确加速这样的东西。希望这能有所帮助。

我尝试按
1
滚动背景,按
5
平铺背景。当瓷砖在其前面移动快五倍时,背景运动看起来确实缓慢而平滑。也许只需要把背景放大一点,然后按
1
滚动就可以了。我刚刚试过你的代码。也许你的代码比我的好,但动画仍然像颤抖一样,因为当速度为
float
时,每次迭代的位移距离都会不同。因此,浮动滚动不会平滑。为了修复你可以考虑做一个加法,我的是这样做的,因为它增加了每个帧的位置,尝试添加一个平的浮点,看看你得到了什么。