本小结是学习技能释放的最后一节,本节将技能框和释放连接起来。先看一下效果:
在我们的游戏界面下方会并排放置5个技能按钮,单击数字1释放火焰技能,然后火焰技能开始冷却;单击数字2释放水球技能,释放完成后冷却;单击数字3释放龙卷风技能;点击数字4释放黑暗精灵技能;点击数字5释放混合技能。
一、建立技能释放槽
首先切换到Player场景,在CanvasLayer添加HBoxContainer子节点,命名为SkillBox,用于保持技能。然后选中该节点,点击实例化场景按钮,选择我们新建的spell_button场景实例化到该节点。
然后复制此节点4次,表示5个技能栏。
进入spell_button场景,将custom_minimum_size设置为40px。选择SkillBox节点,将技能底部对齐。
结果如下:
二、编辑代码
(一).基础类
新建技能基础类,代码如下:
extends Resource #继承资源节点
class_name Skill #定义类名称为Skill
var cooldown:float #冷却时间
var texture:Texture2D #技能图标
var animation_name:String #技能动画
func _init(target): #初始化设置
target.cooldown.max_value=cooldown #目标对象的冷却时间最大值
target.texture_norlmal = texture #目标对象节能图标
target.timer.wait_time = cooldown #目标对象技能时间
#操作技能函数
func cast_spell(target):
print(animation_name+" casted from " + target.name)
(二)扩展技能
1.火焰技能
逐一定义技能类,第一个技能,火技能,命名为FireShortSkill.gd,代码如下:
extends Skill #继承自Skill
class_name FireShot #定义火焰技能
func _init(target): #初始函数
cooldown =2.0 #技能冷却时间2秒
animation_name="Fire" #技能动画
texture = preload("res://Sprites/skill/skill_icons/48x48/skill_icons4.png") #技能图标
super._init(target) #调用父类_init函数
func cast_spell(target): #调用技能函数
super.cast_spell(target) #调用父类的cast_spell函数
target.multi_shot() #调用对象的multi_shot函数
设置texture时候,可以通过文件系统,找到需要的图标,点击右键,选择复制路径,然后考到preload函数内
2.水球技能
同理,新建水球技能WaterBallSkill.gd,代码如下:
extends Skill #继承技能基础类
class_name WaterBall #定义水球技能类
func _init(target): #初始函数
cooldown =2.0 #技能冷却时间2秒
animation_name="Water" #技能动画
texture = preload("res://Sprites/skill/skill_icons/48x48/skill_icons48.png") #技能图标
super._init(target) #调用父类_init函数
func cast_spell(target): #调用技能函数
super.cast_spell(target) #调用父类的cast_spell函数
target.multi_shot(2,0.4,animation_name) #调用对象的multi_shot函数
3.龙卷风技能
extends Skill #继承技能基础类
class_name Tornado #定义龙卷风技能类
func _init(target): #初始函数
cooldown =7.0 #技能冷却时间7秒
animation_name="Tornado" #技能动画
texture = preload("res://Sprites/skill/skill_icons/48x48/skill_icons24.png") #技能图标
super._init(target) #调用父类_init函数
func cast_spell(target): #调用技能函数
super.cast_spell(target) #调用父类的cast_spell函数
target.single_shot(animation_name) #调用对象的multi_shot函数
4.黑暗幽灵技能
extends Skill #继承技能基础类
class_name DarkBall #定义龙卷风技能类
func _init(target): #初始函数
cooldown =2.0 #技能冷却时间7秒
animation_name="Dark" #技能动画
texture = preload("res://Sprites/skill/skill_icons/48x48/skill_icons29.png") #技能图标
super._init(target) #调用父类_init函数
func cast_spell(target): #调用技能函数
super.cast_spell(target) #调用父类的cast_spell函数
target.multi_shot(4,0.2,animation_name) #调用对象的multi_shot函数
5.混合技能
extends Skill #继承技能基础类
class_name Ultimate #定义多种混合技能类
func _init(target): #初始函数
cooldown =30.0 #技能冷却时间2秒
animation_name="Ultimate" #技能动画
texture = preload("res://Sprites/skill/skill_icons/48x48/skill_icons13.png") #技能图标
super._init(target) #调用父类_init函数
func cast_spell(target): #调用技能函数
super.cast_spell(target) #调用父类的cast_spell函数
target.radial(18) #调用对象的multi_shot函数
(三)技能槽和技能联系起来
给技能插槽添加代码 ,内容如下:
extends HBoxContainer
var slots:Array #定义技能插槽
var skills:Array =[FireShot,WaterBall,Tornado,DarkBall,Ultimate] #技能数组
func _ready():
slots = get_children() #获取该节点下所有子节点
for i in get_child_count(): #循环子节点
slots[i].change_key= str(i+1) #设置子节点的快捷键
slots[i].skill= skills[i].new(slots[i]) #连接技能到技能槽
最后效果如下: