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

【Godot】时间线(技能)节点

4.1

游戏中一般都会有各种各样的技能,或者其他需要按一定的时间顺序去执行的功能。

这里我写出了一个时间线节点,就像是在播放动画一样,按一定的阶段去执行某些功能

#============================================================
#    Timeline
#============================================================
# - author: zhangxuetu
# - datetime: 2023-09-24 23:10:53
# - version: 4.1
#============================================================
class_name _TimeLine
extends Node## 执行完这个阶段时发出这个信号
signal executed_stage(stage, data)
## 手动停止执行
signal stopped
## 暂停执行
signal paused
## 继续执行
signal resumed
## 执行完成
signal finished## process 执行方式
enum ProcessExecuteMode {PROCESS, ## _process 执行PHYSICS, ## _physics_process 执行
}enum {UNEXECUTED, ## 未执行EXECUTING, ## 执行中PAUSED, ## 暂停中
}## 时间阶段名称。这关系到 [method execute] 方法中的数据获取的时间数据
@export var stages : Array = []
## process 执行方式。如果设置为 [member PROCESS][member PHYSICS] 以外的值,
## 则当前节点的线程将不会执行
@export var process_execute_mode : ProcessExecuteMode = ProcessExecuteMode.PROCESSvar _last_data : Dictionary
var _point : int = -1:set(v):if _point != v:_point = vif _point >= 0 and _point < stages.size():self.executed_stage.emit(stages[_point], _last_data)
var _time : float
var _execute_state : int = UNEXECUTED:set(v):if _execute_state == v:return_execute_state = vmatch _execute_state:UNEXECUTED:set_process(false)set_physics_process(false)EXECUTING:if process_execute_mode == ProcessExecuteMode.PROCESS:set_process(true)elif process_execute_mode == ProcessExecuteMode.PHYSICS:set_physics_process(true)PAUSED:set_process(false)set_physics_process(false)func _ready():set_process(false)set_physics_process(false)func _process(delta):_exec(delta)func _physics_process(delta):_exec(delta)func _exec(delta):_time -= deltawhile _time <= 0:_point += 1if _point < stages.size():_time += _last_data[stages[_point]]else:_point = -1_execute_state = UNEXECUTEDself.finished.emit()breakfunc get_time_left():return _timefunc get_last_data() -> Dictionary:return _last_datafunc get_last_stage():return stages[_point]## 执行功能。这个数据里需要有 [member stages] 中的 key 的数据,且需要是 [int][float]
## 类型作为判断执行的时间。否则默认时间为 0
func execute(data: Dictionary):_last_data = data_time = 0_point = 0if not stages.is_empty():_execute_state = EXECUTINGfor stage in stages:_last_data[stage] = float(data.get(stage, 0))# 执行时会先执行一下_time = _last_data[stages[0]]_exec(0)else:printerr("没有设置 stages,必须要设置每个执行的阶段的 key 值!")## 获取执行状态
func get_execute_state():return _execute_state## 是否正在执行
func is_executing():return _execute_state == EXECUTING## 停止执行
func stop():if _execute_state == EXECUTING:_execute_state = UNEXECUTEDself.stopped.emit()## 暂停执行
func pause():if _execute_state == EXECUTING:_execute_state = PAUSED## 恢复执行
func resume():if _execute_state == PAUSED:_execute_state = EXECUTINGself.resumed.emit()## 跳跃到这个阶段
func goto(stage, emit_stage_changed_signal: bool = true):if _execute_state == EXECUTING:if stages.has(stage):_point = stage_time = 0if emit_stage_changed_signal:self.executed_stage.emit()else:printerr("stages 中没有 ", stage, ". 所有 stage: ", stages)

这里我进行添加整个时间中有哪些阶段,我想一个技能需要有下面几个阶段:

start(开始执行功能,一般用于判断这个条件下是否可以进行执行这个功能,以便进行功能的打断等操作);before 执行功能时的施放动作前摇;execute 具体执行出的功能;after 执行功能后的动画结束;refresh 技能刷新阶段。

这是我的理解,可以自行随意设计。

下面的代码我创建了只有一个 Node2D 作为根节点的场景,进行测试

#============================================================
#    Time Line Test
#============================================================
# - author: zhangxuetu
# - datetime: 2023-09-24 21:51:11
# - version: 4.1
#============================================================
extends Node2Dvar timeline = _TimeLine.new()func _ready():timeline.stages = [&"start", &"before", &"execute", &"after", &"refresh"]add_child(timeline)timeline.executed_stage.connect(_executed_stage)timeline.execute({"name": "技能名称",&"start": 0,&"before": 0.4,&"execute": 0.2,&"after": 0.2,&"refresh": 3,})func _executed_stage(stage, data):match stage:&"start":print("   开始执行: ", data["name"])&"before":print("   播放动作")# 临时修改执行时间,延长或缩短时间data[&"execute"] = 2&"execute":print("   实际执行功能,这里写这个阶段要做的事情")&"after":print("   已经执行完功能,进行后续结束动作")&"refresh":print("   ", data["name"], " 结束动作完成,开始进行倒计时刷新")

这里我在执行这个技能的时候,传入上面各个阶段所需要的时间的数据,然后在 executed_stage 信号中进行判断各个阶段所需要处理的功能。

这样一个技能节点即可完成,使用时调用 execute 方法即可

相关文章:

【Godot】时间线(技能)节点

4.1 游戏中一般都会有各种各样的技能&#xff0c;或者其他需要按一定的时间顺序去执行的功能。 这里我写出了一个时间线节点&#xff0c;就像是在播放动画一样&#xff0c;按一定的阶段去执行某些功能 # # Timeline # # - author: zhangxuetu # - datetime: 2023-09-24 23…...

每日练习-9

目录 1、井字棋 2、密码强度等级 3、二维数组中的查找 4.调整数组奇数偶数 5.旋转数组中的最小元素 6、替换空格 1、井字棋 解析&#xff1a;井字棋有四种情况表示当前玩家获胜&#xff0c;行全为1&#xff0c; 列全为1&#xff0c;主对角全为1&#xff0c; 副对角全为1。遍历…...

微信小程序 -- 页面间通信

前言 今天我们来说下微信小程序的页面间通信&#xff1a; 通过url传参实现页面间单向通信通过getCurrentPages()页面栈实现页面间单向通信通过EventChannel实现页面间双向通信 1、url传参 我们知道页面之间的跳转可以通过路由组件来实现&#xff0c;其中组件的属性url就是要…...

关于Jupyter markdown的使用

一级标题 #空格 标题1 二级标题 ## 空格 标题2 三级标题 ###空格 标题3 无序&#xff1b; 有序&#xff1a; 数学符号&#xff1a;...

【C语言】字符函数和内存操作函数

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解字符函数和内存操作函数&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一.字符函数1.1 字符分类函数1.2 字符转换函数 二.内存操作函数2.1 memcpy2.2…...

SpringBoot大文件上传实现分片、断点续传

大文件上传流程 客户端计算文件的哈希值&#xff0c;客户端将哈希值发送给服务端&#xff0c;服务端检查数据库或文件系统中是否已存在相同哈希值的文件&#xff0c;如果存在相同哈希值的文件&#xff0c;则返回秒传成功结果&#xff0c;如果不存在相同哈希值的文件&#xff0…...

React 注意事项

在使用 React 进行开发时&#xff0c;有一些注意事项可以帮助你更好地使用这个JavaScript库。以下是一些需要注意的事项&#xff1a; 组件结构和组织 尽量保持组件简单和可复用&#xff1a;将组件拆分为较小和独立的部分&#xff0c;以提高代码的可维护性和可测试性。遵循单一…...

常见排序算法Java版(待续)

冒泡排序O(n^2) public class Main {public static void main(String[] args) {Random random new Random();int[] nums new int[]{random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100)};for (i…...

Jmeter 多实例压测

Apache JMeter 是一个开源的 Java 应用程序&#xff0c;用于性能测试和负载测试。它最初是为测试 Web 应用程序而创建的&#xff0c;但现在已广泛用于测试各种不同类型的应用程序&#xff0c;包括数据库、消息队列、FTP 服务器等。JMeter 提供了丰富的功能&#xff0c;使您能够…...

线程安全问题 --- 内存可见性问题

小王学习录 本月鸡汤:什么是内存可见性问题引起内存可见性问题的原因如何解决内存可见性问题volatile使用规范编外: 工作内存(工作存储区)由前面文章介绍可以知道, 引起线程安全问题有 五个原因, 分别是: 线程抢占式执行, 随即调度(根本原因); 多个线程对同一变量执行 修改操…...

消息队列 Kafka

Kafka Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域 为什么使用消息队列MQ 在高并发环境下&#xff0c;同步请求来不及处理会发生堵塞&#xff0c;从而触发too many conne…...

抽象轻松的java-mybatis简单入门

第一步&#xff1a;用IDEA新建一个java包 第二步&#xff1a;在IDEA中添加数据库&#xff08;ps&#xff1a;自己百度&#xff09; 点击数据库 第二步&#xff0c;新建数据库 选择你使用的数据库 用户与密码根据自己的设置进行配置 为了更方便的查看数据库&#xff0c;可以像图…...

012-第二代硬件选型

第二代硬件选型 文章目录 第二代硬件选型项目介绍重新换平台缘由X86 && Arm 架构切换 ARM Linux 硬件选型系统确定Qt 版本确定总结一下 关键字&#xff1a; Qt、 Qml、 Arm、 X86、 linux 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QM…...

Spring中的设计模式

目录 工厂模式 组合模式 适配器模式 代理模式 单例模式 观察者模式 模板方法模式 责任链模式 Spring有着非常优雅的设计&#xff0c;很多地方都遵循SOLID原则&#xff0c;里面的设计模式更是数不胜数大概有以下几种&#xff1a; 工厂模式 所谓的工厂模式&#xff0c;核…...

软考 系统架构设计师系列知识点之软件质量属性(1)

这个十一注定是一个不能放松、保持“紧”的十一。由于报名了全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;11月4号就要考试&#xff0c;因此8天长假绝不能荒废&#xff0c;必须要好好利用起来。现在将各个核心知识点一一进行提炼并做记录。 所…...

GPT系列论文解读:GPT-1

GPT系列 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一系列基于Transformer架构的预训练语言模型&#xff0c;由OpenAI开发。以下是GPT系列的主要模型&#xff1a; GPT&#xff1a;GPT-1是于2018年发布的第一个版本&#xff0c;它使用了12个Transformer…...

数学分析:含参变量的积分

同样很多收敛性的证明不是重点&#xff0c;但里面的知识还是需要适当掌握&#xff0c;知道中间的大致思考和解决路径即可。 本质还是极限的可交换性&#xff0c;求导可以换到积分里面去操作。 这里要注意变量的区别&#xff0c;首先积分的被积变量是x&#xff0c;但是函数的变量…...

关于一篇ElementUI之CUD+表单验证

目录 一.CUD增删改查简述 1.1.增删改功能实现 二.表单验证 前端所有代码&#xff1a; 好啦今天就分享到这了&#xff0c;希望能帮到你哦&#xff01;&#xff01;&#xff01; 以下的代码基于我博客中的代码进行续写 : 关于ElementUI之动态树数据表格分页实例 一.CUD增删改…...

VUE模板编译的实现原理

前言 在Vue.js 2.0中&#xff0c;模板编译是通过将模板转换为渲染函数来实现的。渲染函数是一个函数&#xff0c;它返回虚拟DOM节点&#xff0c;用于渲染实际的DOM。Vue.js的模板编译过程可以分为以下几个步骤&#xff1a; 将模板解析为抽象语法树&#xff08;AST&#xff09…...

基础算法之——【动态规划之路径问题】1

今天更新动态规划路径问题1&#xff0c;后续会继续更新其他有关动态规划的问题&#xff01;动态规划的路径问题&#xff0c;顾名思义&#xff0c;就是和路径相关的问题。当然&#xff0c;我们是从最简单的找路径开始&#xff01; 动态规划的使用方法&#xff1a; 1.确定状态并…...

三十三、【进阶】索引的分类

1、索引的分类 &#xff08;1&#xff09;总分类 主键索引、唯一索引、常规索引、全文索引 &#xff08;2&#xff09;InnoDB存储引擎中的索引分类 2、 索引的选取规则(InnoDB存储引擎) 如果存在主键&#xff0c;主键索引就是聚集索引&#xff1b; 如果不存在主键&#xff…...

VBox启动失败、Genymotion启动失败、Vagrant迁移

VBox启动失败、Genymotion启动失败、Vagrant迁移 2023.10.9 最新版本vbox7.0.10、Genymotion3.5.0 Vbox启动失败 1、查看日志 Error -610 in supR3HardenedMainInitRuntime! (enmWhat4) Failed to locate ‘vcruntime140.dll’ 日志信息查看方法->找到虚拟机所在位置->…...

一篇短小精悍的文章让你彻底明白KMP算法中next数组的原理

以后保持每日一更&#xff0c;由于兴趣较多&#xff0c;更新内容不限于数据结构&#xff0c;计算机组成原理&#xff0c;数论&#xff0c;拓扑学......&#xff0c;所谓&#xff1a;深度围绕职业发展&#xff0c;广度围绕兴趣爱好。往下看今日内容 一.什么是KMP算法 KMP&#x…...

CSS盒子定位的扩张

定位的扩展 绝对定位&#xff08;固定定位&#xff09;会完全压住盒子 浮动元素不会压住下面标准流的文字&#xff0c;而绝对定位或固定位会压住下面标准流的所有内容 如果一个盒子既有向左又有向右&#xff0c;则执行左&#xff0c;同理执行上 显示隐藏 display: none&…...

SpringBoot整合POI实现Excel文件读写操作

1.环境准备 1、导入sql脚本&#xff1a; create database if not exists springboot default charset utf8mb4;use springboot;create table if not exists user (id bigint(20) primary key auto_increment comment 主键id,username varchar(255) not null comment 用…...

从零开始的力扣刷题记录-第八十七天

力扣每日四题 129. 求根节点到叶节点数字之和-中等130. 被围绕的区域-中等437. 路径总和 III-中等376. 摆动序列-中等总结 129. 求根节点到叶节点数字之和-中等 题目描述&#xff1a; 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 …...

【1】c++设计模式——>UML类图的画法

UML介绍 UML:unified modeling language 统一建模语言 面向对象设计主要就是使用UML类图&#xff0c;类图用于描述系统中所包含的类以及他们之间的相互关系&#xff0c;帮助人们简化对系统的理解&#xff0c;他是系统分析和设计阶段的重要产物&#xff0c;也是系统编码和测试的…...

SAP UI5 指定 / 变更版本

SAP UI5 指定 / 变更版本 Currently, SAP Fiori tools support SAP Fiori elements and SAPUI5 freestyle projects with minimum SAPUI5 versions 1.65 or higher. In case there’s a need to test an existing projects with a lower SAPUI5 version, the following worka…...

SpringMVC中异常处理详解

单个控制器异常处理 // 添加ExceptionHandler&#xff0c;表示该方法是处理异常的方法&#xff0c;属性为处理的异常类ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})public String exceptionHandle1(Exception ex, Model mo…...

PPT课件培训视频生成系统实现全自动化

前言 困扰全动自化的重要环节&#xff0c;AI语音合成功能&#xff0c;终于可以实现自动化流程&#xff0c;在此要感谢团队不懈的努力和韧性的精神&#xff01; 实现原理 请参照我的文章《Craneoffice云PPT课件培训视频生成系统》 基本流程 演示视频 PPT全自动 总结 过去实…...