You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

得到的结果如下:
基础地形生成2

本质上,我希望获取与在任意缩放级别下点击地图四个角落时相同的坐标。但camera.GetGlobalMousePosition()得到的坐标与视口计算出的数值差异很大。

编辑:正如zennehoy指出,之前的计算有误,还需加上相机位置以适配平移操作:

// 定义四角坐标
var top_left = cameraPosition 
    + (new Vector2(-half_width, -half_height)) + cameraPosition; 

内容的提问来源于stack exchange,提问作者Andrew Grothe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 02:22:13