【Godot4自学手册】第四十六节实现闪电攻击、闪电链

本节内容,主要学习闪电攻击魔法。闪电攻击又名为闪电链,就是在几个敌人之间产生不断跳动的闪电攻击效果。本节主要实现的是单击鼠标右键,会在敌人之间产生随机的闪电链条,效果如下:
请添加图片描述

一、基本闪电的建立

新建2D场景,命名为Lightning,添加子节点Sprite2D命名为light,目录结构如下:
请添加图片描述

将我们事先准备好的闪电蔬菜拖入到light的Texture属性。在其Region属性下将Enabled开启,如图所示:
请添加图片描述

同时开启图片无缝重复功能,开启方式如下图:
请添加图片描述

为根节点添加LightningSprite脚本,编写如下代码:

extends Node2D
@onready var lsprite = $light  #获取闪电图片
@export var waittime:float=0.05  #动画间隔时间#释放闪电函数,一个参数表示第一个物体,参数二表示第二个物体,这样会在两个物体间产生一条闪电。
func  flicker(objectone,objecttwo):position = objectone.position#设置闪电起始位置为第一个物体var vector2:Vector2 = objectone.position - objecttwo.position#计算连个物体间有关向量set_deferred("rotation",vector2.angle() - PI/2.1) #设置闪电旋转角度var length = vector2.length() #计算闪电长度lsprite.show()  #显示闪电playLightiingAnima(length) #播放闪电动画#闪电动画,主要原理是对图片素材进行剪切,每个一段时间播放一张图片
func  playLightiingAnima(length:float):chargeSize(Rect2(3,0,11,length))  #切割素材图片,选取其中一部分await  get_tree().create_timer(waittime).timeout #等待一段时间进行下一部分图片显示chargeSize(Rect2(20,0,11,length))await  get_tree().create_timer(waittime).timeoutchargeSize(Rect2(35,0,11,length))await  get_tree().create_timer(waittime).timeoutchargeSize(Rect2(51,0,11,length))await  get_tree().create_timer(waittime).timeoutchargeSize(Rect2(65,0,11,length))await  get_tree().create_timer(waittime).timeoutqueue_free()#切割素材图片,选取其中一部分
func chargeSize(RegionBox:Rect2):		lsprite.offset= Vector2(0,RegionBox.size.y/2*-1)  #移到图片素材的对应位置lsprite.region_rect = RegionBox  #切割的具体图片大小

二、场景建立魔法管理

新建2D场景,命名为light_sence。拖入敌人的素材,然后添加分组enemy。如下:
请添加图片描述
添加Node2d节点,命名为SkillManger,并添加如下代码:

extends Node2D
#预加载闪电场景
@onready var ligtningO:PackedScene = preload("res://Scenes/lightning_sprite.tscn")#释放闪电函数 第一个参数表示释放闪电的物体数组,第二个参数表示释放深度,也就是可以释放几条闪电链	
func castLigtning(enemyObject:Array,depth:int):if enemyObject.size()==0: #没有释放物体直接退出returnif enemyObject.size()==1:print("长度为1")#如果只有一个物体不会释放闪电链,咱可以释放闪电球returnif enemyObject.size()==2:#两个物体直接释放一条闪电链条var lightskill = ligtningO.instantiate()add_child(lightskill)lightskill.flicker(enemyObject[0],enemyObject[1])else:#随机排列数组var array_length = enemyObject.size()    # 随机排列数组for i in range(array_length):# 获取一个随机索引var random_index = randi_range(0, array_length - 1) # 交换当前索引和随机索引的元素var temp = enemyObject[i]enemyObject[i] = enemyObject[random_index]enemyObject[random_index] = temp#如果物体的数量多余或等于释放深度,根据深度进行如下释放闪电链if enemyObject.size()>=depth:for i in depth:var lightskill = ligtningO.instantiate()add_child(lightskill)lightskill.flicker(enemyObject[i],enemyObject[i+1])await  get_tree().create_timer(.1).timeout #间隔0.1秒释放下一闪电链else:#如果物体的数量多余或等于释放深度,根据物体数量进行如下释放闪电链var index:int = 0for child in enemyObject:if index>=enemyObject.size()-1:returnelse:	var lightskill = ligtningO.instantiate()add_child(lightskill)lightskill.flicker(enemyObject[index],enemyObject[index+1])index =index+1await  get_tree().create_timer(.05).timeout

为根节点添加代码如下:

extends Node2D
@onready var skill_manger = $SkillManger #获取技能管理节点func _input(event):if event.is_action_pressed("sword"):#如果按下鼠标攻击键var enemyList = get_tree().get_nodes_in_group("enemy") #通过分组获取敌人skill_manger.castLigtning(enemyList,randi_range(1,3)) #释放闪电技能,随机产生闪电链深度

这里重点说明一下 event.is_action_pressed(“sword”)是我们以前设置好的攻击键,这里用的是鼠标单击左键。这个映射是在菜单栏项目下的项目设置里面进行的设置,如下:
请添加图片描述

最后我们看一下最后效果:
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/417518.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MIT线性代数

本文链接的原创作者为 浊酒南街https://blog.csdn.net/weixin_43597208 第1讲 MIT_线性代数笔记:第 01 讲 行图像和列图像-CSDN博客 第2讲 MIT_线性代数笔记:第 02 讲 矩阵消元_矩阵first pivot-CSDN博客 第3讲 MIT_线性代数笔记:第 03…

C++ 继承(二)

目录 1. 实现一个不能被继承的类 2. 友元与继承 3.继承与静态成员 4.多继承及其菱形继承问题 (1). 继承模型 (2). 虚继承 (2.1)虚继承解决数据冗余和二义性的原理 (3). 多继承中指针偏移问题 (4). IO库中的菱形虚拟继承 5. 继承和组合 1. 实现一个不能被继承的类 方法1…

安卓玩机工具-----通用安卓玩机工具 “搞机助手”界面预览 推荐

在网络中有很多很好玩的工具。方便安卓机型联机使用各种功能。系列博文将详细的演示有些工具的特点与使用方法 搞机助手 作者:流水断崖 目前开发功能有:Twrp recovery全自动刷机,免Root冻结、卸载预装软件,免Root激活&#xff…

谈一谈MVCC

一 MVCC的定义 MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用于数据库管理系统(DBMS)中的并发控制方法,它允许数据库读写操作不加锁地并发执行,从而提高了数据库系统的并发性…

什么是ARM架构?什么是X86架构?两者的区别是什么?

一、什么是ARM架构 (一)起源于发展 ARM 架构由英国剑桥的 Acorn 计算机公司开发。因市场无合适产品,Acorn 自行设计出第一款微处理器,命名为 ARM。此后 ARM 架构不断发展,1990 年为与苹果合作成立 ARM 公司&#xff0…

鸿蒙轻内核M核源码分析系列三 数据结构-任务排序链表

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 在鸿蒙轻内核源码分析系列一和系列二,我们分析了双向循环链表、优先级就绪队列的源码。本文会继续给读者介绍鸿蒙轻内核源码中重要的数据结构…

运动耳机怎么选购?解密最值得购买的五大品牌!

​现在大家都越来越注重健康,运动成了很多人的日常,不管是轻松跑跑步还是来点高强度训练,都能让人身心都受益。运动时候如果能听点音乐,那感觉就更好了,能让运动效果更上一层楼。但是,那种塞进耳朵里的耳机…

Cmake之2.4版本重要特性及用法实例(十)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

S3C2440开发板:时钟,PWM定时器控制蜂鸣器发声

时钟 时钟和电源管理模块由三部分组成:时钟控制,USB 控制和电源控制。 S3C2440A 中的时钟控制逻辑可以产生必须的时钟信号,包括 CPU 的 FCLK,AHB 总线外设的 HCLK 以及 APB 总线外设的 PCLK。S3C2440A 包含两个锁相环&#xff08…

数据结构:(LeetCode203)移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]示例 2: 输入&#xff1…

深度学习之 OpenCV 图像边缘检测算法解析及代码演示

引言 在计算机视觉领域,边缘检测是一种重要的图像预处理技术,用于识别图像中对象的边界。边缘检测有助于提取图像的关键特征,这对于后续的图像分析(如物体识别、运动检测等)至关重要。OpenCV 是一个强大的计算机视觉库…

这个俄罗斯平台爆火跨境圈,据说大卖已冲!无货源卖家又行了?

近几年,俄罗斯电商市场的增长速度非常惊人,从宏观来看,俄罗斯已经超越东南亚各国,成为2023年网上零售销售额增长最快的国家。据权威数据分析机构Statista的预测,2024年俄罗斯电子商务市场的收入预计能够达到337.6亿美元…

11、Django Admin启用对计算字段的过滤

重新定义admin.py中的Hero管理模型如下: admin.register(Hero) class HeroAdmin(admin.ModelAdmin):list_display ("name", "is_immortal", "category", "origin", "is_very_benevolent")list_filter ("…

代码随想录算法训练营第32天 动态规划part01| 题目:理论基础 、 509. 斐波那契数 、70. 爬楼梯 、 746. 使用最小花费爬楼梯

代码随想录算法训练营第32天 动态规划part01| 题目:理论基础 、 509. 斐波那契数 、70. 爬楼梯 、 746. 使用最小花费爬楼梯 文章来源:代码随想录 理论 题目名称:509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的…

沐渥科技:两显氮气柜和三显氮气柜要怎么选择?

两显氮气柜通常指的是控制面板上有两个LED数码显示界面,用于显示温度和湿度;三显氮气柜则有三个LED数码显示界面,能够直观地显示出温度、湿度和含氧量。这样的设计便于用户快速全面地了解柜内环境状态,不需要额外的操作即可掌握所…

PHP智能匹配轻松预订自习室在线订座系统小程序源码

智能匹配,轻松预订——自习室在线订座系统 📚【开篇:告别排队,迎接智能学习新时代】📚 还在为找不到合适的自习室座位而烦恼吗?是不是每次去图书馆或自习室都要提前好久去排队占位?现在&#…

不同大模型代码解释对比

包含ChatGPT,讯飞星火,通义千问,腾讯元宝,智谱清言。 目标是想让大模型解释一个用于预处理人体骨骼关节三维坐标数据样本进行填补空帧的Python函数。 def f_padding_none(data):s data.copy()# print(pad the null frames with…

笔记整理—uboot番外(6)针对x210的网卡说明

对于x210而言,在三星中与九鼎官方的uboot都默认使用了二号串口。详见CONFIG_SERIALn(n1~4)。 更改串口后,应先插回原串口,进行iROM打印,内部iNnad校验核失败的信息,之后再插入其串口进行启动。 …

win10添加右键菜单打开VSCode

当进入一个文件夹后,想右键直接打开我的工程,用发现没有vscode项。本文就来介绍如何右键通过vsCode打开项目。步骤1:在桌面新建一个txt文档,用文本编辑器打开 步骤2: 查看vscode所在位置 在桌面找到vscode快捷键图标&…

EasyExcel 文件导出 - 合并某些列值相同的行

文章目录 EasyExcel 文件导出 - 合并某些列值相同的行最终效果实现思路创建单元格合并的策略类使用 EasyExcel 文件导出 - 合并某些列值相同的行 在数据处理与文件导出的过程中,我们常常会遇到各种特定的需求。今天,我们就来探讨一下使用 EasyExcel 进行…