【Godot】根据 Image/Texture 创建不规则碰撞形状

Godot 4.0 stable

##  根据图片创建不规则碰撞形状
##[br]
##[br][code]image[/code]  图片
##[br][code]canvas_node[/code]  画布节点。[Sprite2D, AnimatedSprite2D] 中的类型,用于根据节点的属性进行偏移点的坐标
##[br][code]group_idx[/code]  创建出的点位组的列表索引。因为可能一张图片有多个图块,会生成超过一组的点列表
static func create_collision_polygon_from_image(image: Image, canvas_node: Node2D = null, group_idx: int = 0) -> CollisionPolygon2D:
	# 获取图片点
	var bit_map = BitMap.new()
	bit_map.create_from_image_alpha(image)
	var points_list = bit_map.opaque_to_polygons(Rect2(Vector2(), image.get_size()))
	
	# 偏移位置
	var points = points_list[group_idx]
	if canvas_node:
		assert(canvas_node is Sprite2D or canvas_node is AnimatedSprite2D, "画布节点需要是 [Sprite2D, AnimatedSprite2D] 类型的节点")
		var offset_pos : Vector2 = Vector2(0, 0)
		if canvas_node is Sprite2D or canvas_node is AnimatedSprite2D:
			if canvas_node.centered:
				offset_pos = -image.get_size() / 2
			offset_pos += canvas_node.offset
		if offset_pos != Vector2(0,0):
			for i in len(points_list):
				points[i] = points[i] + offset_pos
	
	# 创建碰撞
	var coll = CollisionPolygon2D.new()
	points.remove_at(0)
	coll.polygon = points
	return coll