User interface 向鼠标缩放(如谷歌地图)
我已经为2D策略游戏编写了一个自制view_port类。平移(使用箭头键)和缩放(使用鼠标滚轮)工作正常,但我希望视图也朝向光标所在的位置,如中所示 我将不告诉您缩放是如何实现的,甚至我使用的语言的细节:这一切都无关紧要。重要的是缩放功能,它修改表示视图的矩形结构(x、y、w、h)。到目前为止,代码如下所示:User interface 向鼠标缩放(如谷歌地图),user-interface,scroll,mouse,zooming,User Interface,Scroll,Mouse,Zooming,我已经为2D策略游戏编写了一个自制view_port类。平移(使用箭头键)和缩放(使用鼠标滚轮)工作正常,但我希望视图也朝向光标所在的位置,如中所示 我将不告诉您缩放是如何实现的,甚至我使用的语言的细节:这一切都无关紧要。重要的是缩放功能,它修改表示视图的矩形结构(x、y、w、h)。到目前为止,代码如下所示: void zoom(float delta, float mouse_x, float mouse_y) { zoom += delta; view.w = window.
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;
这可确保放置在鼠标下的对象保持在鼠标下。您可以在上查看代码,我还为其制作了一个showcase演示。在我的概念中,有一个摄像头和一个屏幕。 照相机是运动部件。屏幕是可伸缩的部分 我制作了一个示例脚本,包括一个现场演示。 为了保持简单,问题被简化为一维。
对于2D示例,您可以简单地为高度和y位置添加相同的代码。您能详细说明变量的含义吗?这对我来说并不适用。仅当mouse.x和mouse.y为零时有效
var a = (mouse.x + camera.x) / zoom;
// now increase the zoom e.g.: like that:
zoom = zoom + 1;
var newPosition = a * zoom - mouse.x;
camera.setX(newPosition);
screen.setWidth(originalWidth * zoom);