Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface 向鼠标缩放(如谷歌地图)_User Interface_Scroll_Mouse_Zooming - Fatal编程技术网

User interface 向鼠标缩放(如谷歌地图)

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.

我已经为2D策略游戏编写了一个自制view_port类。平移(使用箭头键)和缩放(使用鼠标滚轮)工作正常,但我希望视图也朝向光标所在的位置,如中所示

我将不告诉您缩放是如何实现的,甚至我使用的语言的细节:这一切都无关紧要。重要的是缩放功能,它修改表示视图的矩形结构(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;

这可确保放置在鼠标下的对象保持在鼠标下。您可以在上查看代码,我还为其制作了一个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);