第四十节实现主人公的技能释放功能(三)插槽释放技能实现

本小结是学习技能释放的最后一节,本节将技能框和释放连接起来。先看一下效果:
请添加图片描述

在我们的游戏界面下方会并排放置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])  #连接技能到技能槽

最后效果如下:
请添加图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游戏自学

生活不易,打赏随意

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值