ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

【Godot】时间线(技能)节点 4.1游戏中一般都会有各种各样的技能或者其他需要按一定的时间顺序去执行的功能。这里我写出了一个时间线节点就像是在播放动画一样按一定的阶段去执行某些功能## Timeline ##-author:zhangxuetu #-datetime:2023-09-2423:10:53#-version:4.1#class_name _TimeLineextendsNode## 执行完这个阶段时发出这个信号 signalexecuted_stage(stage,data)## 手动停止执行 signal stopped ## 暂停执行 signal paused ## 继续执行 signal resumed ## 执行完成 signal finished ## process 执行方式enumProcessExecuteMode{PROCESS,## _process 执行PHYSICS,## _physics_process 执行}enum{UNEXECUTED,## 未执行EXECUTING,## 执行中PAUSED,## 暂停中}## 时间阶段名称。这关系到[method execute]方法中的数据获取的时间数据 exportvarstages:Array[]## process 执行方式。如果设置为[memberPROCESS]或[memberPHYSICS]以外的值 ## 则当前节点的线程将不会执行 exportvarprocess_execute_mode:ProcessExecuteModeProcessExecuteMode.PROCESSvar_last_data:Dictionaryvar_point:int-1:set(v):if_point!v:_pointvif_point0and _pointstages.size():self.executed_stage.emit(stages[_point],_last_data)var_time:floatvar_execute_state:intUNEXECUTED:set(v):if_execute_statev:return_execute_statev match _execute_state:UNEXECUTED:set_process(false)set_physics_process(false)EXECUTING:ifprocess_execute_modeProcessExecuteMode.PROCESS:set_process(true)elif process_execute_modeProcessExecuteMode.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_time0:_point1if_pointstages.size():_time_last_data[stages[_point]]else:_point-1_execute_stateUNEXECUTEDself.finished.emit()breakfuncget_time_left():return_time funcget_last_data()-Dictionary:return_last_data funcget_last_stage():returnstages[_point]## 执行功能。这个数据里需要有[member stages]中的 key 的数据且需要是[int]或[float]## 类型作为判断执行的时间。否则默认时间为0funcexecute(data:Dictionary):_last_datadata _time0_point0ifnot stages.is_empty():_execute_stateEXECUTINGforstageinstages:_last_data[stage]float(data.get(stage,0))# 执行时会先执行一下 _time_last_data[stages[0]]_exec(0)else:printerr(没有设置 stages必须要设置每个执行的阶段的 key 值)## 获取执行状态 funcget_execute_state():return_execute_state ## 是否正在执行 funcis_executing():return_execute_stateEXECUTING## 停止执行 funcstop():if_execute_stateEXECUTING:_execute_stateUNEXECUTEDself.stopped.emit()## 暂停执行 funcpause():if_execute_stateEXECUTING:_execute_statePAUSED## 恢复执行 funcresume():if_execute_statePAUSED:_execute_stateEXECUTINGself.resumed.emit()## 跳跃到这个阶段 funcgoto(stage,emit_stage_changed_signal:booltrue):if_execute_stateEXECUTING:ifstages.has(stage):_pointstage _time0ifemit_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-2421:51:11#-version:4.1#extendsNode2Dvartimeline_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]2execute:print( 实际执行功能这里写这个阶段要做的事情)after:print( 已经执行完功能进行后续结束动作)refresh:print( ,data[name], 结束动作完成开始进行倒计时刷新)这里我在执行这个技能的时候传入上面各个阶段所需要的时间的数据然后在 executed_stage 信号中进行判断各个阶段所需要处理的功能。这样一个技能节点即可完成使用时调用 execute 方法即可
返回列表