我为 2D 策略游戏编写了一个自制的 view_port 类。平移(使用箭头键)和缩放(使用鼠标滚轮)工作正常,但我希望 View 也能回到光标所在的位置,如 Google Maps or Supreme Commander
我不会告诉你缩放是如何实现的细节,甚至我使用的是什么语言:这都是无关紧要的。重要的是缩放功能,它修改了代 TableView 的矩形结构(x,y,w,h)。到目前为止,代码如下所示:
void zoom(float delta, float mouse_x, float mouse_y)
{
zoom += delta;
view.w = window.w/zoom;
view.h = window.h/zoom;
// view.x = ???
// view.y = ???
}
在有人建议之前,以下将不是 工作:
view.x = mouse_x - view.w/2;
view.y = mouse_y - view.h/2;
这张照片说明了为什么,当我试图放大笑脸时:
正如您所看到的,当鼠标下方的对象放置在屏幕中央时,它不再位于鼠标下方,因此我们停止向其缩放!
如果你有数学头脑(你需要一个),任何帮助都将不胜感激!
最佳答案
我设法找到了解决方案,这要归功于很多令人头疼的小图片:我会在这里发布算法以防其他人需要它。
Vect2f mouse_true(mouse_position.x/zoom + view.x, mouse_position.y/zoom + view.y);
Vect2f mouse_relative(window_size.x/mouse_pos.x, window_size.y/mouse_pos.y);
view.x = mouse_true.x - view.w/mouse_relative.x;
view.y = mouse_true.y - view.h/mouse_relative.y;
这可确保放置在鼠标下方的对象停留在鼠标下方。您可以在 github 上查看代码,我还为 youtube 做了一个展示演示.
关于user-interface - 向鼠标缩放(例如谷歌地图),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9592115/