在SDL中平滑滚动

问题描述

我的用例是需要使用SDL构建大型表。而且我正在寻找与浏览器一样的平滑滚动。有人知道吗?如何在SDL中实现平滑滚动?我尝试了SDL_MouseWheel事件。但看起来并不流畅。

解决方法

如果目标设备具有“模拟y”输入法(例如触摸屏或触控板),则可以找到使用它的最流畅的主观滚动体验。也许SDL_TouchFingerEventSDL_MultiGestureEvent会为您提供所需的东西。

如果您需要使用的是传统的带槽滚轮,则需要进行插补,如@keltar所建议的那样。

最简单的方法是随着时间的推移线性变化,就像

/* on mouse wheel event received */
if (event.type == SDL_MOUSEWHEEL)
{
  targetScrollPosition += event.wheel.y * MY_SCROLL_SENSITIVITY;
}

/* each frame,animate scroll */
if (visibleScrollPosition < targetScrollPosition)
{
  visibleScrollPosition += MY_SCROLL_SPEED;
} 
else if (visibleScrollPosition > targetScrollPosition)
{
  visibleScrollPosition -= MY_SCROLL_SPEED;
}

但是,您会发现这并不平滑,并且对快速滚动并不友好,因此您需要研究立方或其他方法。

这里是一些带有代码示例的背景知识。 http://paulbourke.net/miscellaneous/interpolation/

请记住,用户可以在动画过程中向任一方向进一步滚动,因此它需要始终跟随所需的位置。没有什么比向下滚动然后向上滚动令人沮丧的了,然后 then 缓慢地观察视口,而不是直接进入我想要的位置。实际上,我个人根本不喜欢平滑滚动,通常为了立即获得反馈而将其关闭;因此,如果此表除了您之外还有其他用户,则在投入大量精力之前,请务必先考虑一下他们的个人品味。