2016-02-12 134 views
2

我想实现使用SDL 2的背景滚动。 据我所知,只能通过整数值移动源矩形。 当我每移动一次游戏循环时,我的滚动效果就会很好。 但我想慢一点。我尝试使用此代码我该如何实现一个缓慢平滑的背景滚动sdl

moved += speed; 
    if (moved >= 1.0) { 
     ++src_rect.x; 
     moved -= 1; 
    } 

这里movedspeeddouble s到移动。我希望我的背景移动速度慢十倍,因此我将speed设置为0.1。它确实移动了十倍,但动画不再流畅。它从一个像素跳到另一个像素,当速度很低时看起来和感觉都很难看。

我想让我的背景更大,并使用整数滚动它。也许当背景足够大时,1的速度似乎会变慢。

有没有一种方法可以缓慢而平滑地同时滚动一个非常大的背景?

谢谢。

+0

我试着用'1'滚动背景,用'5'滚动。当瓷砖在其前面移动五倍时,背景运动看起来很缓慢且平滑。也许只是让背景变大一点,用“1”来滚动它就是要走的路。 – sasha199568

回答

0

我会做的是有一组浮点数来跟踪虚拟屏幕的位置,然后当你实际渲染时你只需将浮点数转换为整数,这样你就永远不会失去浮点精度。

给你举个例子,我有一个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; 

虽然这并不能给你想要的确切结果,这是我知道要做到这一点的唯一方式,它会让你更准确地延迟你的动作,而不会让你在运动中变得丑陋,它也会让你添加更加精确的加速。希望这可以帮助。

+0

我刚刚试过你的代码。也许你的代码比我的代码好,但动画仍然像颤抖一样,因为当每次迭代的速度都是“浮动”时,位移距离将会不同。因此浮动滚动不会平滑。 – sasha199568

+0

为了解决这个问题,你可以考虑做一个添加,我的确这样做是因为它将每一帧的位置相乘,尝试添加一个平坦的浮动并且看看你得到了什么。 –