问题描述
我的用例是需要使用SDL构建大型表。而且我正在寻找与浏览器一样的平滑滚动。有人知道吗?如何在SDL中实现平滑滚动?我尝试了SDL_MouseWheel事件。但看起来并不流畅。
解决方法
如果目标设备具有“模拟y”输入法(例如触摸屏或触控板),则可以找到使用它的最流畅的主观滚动体验。也许SDL_TouchFingerEvent
或SDL_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 缓慢地观察视口,而不是直接进入我想要的位置。实际上,我个人根本不喜欢平滑滚动,通常为了立即获得反馈而将其关闭;因此,如果此表除了您之外还有其他用户,则在投入大量精力之前,请务必先考虑一下他们的个人品味。