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

news2024/12/24 0:04:59

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

一、基本闪电的建立

新建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).timeout
	chargeSize(Rect2(35,0,11,length))
	await  get_tree().create_timer(waittime).timeout
	chargeSize(Rect2(51,0,11,length))
	await  get_tree().create_timer(waittime).timeout
	chargeSize(Rect2(65,0,11,length))
	await  get_tree().create_timer(waittime).timeout
	queue_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: #没有释放物体直接退出
		return
	if enemyObject.size()==1:
		print("长度为1")#如果只有一个物体不会释放闪电链,咱可以释放闪电球
		return
	if 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 = 0
			for child in enemyObject:
				if index>=enemyObject.size()-1:
					return
				else:	
					var lightskill = ligtningO.instantiate()
					add_child(lightskill)
					lightskill.flicker(enemyObject[index],enemyObject[index+1])
					index =index+1
					await  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.coloradmin.cn/o/2109556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蚂蚁数科独立后首度公布业务进展和战略布局

“过去一年,蚂蚁数科客户数增长35%。旗下多个产品取得所属赛道市场份额第一。”9月5日下午,蚂蚁数科CEO赵闻飙在外滩大会媒体交流会上透露。这是自今年3月份蚂蚁数科独立化运营后,赵闻飙首次对外公布公司的业务进展及战略布局。 赵闻飙还透露…

分布式风电电池储能系统

风能作为一种清洁的可再生能源,越来越受到世界各国的*视。但风能随机波动的特点,造成风电出力的频繁波动,使电网的调频、调峰压力加大,成为长期困扰风电并网的主要难题。 我国的弃风限电*次出现于2010年,此后弃风从零星现象快速扩散,2012年的情况*为严*,弃风率达17%。之后随着…

使用iperf3进行网络性能测试的完整指南

目录 前言1. 什么是iperf3?2. 如何下载并安装iperf32.1 Ubuntu/Debian安装iperf32.2 CentOS安装2.3 Windows系统下安装iperf32.4 macOS系统下安装iperf3 3. iperf3命令详解3.1 基本命令3.2 常用参数说明3.3 其他常用参数 4. 使用iperf3测试网络性能4.1 TCP性能测试4…

flutter的入口和原生交互

从今天起,笔者要开始从flutter列表页面向原生页面跳转了 首先遇到了N个No such module "Flutter" 因为笔者的公司其实是从前往后改造Flutter的,所以也不需要引擎组,但是笔者搞不懂,只能照着葫芦画瓢,以后等…

不同大模型代码解释对比

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

Electron32-Vue3OS桌面管理os模板|vite5+electron32+arco后台os系统

原创新作electron32.xvue3arco.design仿ipad/windows桌面os系统。 基于最新跨平台技术Electron32、Vite5、Vue3 setup、Pinia2、Arco-Design、Echarts、Sortablejs实战开发桌面版osx管理系统。内置ipad/windows两种桌面风格模板、动态json配置桌面图标、自研栅格拖拽布局模板。…

Anthropic发布Claude企业计划 对标OpenAI的ChatGPT Enterprise

领先的人工智能初创公司 Anthropic 今天宣布推出Claude企业计划,以扩大Claude在企业中的应用。OpenAI 早在 2023 年就推出了名为ChatGPT Enterprise 的类似产品,并取得了相当大的成功。事实上,OpenAI 声称,财富 500 强中已有 92% …

CentOS文件和目录命令

CentOS文件和目录命令 在CentOS上,文件和目录是操作系统的核心部分,掌握其基本操作是使用Linux的第一步。文件系统是Linux用户和系统进行交互的主要方式,理解文件和目录的管理对于执行各种操作至关重要。以下是CentOS中与文件和目录相关的主…

【有啥问啥】数据结构哈希链(Hash Chain)的详解与技术探讨

数据结构哈希链(Hash Chain)的详解与技术探讨 引言 哈希链(Hash Chain)是一种利用哈希函数将一系列数据块(或区块)链接起来的数据结构,广泛应用于区块链技术、数据完整性验证以及安全存储等领…

校园订餐系统小程序的设计

管理员账户功能包括:系统首页,个人中心,餐厅信息管理,美食信息管理,订单管理 微信端账号功能包括:系统首页,餐厅信息,美食信息,购物车,我的 开发系统&#…

Java+Swing+dat文件存储实现学生选课管理系统

JavaSwingdat文件存储实现学生选课管理系统 一、系统介绍二、系统展示1.用户登陆、注册2.课程信息查询3.添加课程4.选课5.退课 三、系统实现四、其他1.其它系统 一、系统介绍 功能展示:用户注册、用户登陆 课程管理:课程信息的查询、添加、删除 我的选课…

嵌入式全栈开发学习笔记---C++(强制类型转换/异常和文件)

目录 强制类型转换 static_cast reinterpret_cast dynamic_cast const_cast const_cast笔试 异常处理 什么是异常处理机制? 异常的基本语法 异常处理基本思想 栈解旋 异常接口声明 throw抛出类对象 异常案例 标准异常库 C的文件操作 C输入输出流 …

Unity(2022.3.41LTS) - UI详细介绍- Panel(面板)和RectTransform组件

目录 零. 简介 一、功能与作用 二、属性与设置 三、使用方法 四、优化和注意事项 五.面板总结 六. RectTransform A、主要属性 B、布局控制 C、代码控制 D.实例 控制对象靠近底部 对象紧贴底部 零. 简介 在 Unity 中,Panel(面板&#xff0…

《ICT技术成熟度曲线(2024):API全生命周期管理》

来源:Gartner。 近期Gartner发布的《Hype Cycle for ICT in China, 2024》中,将全生命周期API管理收录其中。 •收益评级:高 •市场渗透率:目标受众的 5% 至 20% •成熟度:新兴阶段  &am…

ssm微信小程序的英语学习激励系统论文源码调试讲解

2 关键技术介绍 2.1 SSM框架 开发信息管理系统的主流框架是SSM(Spring Spring MVC MyBatis),SSM框架web层使用Spring MVC框架,使传输前后端数据变得简单;对于业务层使用Spring作为轻量级控制反转和面向切面的容器框…

基于B/S的城市公交线路管理及查询系统

2 系统需求分析 需求分析是对所要做的系统进行分析,通过使用文字和图表的综合形式,以相对来说容易让人理解的方式去描绘需求的数据、功能、行为,更可以直接评审其正确性、完整性和一致性[2]。通过查询相关的资料,对所做的系统进行…

黑种草:花语中的爱与思念

一、黑种草的神秘面纱 (一)产地 黑种草原产于欧洲南部,随着被引种栽培,现在在中国长江流域及华北、新疆、云南、西藏等地也有栽培。它性喜冷凉气候,忌高温高湿,对生长环境有一定要求。在适宜的环境中&…

好看的个人导航页面html源码

源码介绍 好看的个人导航页面html源码,适合做博客介绍页或者公司介绍页。喜欢的朋友可以下载使用,源码HTML源码,记事本简单修改文字即可,上传到服务器 效果预览 源码获取 好看的个人导航页面html源码

TypeError: ‘ChatCompletion‘ object is not subscriptable 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

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

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