书接上文《Godot Engine:街霸隆的动画状态机(Animation State Machine)》,我们已经为隆构造简单的动画状态机,本章节我们把《Godot Engine:格斗游戏中的必杀技(大招/绝招/特殊技/Special Move )输入系统实现》一文中实现的必杀技输入系统也添加到项目中。
效果图
文章目录
隆的脚本
- 效果图
- 隆的脚本
- 添加必杀技输入系统
这回我们不在隆的脚本中直接接受必杀技的输入了,而是采用回调的方式
#Ryu
extends Spatial
onready var playback : AnimationNodeStateMachinePlayback = $AnimationTree.get("parameters/playback")
func _ready():
add_to_group("Ryu")
func do_combo(combo_name):
playback.travel(move_name + "@Ryu")
添加必杀技输入系统
# SpecialMoveInput
extends Node
enum { NONE ,UP,DOWN,LEFT,RIGHT,A,B} #和必杀技相关的事件
var action_queue : Array = []#输入的事件队列,NONE事件会被过滤掉
var counter := 0#计时(数)器
var is_reading := false#标记是否在输入必杀技
const MAX_COUNT := 100#最大帧数
### 记录大招的字典
var combos : Dictionary = {
"Shoryuken" : [RIGHT,DOWN,RIGHT,A] ,
"Hadoken" : [DOWN,RIGHT,A]
}
func _process(delta):
var current_action = read_action()
if current_action != NONE:
if not is_reading:
is_reading = true
action_queue.push_back(current_action)
for combo_name in combos:
if check_combo(action_queue,combos[combo_name]):
trigger_combo(combo_name)
print( combo_name )
reset()
break
if is_reading:
counter += 1
if counter >= MAX_COUNT:#如果超出了输入时限。则系统归零
reset()
#读入输入事件
func read_action():
var action = NONE
if Input.is_action_just_pressed("UP"):
action = UP
if Input.is_action_just_pressed("DOWN"):
action = DOWN
if Input.is_action_just_pressed("LEFT"):
action = LEFT
if Input.is_action_just_pressed("RIGHT"):
action = RIGHT
if Input.is_action_just_pressed("A"):
action = A
if Input.is_action_just_pressed("B"):
action = B
return action
#检查是否有大招成功被激发
func check_combo(s,t):
if s.size() t.size():
c = s.duplicate()
c.invert()
c.resize(t.size())
c.invert()
else:
c = s
for i in range(t.size()):
if c[i] != t[i]:
return false
return true
#触发角色的大招
func trigger_combo(combo_name):
get_tree().call_group("Ryu","do_combo",combo_name)
#系统归零
func reset():
action_queue.clear()#清空输入队列
counter = 0#计时器清零
is_reading = false