概述
这同样是来自2023年7月份的一项实验性工作,基于最初版本的ShapePoints静态函数库,实现了对Polygon2D节点的扩展,用于创建参数化图形的Polygon2D节点。
- Polygon2D节点本身只能通过顶点绘制工具,创建很随意的多边形。
- 通过ShapePoints函数库求取对应图形的顶点数据,然后赋值给Polygon2D节点的polygon属性,可以实现特殊几何图形的快速创建。
自定义节点体系
基于ShapePoints函数库所提供的图形,创建了包括矩形、圆、星形等等一些列的参数化图形Polygon2D节点。

Polygon2DRect(矩形)
# ========================================================
# 名称:Polygon2DRect
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的矩形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:2024年9月2日17:07:01
# ========================================================
@tool
class_name Polygon2DRect extends Polygon2D
# =================================== 参数 ===================================
## 宽度
@export_range(0.0,10000.0,1.0) var width:float = 50.0:
	set(val):
		width = val
		update_polygon()
## 高度
@export_range(0.0,10000.0,1.0) var height:float = 50.0:
	set(val):
		height = val
		update_polygon()
# =================================== 虚函数 ===================================	
func _init():
	update_polygon()		
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.rect(Vector2(width,height))
可以看到省略注释部分,代码相当简单:
- @tool代表了它可以在编辑器中响应参数(导出变量)的变化,
- extends Polygon2D代表了这个节点继承自- Polygon2D,可以拥有和使用它的全部属性、方法和信号。
- width和- height两个参数(导出变量)用于控制矩形的大小,在其- setter中,修改值后,会调用- update_polygon()方法
- update_polygon()方法中,会根据目前的- width和- height参数值,从- ShapePoints函数库中求取矩形顶点,然后赋值给- Polygon2D节点的- polygon属性,从而实现形状的动态更新。

Polygon2DCircle(圆形)
# ========================================================
# 名称:Polygon2DCircle
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的圆,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:2024年9月2日17:25:20
# ========================================================
@tool
class_name Polygon2DCircle extends Polygon2D
# =================================== 参数 ===================================
## 圆半径
@export var r:float = 50:
	set(val):
		r = val
		update_polygon()
# =================================== 虚函数 ===================================	
func _init():
	update_polygon()
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.circle(r)

Polygon2DChamferRect(切角矩形)
# ========================================================
# 名称:Polygon2DChamferRect
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的切角矩形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:2024年9月2日17:29:14
# ========================================================
@tool
class_name Polygon2DChamferRect extends Polygon2D
# =================================== 参数 ===================================
## 宽度
@export_range(0.0,10000.0,1.0) var width:float = 50.0:
	set(val):
		width = val
		update_polygon()
## 高度
@export_range(0.0,10000.0,1.0) var height:float = 50.0:
	set(val):
		height = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var a:float = 5:
	set(val):
		a = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var b:float = 5:
	set(val):
		b = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var c:float = 5:
	set(val):
		c = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var d:float = 5:
	set(val):
		d = val
		update_polygon()
# =================================== 虚函数 ===================================
func _init():
	update_polygon()
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.chamfer_rect(Vector2(width,height),a,b,c,d)

Polygon2DRoundRect(圆角矩形)
# ========================================================
# 名称:Polygon2DRoundRect
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的圆角矩形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:2024年9月2日17:32:08
# ========================================================
@tool
class_name Polygon2DRoundRect extends Polygon2D
# =================================== 参数 ===================================
## 宽度
@export_range(0.0,10000.0,1.0) var width:float = 50.0:
	set(val):
		width = val
		update_polygon()
## 高度
@export_range(0.0,10000.0,1.0) var height:float = 50.0:
	set(val):
		height = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var r1:float = 5:
	set(val):
		r1 = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var r2:float = 5:
	set(val):
		r2 = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var r3:float = 5:
	set(val):
		r3 = val
		update_polygon()
## 左上角圆角半径
@export_range(0.0,10000.0,1.0) var r4:float = 5:
	set(val):
		r4 = val
		update_polygon()
# =================================== 虚函数 ===================================
func _init():
	update_polygon()
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.round_rect(Vector2(width,height),r1,r2,r3,r4)

Polygon2DRegular(正多边形)
# ========================================================
# 名称:Polygon2DRegular
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的正多边形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:2024年9月2日17:40:39
# ========================================================
@tool
class_name Polygon2DRegular extends Polygon2D
# =================================== 参数 ===================================
## 起始角度
@export_range(0,360,1,"degrees") var start_angle:int = -90:
	set(val):
		start_angle = val
		update_polygon()
## 角数
@export_range(3,1000,1,"suffix:边") var edges:int=5:
	set(val):
		edges = val
		update_polygon()
## 圆半径
@export var r:float = 50:
	set(val):
		r = val
		update_polygon()
# =================================== 虚函数 ===================================
func _init():
	update_polygon()
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.regular_polygon(start_angle,edges,r)
- 上面基于Godot4.3的@export_range提供的单位提示功能进行了改进,你可以在参数中看到度数和边数等单位的提示。

Polygon2DStar(星形)
# ========================================================
# 名称:Polygon2DStar
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的星形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:2024年9月2日17:44:28
# ========================================================
@tool
class_name Polygon2DStar extends Polygon2D
# =================================== 参数 ===================================
## 起始角度
@export_range(0,360,1,"degrees") var start_angle:int = -90:
	set(val):
		start_angle = val
		update_polygon()
## 角数
@export_range(3,1000,1,"suffix:边") var edges:int=5:
	set(val):
		edges = val
		update_polygon()
## 外部圆半径
@export var r:float = 50:
	set(val):
		r = val
		update_polygon()
## 内部圆半径
@export var r2:float = 20:
	set(val):
		r2 = val
		update_polygon()
# =================================== 虚函数 ===================================
func _init():
	update_polygon()
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.star(start_angle,edges,r,r2)

Polygon2DSector(扇形)
# ========================================================
# 名称:Polygon2DSector
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的扇形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:2024年9月2日17:48:32
# ========================================================
@tool
class_name Polygon2DSector extends Polygon2D
# =================================== 参数 ===================================
## 起始角度
@export_range(-360,360,1,"degrees") var start_angle:int = -90:
	set(val):
		start_angle = val
		update_polygon()
## 结束角度
@export_range(-360,360,1,"degrees") var end_angle:int = 90:
	set(val):
		end_angle = val
		update_polygon()
## 半径
@export var r:float = 50:
	set(val):
		r = val
		update_polygon()
# =================================== 虚函数 ===================================
func _init():
	update_polygon()
# =================================== 方法 ===================================
# 更新形状
func update_polygon():
	polygon = ShapePoints.sector(start_angle,end_angle,r)

组合创建复杂形状
简单饼图

嵌套的形状

创建简单游戏原型

总结
- 基于ShapePoints静态函数库对Polygon2D节点的扩展,可以用于创建参数化图形的Polygon2D节点,补足Polygon2D本身的绘制限制。
- 通过结合多个参数化图形的Polygon2D节点,可以创建一些简单的几何图形和它们的组合形式,甚至是创建简单几何游戏的原型
- 它让Godot拥有了一种简便的内置矢量图形功能。
未来展望
- 和很多其他的工作一样,这是一个被简单试验,然后长期搁置的工作。本篇通过初步整理,总结了基础的实现原理和用法。后期可能会进行大量改进。
- 因为对ShapePoints静态函数库的依赖,可能会导致一些问题,尤其是对ShapePoints静态函数库的破坏性重写之后,可能会带来一些问题,所以好的方法是将图形点求取函数放置到各个参数化图形的Polygon2D节点中,降低依赖的同时,还可以使用新的代码或做特定的修改。
- 基于Godot4.3的新特性,可以对导出变量部分做更好的设计,诸如上面提到的添加单位等
- 可以创建更多的图形



















