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

Godot中如何获取给定渲染半径内的整数坐标区块?

在Godot中实现圆形渲染距离内的区块坐标获取

核心思路就是用整数运算直接验证圆的不等式,完全不需要浮点数——因为你的区块坐标和渲染半径都是整数,(x - px)² + (y - py)² ≤ r²这个公式里的所有运算都可以用整数完成,既高效又避免精度问题。

实现步骤与代码

首先确定三个关键整数变量:

  • player_chunk_x/player_chunk_y:玩家当前所在的区块坐标(比如通过玩家世界坐标除以区块大小取整得到)
  • render_radius:圆形渲染半径(整数,比如3表示加载周围3区块范围内的所有区块)

基础实现(含浮点数取整,简单高效)

下面的GDScript函数会返回所有符合条件的区块坐标数组:

func get_chunks_in_circle(player_chunk_x: int, player_chunk_y: int, render_radius: int) -> Array:
    var chunks = []
    var radius_squared = render_radius * render_radius  # 预计算半径平方,避免重复计算
    
    # 遍历x轴所有可能的区块(范围限定在玩家区块±半径内)
    for x in range(player_chunk_x - render_radius, player_chunk_x + render_radius + 1):
        var dx = x - player_chunk_x
        var dx_squared = dx * dx
        var remaining = radius_squared - dx_squared
        
        # 剩余值小于0,说明当前x对应的所有y都在圆外,直接跳过
        if remaining < 0:
            continue
        
        # 计算y方向的最大偏移量(用sqrt取整,得到整数范围)
        var max_y_offset = floor(sqrt(remaining))
        
        # 遍历该x下所有符合条件的y坐标
        for y in range(player_chunk_y - max_y_offset, player_chunk_y + max_y_offset + 1):
            chunks.append(Vector2i(x, y))
    
    return chunks

纯整数运算实现(无浮点数,精度更高)

如果担心浮点数sqrt的精度问题(比如大半径场景),可以用二分法实现纯整数的最大偏移量计算,替换上面的sqrt部分:

# 辅助函数:找到最大的整数n,使得n² ≤ remaining
func _get_max_integer_sqrt(remaining: int) -> int:
    if remaining < 0:
        return 0
    var low = 0
    var high = remaining
    var result = 0
    while low <= high:
        var mid = (low + high) // 2
        var mid_squared = mid * mid
        if mid_squared == remaining:
            return mid
        elif mid_squared < remaining:
            result = mid
            low = mid + 1
        else:
            high = mid - 1
    return result

# 修改后的主函数
func get_chunks_in_circle(player_chunk_x: int, player_chunk_y: int, render_radius: int) -> Array:
    var chunks = []
    var radius_squared = render_radius * render_radius
    
    for x in range(player_chunk_x - render_radius, player_chunk_x + render_radius + 1):
        var dx = x - player_chunk_x
        var dx_squared = dx * dx
        var remaining = radius_squared - dx_squared
        
        if remaining < 0:
            continue
        
        var max_y_offset = _get_max_integer_sqrt(remaining)
        
        for y in range(player_chunk_y - max_y_offset, player_chunk_y + max_y_offset + 1):
            chunks.append(Vector2i(x, y))
    
    return chunks

使用注意事项

  1. 区块坐标转换:确保player_chunk_x和player_chunk_y是整数,比如玩家世界坐标是player_global_pos,区块大小是CHUNK_SIZE,可以这样计算:
    var player_chunk_x = floor(player_global_pos.x / CHUNK_SIZE)
    var player_chunk_y = floor(player_global_pos.y / CHUNK_SIZE)
    
  2. 去重优化:如果需要避免重复加载已存在的区块,可以用Dictionary存储已加载的区块坐标(键用Vector2i,值存区块对象),添加前先判断是否存在。
  3. 性能优化:预计算radius_squared和dx_squared可以减少重复运算,比每次计算都快很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 06:04:50