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
相关产品推荐
相关产品推荐

