wil*_*ast 10 mouse user-interface scroll zoom
我为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 = ???
}
Run Code Online (Sandbox Code Playgroud)
之前有人建议它,下面将不工作:
view.x = mouse_x - view.w/2;
view.y = mouse_y - view.h/2;
Run Code Online (Sandbox Code Playgroud)
这张照片说明了为什么,当我试图放大笑脸时:

正如您所看到的那样,当鼠标下方的对象放置在屏幕中央时,它停在鼠标下方,所以我们停止向它缩放!
如果你有一个数学头(你需要一个)任何帮助,这将是非常感谢!
我设法找到了解决方案,多亏了很多小小的图片:我会在这里发布算法以防万一其他人需要它.
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;
Run Code Online (Sandbox Code Playgroud)
这可确保放置在鼠标下方的对象停留在鼠标下方.你可以在github上查看代码,我也为youtube做了一个展示.