您当前的位置: 首页 >  动画

开发游戏的老王

暂无认证

  • 1浏览

    0关注

    803博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Godot Engine:街霸隆在动画状态机基础上实现的必杀技触发

开发游戏的老王 发布时间:2020-10-28 18:42:49 ,浏览量:1

书接上文《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

关注
打赏
1656935939
查看更多评论
立即登录/注册

微信扫码登录

0.0404s