在Godot 4中确定TileMapLayer的可见区域
Godot 4 TileMapLayer 程序化地形视口边界坐标问题
我正在使用Godot 4的新TileMapLayer制作程序化地形,该功能生成地形十分便捷。
我希望能根据Camera2D的可见区域生成地形,不受当前缩放级别影响。
Camera2D缩放函数
public void ZoomCamera(double delta) { Vector2 zoom = Zoom; if (Input.IsActionJustPressed("camera_zoom_in")) { zoom.X = Mathf.Clamp(zoom.X * 1.1f, MinZoom, MaxZoom); zoom.Y = Mathf.Clamp(zoom.Y * 1.1f, MinZoom, MaxZoom); } if (Input.IsActionJustPressed("camera_zoom_out")) { zoom.X = Mathf.Clamp(zoom.X * 0.9f, MinZoom, MaxZoom); zoom.Y = Mathf.Clamp(zoom.Y * 0.9f, MinZoom, MaxZoom); } Zoom = Zoom.Slerp(zoom, (float)(ZoomSpeed * delta)); }
鼠标选择瓦片实现
我可以转换当前鼠标位置来选择任意瓦片:
var clickedCell = LocalToMap(GetLocalMousePosition()); SetCell(clickedCell, 0, new Vector2I(6, 0), 0);
视口边界计算异常问题
但当我尝试计算视口边界并转换为本地坐标时,得到的结果与鼠标位置的坐标不一致:
public void ReCalculateViewPortBounds() { var viewport = GetViewport(); var camera = viewport.GetCamera2D(); var viewport_size = viewport.GetVisibleRect().Size; // {(1152, 648)} var cameraPosition = camera.GlobalPosition; // {(0, 0)} var x = viewport_size.X; // 1152 var y = viewport_size.Y; // 648 var zx = Zoom.X; // 0.4 var zy = Zoom.Y; // 0.4 var half_width = (viewport_size.X * Zoom.X) / 2f; // 230.400009 var half_height = (viewport_size.Y * Zoom.Y) / 2f; // 129.6 // 鼠标位置尽可能靠近左上角 var mousePosition = camera.GetGlobalMousePosition(); // { (2615.0005, -5132.5005)} // 定义四角坐标 var top_left = cameraPosition + (new Vector2(-half_width, -half_height)); //{(-230.40001, -129.6)} var top_right = cameraPosition + (new Vector2(half_width, -half_height)); // {(230.40001, -129.6)} var bottom_left = cameraPosition + (new Vector2(-half_width, half_height)); //{(-230.40001, 129.6)} var bottom_right = cameraPosition + (new Vector2(half_width, half_height)); //{(230.40001, 129.6)} // 发送事件 EventBus.Instance.Bus.Publish<CameraEvent>(new CameraEvent { BottomLeft = ToLocal(bottom_left), BottomRight = ToLocal(bottom_right), TopLeft = ToLocal(top_left), TopRight = ToLocal(top_right) }); }
得到的结果如下:
本质上,我希望获取与在任意缩放级别下点击地图四个角落时相同的坐标。但camera.GetGlobalMousePosition()得到的坐标与视口计算出的数值差异很大。
编辑:正如zennehoy指出,之前的计算有误,还需加上相机位置以适配平移操作:
// 定义四角坐标 var top_left = cameraPosition + (new Vector2(-half_width, -half_height)) + cameraPosition;
内容的提问来源于stack exchange,提问作者Andrew Grothe
相关产品推荐
相关产品推荐

