【Godot4.3】基于ShapePoints的Polygon2D扩展

概述

这同样是来自2023年7月份的一项实验性工作,基于最初版本的ShapePoints静态函数库,实现了对Polygon2D节点的扩展,用于创建参数化图形的Polygon2D节点。

  • Polygon2D节点本身只能通过顶点绘制工具,创建很随意的多边形。
  • 通过ShapePoints函数库求取对应图形的顶点数据,然后赋值给Polygon2D节点的polygon属性,可以实现特殊几何图形的快速创建。

自定义节点体系

基于ShapePoints函数库所提供的图形,创建了包括矩形、圆、星形等等一些列的参数化图形Polygon2D节点。

image.png

Polygon2DRect(矩形)

# ========================================================
# 名称:Polygon2DRect
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的矩形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217: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,可以拥有和使用它的全部属性、方法和信号。
  • widthheight两个参数(导出变量)用于控制矩形的大小,在其setter中,修改值后,会调用update_polygon()方法
  • update_polygon()方法中,会根据目前的widthheight参数值,从ShapePoints函数库中求取矩形顶点,然后赋值给Polygon2D节点的polygon属性,从而实现形状的动态更新。

在编辑器中创建和编辑Polygon2DRect节点

Polygon2DCircle(圆形)

# ========================================================
# 名称:Polygon2DCircle
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的圆,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217: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)

在编辑器中创建和编辑Polygon2DCircle节点

Polygon2DChamferRect(切角矩形)

# ========================================================
# 名称:Polygon2DChamferRect
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的切角矩形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217: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)

image.png

Polygon2DRoundRect(圆角矩形)

# ========================================================
# 名称:Polygon2DRoundRect
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的圆角矩形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217: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)

image.png

Polygon2DRegular(正多边形)

# ========================================================
# 名称:Polygon2DRegular
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的正多边形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217: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提供的单位提示功能进行了改进,你可以在参数中看到度数和边数等单位的提示。

image.png

Polygon2DStar(星形)

# ========================================================
# 名称:Polygon2DStar
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的星形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217: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)

image.png

Polygon2DSector(扇形)

# ========================================================
# 名称:Polygon2DSector
# 类型:扩展节点,Polygon2D子类型
# 简介:为Polygon2D提供参数化的扇形,基于最初的ShapePoints函数库获取图形点
# 作者:巽星石
# Godot版本:4.1-stable (official)
# 创建时间:2023-07-08 03:13:48
# 最后修改时间:20249217: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)

image.png

组合创建复杂形状

简单饼图

image.png

嵌套的形状

image.png

创建简单游戏原型

image.png

总结

  • 基于ShapePoints静态函数库对Polygon2D节点的扩展,可以用于创建参数化图形的Polygon2D节点,补足Polygon2D本身的绘制限制。
  • 通过结合多个参数化图形的Polygon2D节点,可以创建一些简单的几何图形和它们的组合形式,甚至是创建简单几何游戏的原型
  • 它让Godot拥有了一种简便的内置矢量图形功能。

未来展望

  • 和很多其他的工作一样,这是一个被简单试验,然后长期搁置的工作。本篇通过初步整理,总结了基础的实现原理和用法。后期可能会进行大量改进。
  • 因为对ShapePoints静态函数库的依赖,可能会导致一些问题,尤其是对ShapePoints静态函数库的破坏性重写之后,可能会带来一些问题,所以好的方法是将图形点求取函数放置到各个参数化图形的Polygon2D节点中,降低依赖的同时,还可以使用新的代码或做特定的修改。
  • 基于Godot4.3的新特性,可以对导出变量部分做更好的设计,诸如上面提到的添加单位等
  • 可以创建更多的图形
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巽星石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值