概述
这同样是来自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的新特性,可以对导出变量部分做更好的设计,诸如上面提到的添加单位等
- 可以创建更多的图形