关键词:Godot,4.2.2,CanvasItem,_draw(),绘画
首先,_draw()是CanvasItem类下的一个方法,用于绘画某物。使用时需要进行调用,而不能直接使用。
具体例子和注释请看下面代码:
extends Node2D
# 专门设计用于存放 Vector2 的数组。数据是紧密存放的,因此能够在数组较大时节省内存。
var multiLine: PackedVector2Array = PackedVector2Array([
Vector2(100, 300),
Vector2(300, 400),
Vector2(300, 400),
Vector2(400, 200)
])
# 定义圆的半径
var circleRadius: float = 10.0
# 参数分别代表:r(红)、g(绿)、b(蓝)、a(alpha),一般在 0 到 1 的范围内
# 其中a为0时表示完全透明,为1时表示完全不透明
var whiteColor: Color = Color(1,1,1,1)
# 用来表示 2D 空间中的轴对齐矩形
# 参数1:矩形左上角的X坐标。参数2:矩形左上角的Y坐标。参数3:矩形的宽度。参数4:矩形的高度。
var rect: Rect2 = Rect2(200.0, 300.0, 200.0, 200.0)
# 专门设计用于存放 Vector2 的数组。数据是紧密存放的,因此能够在数组较大时节省内存。
var pointsArray: PackedVector2Array = PackedVector2Array([
Vector2(700,100),
Vector2(800,150),
Vector2(900,100)
])
# 专门设计用于存放 Color 的数组。数据是紧密存放的,因此能够在数组较大时节省内存。
var colorArray: PackedColorArray = PackedColorArray([
Color(1,0,0,1),
Color(0,1,0,1),
Color(0,0,1,1)
])
# 创建了一个新的FontFile实例,但此时它并没有关联任何字体文件
# 需要通过加载一个字体资源来使其有效
var dynamic_font = FontFile.new()
var dynamic_font_size = 80
# 定义一个变量,用于后续存储纹理资源
var texture: Texture = null
var count = 0
func _ready():
dynamic_font.font_data = load("res://unifont-15.1.04(默认版).otf")# 双引号里的是字体资源,网上随便下个就行
texture = load("res://icon.svg")# 双引号里的是图标资源,为godot自带的那个图标
func _process(delta):
count += 1
# 若想使用draw绘画,只能通过调用方法来实现
# 不能直接在process方法中进行
queue_redraw()
func _draw():
# 根据圆心和半径,画一个圆
# 参数1:圆心。参数2:半径
draw_circle(Vector2(1000,500),100,whiteColor)
# 根据起点和终点,画一条线
# 参数1:起点。参数2:终点
draw_line(Vector2(0,0),Vector2(100,100),whiteColor)
# 画多条断开的线段
# 这相邻两个点之间会连成线,如点1和点2,点3和点4,因此点的数量必须是复数
draw_multiline(multiLine,whiteColor)
# 画一个矩形,第3个参数filled默认为true
# 当它为false时,则矩形将被绘制为具有指定的color(第2个参数)和width(第4个参数,默认为-1.0,表示缩放时始终保持细线)的笔划
draw_rect(rect,whiteColor,false,20)
# 绘制自定义图元,至少要填3个参数
# 参数1:Vector2紧缩数组(PackedVector2Array)
# 1个点的是个点,2个点的是线段,3个点是三角形,4个点是四边形。如果没有指定点或者指定了超过4个点,则不会绘制任何东西,只会输出错误消息
# 参数2:Color紧缩数组(PackedColorArray)
# 参数3为uvArray,这个数组用于指定每个顶点的纹理坐标,以便相应地从纹理中取样
# 如果你有一个纹理,并且想要将它映射到通过 pointsArray 定义的形状上,您需要提供 UV 坐标,使得渲染引擎知道如何将纹理应用到模型的每个点
# UV坐标的范围通常是从(0,0)到(1,1)。前者表示纹理的左下角,后者表示纹理的右上角
# 如果没有需要映射的纹理,则填[]
draw_primitive(pointsArray,colorArray,[])
# 绘制文本内容
# 参数1:字体。参数2:显示位置。参数3:文本内容
# 参数4:默认值为0,其中:
# ● HORIZONTAL_ALIGNMENT_LEFT = 0 水平左对齐,常用于文本派生类
# ● HORIZONTAL_ALIGNMENT_CENTER = 1 水平居中对齐,常用于文本派生类
# ● HORIZONTAL_ALIGNMENT_RIGHT = 2 水平右对齐,常用于文本派生类
# ● HORIZONTAL_ALIGNMENT_FILL = 3 扩展行以适应宽度,常用于文本派生类
# 参数5:width宽度,默认为-1.如果width≥0,则文本超过指定宽度将被裁剪
# 参数6:字体大小,默认为16,为int型
draw_string(dynamic_font,Vector2(600,300),"I'm player!",HORIZONTAL_ALIGNMENT_LEFT,-1,dynamic_font_size)
if count >= 90:
# 在指定位置绘制纹理
# 参数1:纹理。参数2:坐标。参数3:modulate: Color,默认为Color(1, 1, 1, 1)
draw_texture(texture,Vector2(400,400))
场景只有这1个,如下图:

最后是运行结果,其中godot图标一开始是不显示的,直到count的值等于90

413

被折叠的 条评论
为什么被折叠?



