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

CanvasItem.draw_texture_rect_region()中src_rect参数作用及重复纹理绘制咨询

CanvasItem.draw_texture_rect_region() 中 src_rect 参数的作用

核心功能

src_rect 就是你要从传入的纹理上截取的一块区域——只有这块区域里的纹理像素会被绘制到目标位置。它的参数是纹理自身像素坐标系下的矩形:Rect2(纹理内起始X, 纹理内起始Y, 截取宽度, 截取高度),纹理左上角为(0,0)原点。

举个实际例子:你的blockTexture是64×64像素,要是只想取它左上角32×32的部分来画,就把src_rect设为Rect2(0, 0, 32, 32)。

你的代码问题

你现在把self.get_rect()当src_rect用,这明显不对:

  • self.get_rect()是按钮控件自身的矩形(基于控件坐标系),尺寸大概率和64×64的纹理不匹配,会导致截取范围超出纹理边界。
  • 超出的部分Godot会按纹理的重复模式处理,但这不是你要的“在多个单元格重复绘制完整纹理”的逻辑。

正确实现代码

如果你的需求是在按钮的每个单元格里都画一遍完整的blockTexture,应该把src_rect设为纹理的完整区域,再循环计算每个单元格的目标位置:

# size_in_cells 是物体占用的网格单元格数量
# cell_size 是正方形单元格的边长
# blockTexture 是64×64的CompressedTexture2D,需要缩放匹配cell_size

func _draw():
    var tex_full_rect = Rect2(Vector2.ZERO, Vector2(blockTexture.get_width(), blockTexture.get_height()))
    var cell_size_vec = Vector2(cell_size, cell_size)
    var cell_x_step = self.get_rect().size.x / size_in_cells

    for i in range(size_in_cells):
        var target_rect = Rect2(Vector2(cell_x_step * i, 0), cell_size_vec)
        draw_texture_rect_region(blockTexture, target_rect, tex_full_rect)

要是你想让单个单元格内重复平铺纹理(比如单元格比64×64大),那换用draw_texture_rect()并开启repeat参数会更直接,不用循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 21:22:53