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

【Godot4.3】自定义圆角容器

概述

Godot控件想要完全实现现代UI风格,需要进行大量的自定义组件设计。本篇就依托于笔者自己对现代UI设计中的圆角面板元素模仿来制作圆角容器组件。

圆角容器

圆角元素在现代的扁平UI设计中非常常见,在Godot中可以通过改进PanelContainer来或者自定义容器来实现圆角面板效果。

  • 我初期想基于PanelContainer写一个容器类,但是发现比较绕
  • 于是还是直接基于Container类型写了一个自定义容器类
  • 初期我偏向于直接用绘图函数绘制StyleBox
  • 但是当遇到渐变和图片时,绘制StyleBox的方式将无法获得圆角
  • 所以最后不得不采用绘图函数draw_colored_polygon,并且自己计算圆角矩形顶点集合以及计算每个点的UV坐标,从而实现一种类似矢量遮罩的效果。

最终实现效果

基础效果

RadiusPanelContainer

容器的自定义参数如下:

基本参数

实现如下功能:

  • 快速获得带圆角的纯色、图片背景(包括渐变等)的容器
  • 可以设定统一的描边颜色、宽度,以及圆角大小
  • 可以设定子元素的内边距
  • 可以设定容器的不透明度

注意: 需要搭配常见容器使用,第一个子元素也是唯一被正确显示的第一级子元素,需要是一个容器类型。


第一级第一个子元素需要为容器类型

完整代码

# ==========================================================
# RadiusPanelContainer
# 类型:自定义容器
# 概述:现代化UI系列,实现基础的圆角面板元素
# 巽星石
# 创建时间20251313:45:32
# 最后修改时间:20251317:54:39
# ==========================================================
@tool
class_name  RadiusPanelContainer extends Container# =============================== 参数 ===============================@export var padding:=10: ## 内边距set(val):padding = valqueue_redraw()@export_range(0.0,1.0,0.1) var opacity=1.0: ## 透明度set(val):opacity = valif val:self_modulate = Color(1.0,1.0,1.0,val)queue_redraw()@export_group("background")
@export var bg_color:=Color.WHITE: ## 背景颜色set(val):bg_color = valqueue_redraw()@export var bg_texture:Texture2D: ## 背景图片set(val):bg_texture = valqueue_redraw()@export_group("border")
@export var border_color:=Color.WHITE: ## 边框颜色set(val):border_color = valqueue_redraw()@export var border_radius:=5: ## 圆角半径set(val):border_radius = valqueue_redraw()@export var border_width:=0:## 边线宽度set(val):border_width = valqueue_redraw()# =============================== 虚函数 ===============================
func _init() -> void:clip_contents = truefunc _draw() -> void:var rect = get_rect() * get_transform()var pots = round_rect(rect,border_radius,border_width/2.0)# 绘制背景if bg_texture:var uvs:PackedVector2Arrayfor pot in pots: # 计算UV坐标uvs.append(pot/rect.size)# 绘制圆角矩形draw_colored_polygon(pots,bg_color,uvs,bg_texture)else:draw_polygon(pots,[bg_color])# 绘制边线draw_polyline(pots,border_color,border_width)# 重排子元素queue_sort()func _notification(what: int) -> void:var rect = get_rect() * get_transform()rect.position += Vector2.ONE * paddingrect.size -= Vector2.ONE * padding * 2match what:NOTIFICATION_SORT_CHILDREN:if get_child_count()>0:fit_child_in_rect(get_children()[0],rect)# =============================== 自定义函数 ===============================
# 求圆弧点集
func arc(c:Vector2,r:float,start_angle:float,end_angle:float,steps:=10) -> PackedVector2Array:var arr:PackedVector2Arrayvar v1 = Vector2.RIGHT * rvar ang = deg_to_rad(end_angle - start_angle)/float(steps)for i in range(steps+1):arr.append(v1.rotated(ang * float(i) + deg_to_rad(start_angle)) + c)return arr# 获取圆角矩形
func round_rect(rect:Rect2,r:float,offset:float) -> PackedVector2Array:var arr:PackedVector2Arrayvar pots:PackedVector2Array = get_rect2_points(rect) # 矩形顶点var vec = Vector2.ONE * (r + offset)  # 圆角偏移向量arr.append_array(arc(pots[0] + vec,r,180,270))arr.append_array(arc(pots[1] + Transform2D.FLIP_X * vec,r,270,360))arr.append_array(arc(pots[2] + vec * -1,r,0,90))arr.append_array(arc(pots[3] + Transform2D.FLIP_Y * vec,r,90,180))arr.append(pots[0] + vec - Vector2(r,0))return arr# 获取Rect对应的点集合
func get_rect2_points(rect:Rect2) -> PackedVector2Array:var arr:PackedVector2Arrayvar pos = rect.positionvar end = rect.endvar w = rect.size.xarr.append(pos)arr.append(pos + Vector2.RIGHT * w)arr.append(end)arr.append(end - Vector2.RIGHT * w)return arr

提示

  • 这只是个基础版本,后续改进,敬请期待

相关文章:

【Godot4.3】自定义圆角容器

概述 Godot控件想要完全实现现代UI风格,需要进行大量的自定义组件设计。本篇就依托于笔者自己对现代UI设计中的圆角面板元素模仿来制作圆角容器组件。 圆角容器 圆角元素在现代的扁平UI设计中非常常见,在Godot中可以通过改进PanelContainer来或者自定…...

开源RAG主流框架有哪些?如何选型?

开源RAG主流框架有哪些?如何选型? 一、开源RAG框架全景图 (一)核心框架类型对比 类型典型工具技术特征适用场景传统RAGLangChain, Haystack线性流程(检索→生成)通用问答、知识库检索增强型RAGRAGFlow, AutoRAG支持重排序、多路召回优化高精度问答、复杂文档处理轻量级…...

【Microsoft PowerPoint for Mac】2分钟配置-MAC一键删除PPT中的所有备注

MAC一键删除PPT中的所有备注 1.搜索自动操作2.点击快速操作3.搜索并运行AppleScript4.输入代码,并选择只应用于Microsoft PowerPoint for Mac【右上角】5. CRTLS保存为“清除当前文稿中的所有备注”,PPT中应用。 MAC没自带,需要自己配置 1.搜…...

【UML】统一建模语言 UML 基础

【UML】统一建模语言UML 基础 文章目录 一、概述1.1 - 什么是建模1.2 建模的原则1.3 软件建模的实现过程 二、 UML2.1 UML中10种图 三、用例图3.1 用例之间的关系 —— 泛化关系3.2 用例之间的关系 —— 包含关系3.3 用例之间的关系 —— 扩展关系 四、类图4.1 类的表示方法4.2…...

AWS S3深度解析:十大核心应用场景与高可用架构设计实践

摘要:作为全球领先的对象存储服务,Amazon S3凭借其高扩展性、持久性和安全性,已成为企业云原生架构的核心组件。本文将深入探讨S3的典型技术场景,并揭秘其背后的架构设计逻辑。 一、AWS S3核心技术特性解析 Amazon Simple Storag…...

如何用Python 3自动打开exe程序

诸神缄默不语-个人CSDN博文目录 本文所说的exe程序特指那种双击直接就能打开的Windows软件。本文中给出的具体例子是C:\Users\user_name\AppData\Local\Postman\Postman.exe,这串字符串在示例代码中都用exe_path代替了,方便你用的时候直接换成自己的软件…...

计算机网络之路由协议(自治系统)

一、自治系统(AS) 自治系统是由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合。它是网络的基本构成单位,每个自治系统是一个独立运营并自主决定与谁交换流量的实体。自治系统内部运行内部网关协议(IGP&#xff09…...

MFC笔记:本专栏课件

专栏导航 上一篇:在VS2019里面,调整代码字体大小 回到目录 下一篇:无 本节前言 在之前的讲解里面,我讲解了 Visual Studio 软件的一些个基础操作步骤。从本节开始,我们进入预备章。 本节内容,属于是 …...

springboot集成jackson-dataformat-xml实现发送XML请求和XML响应参数处理

背景 最近在做发票相关的业务,需要对接第三方进行开发票等一系列操作,对方的系统是较老系统,需要采用XML的请求方式。 思路 一般来说,基于springboot的项目采用的都是JSON格式的请求参数和响应参数,因此需要做一个转…...

Spring Cloud Gateway 网关的使用

在之前的学习中,所有的微服务接口都是对外开放的,这就意味着用户可以直接访问,为了保证对外服务的安全性,服务端实现的微服务接口都带有一定的权限校验机制,但是由于使用了微服务,就需要每一个服务都进行一…...

超高速工业相机的应用

超高速工业相机一般安装在机器流水线上代替人眼来做测量和判断,通过数字图像摄取目标转换成图像信号,传送给专用的图像处理系统。图像处理系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。一般来说&…...

学习笔记--电磁兼容性EMC

一、基本概念 电磁兼容性(Electromagnetic Compatibility,EMC)是电子电气设备在特定电磁环境中正常工作的能力,同时不会对其他设备产生不可接受的电磁干扰。其核心目标是确保设备在共享的电磁环境中既能抵抗干扰,又能避…...

利用开源小智AI制作桌宠机器狗

本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…...

基于PSO-LSTM长短期记忆神经网络的多分类预测【MATLAB】

一、研究背景与意义 在时间序列分类、信号识别、故障诊断等领域,多分类预测任务对模型的时序特征捕捉能力提出了极高要求。传统LSTM网络虽能有效建模长程依赖关系,但其性能高度依赖超参数的选择,例如隐含层神经元数量、学习率、迭代次数等。…...

Qt中C++与QML交互从原理、方法与实践陷阱深度解析

在我们使用Qt开发中,现在以及普遍通过 C 与 QML 的交互,将 C 的强大功能与 QML 的界面设计优势相结合,既保证了应用程序的性能和稳定性,又能快速实现美观、易用的用户界面。接下来专门讲下C与QML交互原理、方法与实践中的一些陷阱…...

基于SpringBoot和Leaflet的邻省GDP可视化实战

目录 前言 一、技术实现路径 1、空间数据检索 2、数据展示检索流程 二、SpringBoot后台实现 1、模型层实现 2、控制层实现 三、WebGIS前端实现 1、控制面展示 2、成果展示 四、总结 前言 在数字化浪潮席卷全球的今天,数据已成为驱动社会经济发展、指导政策…...

esp工程报错:something went wrong when trying to build the project esp-idf 一种解决办法

最近上手了正点原子esp32s3板子,环境采用的是vscodeesp-idf插件。导入了正点原子的demo测试,每次都报这个错误无法建造。也不是网上说的ninja error,不是中文路径的问题。 在终端中查看,发现是缺少了git。(我这里没有…...

Grouped-Query Attention(GQA)详解: Pytorch实现

Grouped-Query Attention(GQA)详解 Grouped-Query Attention(GQA) 是 Multi-Query Attention(MQA) 的改进版,它通过在 多个查询头(Query Heads)之间共享 Key 和 Value&am…...

DeepSeek AI人工智能该如何学习?

人工智能(Artificial Intelligence, AI)是当今科技领域的热门话题,它涵盖了机器学习、深度学习、自然语言处理、计算机视觉等多个子领域。 作为中国科技发展的核心方向之一,AI在国家战略规划中占据了重要地位,特别是在…...

【数据库】【MySQL】索引

MySQL中索引的概念 索引(MySQL中也叫做"键(key)")是一种数据结构,用于存储引擎快速定找到记录。 简单来说,它类似于书籍的目录,通过索引可以快速找到对应的数据行,而无需…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

synchronized 学习

学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...