2012-03-06 103 views
9

我已经为2D策略游戏编写了一个家酿brew view_port类。摇摄(箭头键)和缩放(鼠标滚轮)做工精细,但我的观点一样,也朝无论光标放置,如Google Maps or Supreme Commander放大鼠标(例如谷歌地图)

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

该图展示为什么当我试图向笑脸放大:

http://oi43.tinypic.com/16m21au.jpg

正如你可以看到当鼠标下方的物体被放置在叔他屏幕中心停在鼠标下面,所以我们停止缩放它!

如果你有一个数学头(你需要一个)任何帮助,这将是最感谢!

回答

7

我设法找出了解决方案,这要归功于很多头脑细节:我会在这里发布算法,以防其他人需要它。

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做了展示演示。

+1

你能详细说明一下变量的含义吗? – WebF0x 2017-10-02 12:42:37

1

在我的概念中有一个摄像头和一个屏幕。 相机是移动部分。屏幕是可扩展的部分。

我做了一个示例脚本,包括一个现场演示。 为了简单起见,问题仅被降低到一个维度。 https://www.khanacademy.org/cs/cam-positioning/4772921545326592

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); 

对于2D例如,你可以简单地添加相同的代码的高度和y的位置。