当前位置: 首页 > news >正文

【Godot4.0】EasyClock时钟组件

文档生成时间:2023-07-02 16:02:42
(老久之前的不成熟版本)

基本信息

项目信息
文件名easy_clock.gd
Godot版本4.0.3-stable (official)
is_tooltrue
extendControl
class_nameEasyClock
所在项目名称组件库
文件路径res://easy_clock.gd
绝对路径E:/Godot4.x - 软件/音频可视化/easy_clock.gd
作者巽星石

概述

一个纯粹基于_draw简易参数化时钟组件。可以自由缩放,目前支持各种颜色、字体、字号修改以及开启或关闭绘制数字、刻度。

基于_process刷新有点浪费,后期可能基于Timer进行修改。

变量

变量类型描述
draw_centerbool是否绘制中心
draw_numsbool是否绘制数字
draw_scalesbool是否绘制刻度线
bk_colorColor表盘 - 背景颜色
h_colorColor时针 - 颜色
m_colorColor分针 - 颜色
s_colorColor秒针 - 颜色
center_colorColor中心点 - 颜色
h_widthint时针 - 宽度
m_widthint分针 - 宽度
s_widthint秒针 - 宽度
nums_colorColor数字 - 颜色
font_sizeint数字 - 字体大小
fontSystemFont数字 - 字体

源代码

以下是完整源代码:

# ========================================================
# 名称:EasyClock
# 类型:Control扩展节点
# 简介:利用_draw实现的参数化的指针型钟表组件
# 作者:巽星石
# Godot版本:4.0.3-stable (official)
# 创建时间:2023-07-02 14:36:14
# 最后修改时间:20237216:22:40
# ========================================================
@tool
extends Control
class_name EasyClock
# =================================== 参数 ===================================
# 功能开关
@export_group("switch")
## 是否绘制中心
@export var draw_center:bool = false:
	set(val):
		draw_center = val
		queue_redraw()
## 是否绘制数字
@export var draw_nums:bool = false:
	set(val):
		draw_nums = val
		queue_redraw()
## 是否绘制刻度
@export var draw_scales:bool = false:
	set(val):
		draw_scales = val
		queue_redraw()
# 颜色
@export_group("Color")
## 表盘 - 颜色
@export var bk_color:Color = Color("#ccc"):
	set(val):
		bk_color = val
		queue_redraw()
## 时针 - 颜色
@export var h_color:Color = Color("#444"):
	set(val):
		h_color = val
		queue_redraw()
## 分针 - 颜色
@export var m_color:Color = Color("#444"):
	set(val):
		m_color = val
		queue_redraw()
## 秒针 - 颜色
@export var s_color:Color = Color("#444"):
	set(val):
		s_color = val
		queue_redraw()
## 中心点 - 颜色
@export var center_color:Color = Color("#ccc"):
	set(val):
		center_color = val
		queue_redraw()
# 宽度
@export_group("Width")
## 时针 - 宽度
@export var h_width:int = 10:
	set(val):
		h_width = val
		queue_redraw()
## 分针 - 宽度
@export var m_width:int = 5:
	set(val):
		m_width = val
		queue_redraw()
## 秒针 - 宽度
@export var s_width:int = 3:
	set(val):
		s_width = val
		queue_redraw()
@export_group("nums")
## 表盘数字 - 颜色
@export var nums_color:Color = Color("#ccc"):
	set(val):
		nums_color = val
		queue_redraw()
## 默认字体大小
@export var font_size = 14:
	set(val):
		font_size = val
		queue_redraw()
## 默认字体	
@export var font:SystemFont:
	set(val):
		font = val
		queue_redraw()


# =================================== 动态计算参数 ===================================
var center = Vector2(100,100) # 表盘中心
var r = 80 # 表盘半径
var h_r = 60 # 时针长度
var m_r = 50 # 分针长度
var s_r = 40 # 秒针长度

func _ready():
	resized.connect(func():
		calc()
	)
	calc()
	queue_redraw()

# 重新计算
func calc():
	center = get_global_rect().get_center()
	r = get_global_rect().size.y/2
	h_r = r * 0.82
	m_r = r * 0.85
	s_r = r * 0.9

func _process(delta):
	queue_redraw()

func _draw():
	# 获取当前时间信息
	var dict = Time.get_datetime_dict_from_system()
	# 绘制表盘
	draw_circle(center,r,bk_color)
	draw_circle(center,r * 0.8,bk_color.darkened(0.2))
	draw_circle(center,r * 0.8 - 10,bk_color.darkened(0.15))
	# 绘制日期
	var date := "%d.%d.%d" % [dict["year"],dict["month"],dict["day"]]
	draw_string(font, 
	Vector2.DOWN * r * 0.4 + center - Vector2(font_size * 2,-font_size/2),
	date,HORIZONTAL_ALIGNMENT_CENTER,-1,font_size * 1.5,nums_color)
	# 绘制时间
	# 绘制数字
	if draw_nums:
		for i in range(1,13):
			var f_size = font_size if i % 3 != 0 else font_size * 2
			draw_string(font, 
			(Vector2.UP * (r - f_size/1.25)).rotated((2* PI /12) * i) + center - Vector2(f_size/3,-f_size/2),
			str(i),HORIZONTAL_ALIGNMENT_CENTER,-1,f_size,nums_color)
	# 绘制
	draw_line(center,(Vector2.UP * h_r).rotated((2* PI /12) * dict["hour"]) + center,h_color,h_width)
	draw_line(center,(Vector2.UP * m_r).rotated((2* PI /60) * dict["minute"]) + center,m_color,m_width)
	draw_line(center,(Vector2.UP * s_r).rotated((2* PI /60) * dict["second"]) + center,s_color,s_width)
	# 绘制中心
	if draw_center:
		draw_circle(center,r * 0.1,center_color)
		draw_circle(center,r * 0.1 - 8,center_color.darkened(0.2))
		draw_circle(center,5,center_color.darkened(0.3))
	# 绘制刻度线
	if draw_scales:
		for i in range(60):
			draw_line((Vector2.UP * r * 0.9).rotated((2* PI /60) * i) + center ,(Vector2.UP * r * 0.95).rotated((2* PI /60) * i) + center,s_color,1)
	

相关文章:

  • 自动同步多服务器下SQL脚本2.0
  • Python:函数式编程
  • 达梦数据库中插入导出图片的方法与应用
  • uniapp+微信小程序+最简单局部下拉刷新实现
  • 看不见的“健康杀手”来袭,微塑料竟威胁人体与植物光合作用
  • 多肽纯度如何选择?
  • 【2步解决】phpstudy开机自启(自动启动phpstudy、mysql、nignx或apache、自动打开网址)
  • 自学Java-Java高级技术(单元测试、反射、注解、动态代理)
  • 深度迁移学习实战指南:从理论到产业级应用
  • Windows Wise Care 365 PRO-中文便携版
  • 【C++入门】变量和基本类型
  • Win10 下搭建免费的 FTP 服务器 FileZilla
  • 如何简单获取三个月免费试用的SSL证书
  • 处理Java中的异常
  • STC 51单片机64——关于STC8H的ADC回程误差问题
  • starrocks批量启停脚本
  • Git使用(二)--如何配置 GitHub 远程仓库及本地 Git 环境
  • 兴达易控Profinet 转 ModbusTCP跨网段通信模块
  • RK3588 编译 openssl
  • 【机器学习】非结构化数据革命:机器学习中的文本、图像与音频
  • 来论|以法治之力激发民营经济新动能
  • 竞彩湃|水晶宫夺冠后乘胜追击,四大皆空曼城人间清醒?
  • 印度空军为“阵风”战机换装国产导弹,以增强作战能力推动国防自主
  • 上海发布台风红色预警?实为演练,今日下午局部中雨下班请注意
  • 述评:赖清德当局上台一年恶行累累
  • 习近平:坚持科学决策民主决策依法决策,高质量完成“十五五”规划编制工作