【Godot4自学手册】第二十二节完成主人公的闪现功能

这一节我们主要自学主人公的闪现功能,当按下鼠标右键,我们的主人公根据不同的方向进行瞬间移动,并在身后留下一串残影,具体效果如下:
请添加图片描述

一、新建ghost场景

新建Node2D场景,命名为Ghost,存储到Scenes目录下。然后在根节点下添加4个Sprite2D精灵结点,用来展示主人公四个方向的图片,并在检查器中将Visibility->Visble关闭 。
请添加图片描述

然后为根节点添加脚本,存到Scriptes目录下命名为ghost,编写如下代码:

extends Node2D
var playerN=1 #定义显示的主任公func _ready():#创建间补动画将主人公透明0.5秒后变为0var tween = create_tween()tween.tween_property(self,"modulate:a",0,0.5)tween.tween_callback(queue_free) func setShow(playernumber):#设置第几个Sprite2D显示get_node("Player"+str(playernumber)).visible=true

二、在Player场景编写代码

首先切换到Player场景,给根节点添加Timer结点,并命名为DashTime,在其检查器中将Timer->Wait Time设置为0.05,表示每0.05秒执行一次Timeout函数。然后切换到结点信号双击timeout信号,弹出对话框选择Player结点,然后单击连接按钮。
请添加图片描述

这样会在Player代码中添加func _on_dash_time_timeout()函数,然后编写代码如下:

func _on_dash_time_timeout():if dash_time > 0: #当闪现时间大于0时dash_time -= 1 #闪现时间减1var ghost = Ghost.instantiate() #实例化Ghost场景ghost.global_position = global_position #设置ghost节点位置为当前主人公位置if playerDirecion.x==1: #主人公面向右侧,对应设置ghost内Sprite2D图片向右ghost.setShow(1)elif  playerDirecion.x==-1:#主人公面向左侧,对应设置ghost内Sprite2D图片向做ghost.setShow(2)elif  playerDirecion.y==-1:#主人公面向下方,对应设置ghost内Sprite2D图片向下ghost.setShow(4)elif  playerDirecion.y==1:#主人公面向上方,对应设置ghost内Sprite2D图片向上ghost.setShow(3)else:ghost.setShow(1)			Globals.duplicate_node.add_child(ghost)#将实例化的ghost结点添加到主场景中显示else: #当闪现时间结束时velocity.x = 0 #设置速度为0dash_time = 5 #闪现时间重新计时$DashTime.stop() #DashTime停止state=IDLE #主人公切换到等待状态

在该函数调用前需要定义一些变量如下:

#预先加载ghost场景
var Ghost = preload("res://Scenes/ghost.tscn")
#定义闪现速度
var dash_speed = 300
#闪现时间为5
var dash_time=5

在_physics_process函数添加如下代码:

if state!=DASH and state!=HURT:if Input.is_action_just_pressed("dash"):state = DASH

编写函数dash_state函数

func dash_state():velocity = Vector2.ZERO #将速度设为0$DashTime.start() #启动计时器if playerDirecion.x <0: #当主人公面向右,x轴速度减去闪现速度velocity.x -= dash_speedelif playerDirecion.x>0: #当主人公面向左侧,x轴度减去闪现速度velocity.x += dash_speedelif playerDirecion.y>0:#当主人公面向下方,y轴度加上闪现速度velocity.y += dash_speedelif  playerDirecion.y<0:#当主人公面向上方,y轴度减去闪现速度velocity.y -= dash_speed	else:velocity.x -= dash_speed #默认pass

经过上面的步骤就完成了闪现残影效果,整改Player代码如下:

extends CharacterBody2D
@onready var anima_tree=$AnimationTree
@onready var animation_player = $AnimationPlayer
@onready var stats = $Stats
var playerDirecion = Vector2(-1,0)
var direcion = Vector2.ZERO
var Ghost = preload("res://Scenes/ghost.tscn")
enum {IDLE,WALK,SWORD,HURT,DASH}
var dash_speed = 300
var dash_time=5
var state = IDLE:set(v):state=vmatch  state:IDLE:idle_state()WALK:walk_state()SWORD:sword_state()HURT:hurt_state()DASH:dash_state()const SPEED = 120.0
var enemyPositon
var knockback=200func _ready():Globals.last_Player = positionfunc _physics_process(delta):	direcion = Vector2.ZEROdirecion.x = Input.get_axis("left", "right")direcion.y = Input.get_axis("up", "down")if state!=SWORD and state!=HURT and state !=DASH:if direcion:anima_tree.set("parameters/Idle/blend_position",direcion)anima_tree.set("parameters/Walk/blend_position",direcion)anima_tree.set("parameters/Sword/blend_position",direcion)anima_tree.set("parameters/Hurt/blend_position",Vector2(direcion.x*-1,direcion.y))state = WALKplayerDirecion = direcionelse:velocity=Vector2.ZEROstate=IDLEif Input.is_action_just_pressed("sword"):velocity= Vector2.ZEROstate = SWORDif state!=DASH and state!=HURT:if Input.is_action_just_pressed("dash"):state = DASHGlobals.last_Player = positionmove_and_slide()	func idle_state():#待机状态anima_tree["parameters/playback"].travel("Idle")
func walk_state():#行走状态anima_tree["parameters/playback"].travel("Walk")velocity = direcion * SPEED	func sword_state():#进攻状态anima_tree["parameters/playback"].travel("Sword")await anima_tree.animation_finished	state=IDLEfunc hurt_state():#受伤状态var dir = enemyPositon.direction_to(global_position).normalized()anima_tree["parameters/playback"].travel("Hurt")if dir.x>0:velocity.x +=knockbackelse:velocity.x -=knockbackawait anima_tree.animation_finishedstats.health -=10	state=WALK
func dash_state():velocity = Vector2.ZERO$DashTime.start()if playerDirecion.x <0:velocity.x -= dash_speedelif playerDirecion.x>0:velocity.x += dash_speedelif playerDirecion.y>0:velocity.y += dash_speedelif  playerDirecion.y<0:velocity.y -= dash_speed	else:velocity.x -= dash_speedpassfunc _on_hurt_box_area_entered(area):enemyPositon = area.owner.global_positionstate=HURT	func hit_effect():$Camera2D._hit(Vector2(1.99,1.99),Vector2(7,-9))$Camera2D.frameFreeze(0.1,0.09)func _on_dash_time_timeout():if dash_time > 0:dash_time -= 1var ghost = Ghost.instantiate()ghost.global_position = global_positionif playerDirecion.x==1:ghost.setShow(1)elif  playerDirecion.x==-1:ghost.setShow(2)elif  playerDirecion.y==-1:ghost.setShow(4)elif  playerDirecion.y==1:ghost.setShow(3)else:ghost.setShow(1)			Globals.duplicate_node.add_child(ghost)else:velocity.x = 0dash_time = 5$DashTime.stop()state=IDLE

同学们这节就到这了,下节见。

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

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

相关文章

KEIL调试模式

step1&#xff1a; step2&#xff1a; step:3推荐使用硬件的在线仿真模式 step4:启动调试模式之前需要将硬件连接STM32然后编译项目确保工程项目是没有问题的 编译结果没有问题 step5:点击keil中的放大镜图标进入调试模式 进入调试模式后界面展示 外设资源查看功能

Linux网络套接字之UDP网络程序

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 实现一个简单的对话发消息的功能&#xff01; 目录…

Stable diffusion(一)

Stable diffusion 原理解读 名词解释 正向扩散&#xff08;Fixed Forward Diffusion Process&#xff09;&#xff1a;反向扩散&#xff08;Generative Reverse Denoising Process&#xff09; VAE&#xff08;Variational AutoEncoder&#xff09;&#xff1a;一个用于压缩图…

快速上手:使用Hexo搭建并自定义个人博客

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

再探再报 除 0 这件事有不同

首先&#xff0c;在数学中&#xff0c;一个数除以0是没有意义的。 其次&#xff0c;在计算机中&#xff0c;对于除零&#xff0c;传统概念里是会上报一个异常。首先是CPU内部实现会报异常。最早学组成原理和汇编的时候&#xff0c;都是说CPU寄存器中有个表示除零异常的位。在L…

上位机图像处理和嵌入式模块部署(qmacvisual二维码识别)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果说条形码在商品上使用比较多的话&#xff0c;那么二维码识别是一个更加使用频繁的场合。为什么使用这样频繁&#xff0c;我想很多一部分原因来…

渗透测试——信息收集

信息收集 前言 信息收集是在做渗透时找尽可能的多的信息&#xff0c;为之后的渗透做铺垫。信息收集的方法有很多 比如&#xff0c;页面、真实的IP、域名/子域名、敏感目录/文件、端口探测、CMS指纹识别、操作系统识别 1. 页面信息收集 拿到域名后&#xff0c;从网站的url中…

Bee Mobile组件库重磅升级

Bee Mobile组件库重磅升级&#xff01; 丰富强大的组件移动预览快速上手create-bee-mobile Bee Mobile组件库重磅升级&#xff01; Bee Mobile组件库最新 v1.0.0 版本&#xff0c;支持最新的 React v18。 主页&#xff1a;Bee Mobile 丰富强大的组件 一共拥有50多个组件&…

基于javaweb+springboot开发的城市地名地址信息管理系统设计和实现

基于javaweb(springboot)城市地名地址信息管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

一切都在变好

&#xff08;1&#xff09;规模复杂性Hold不住了 我已经说过多次&#xff0c;有几个&#xff1a; 1、5400多只股票&#xff0c;还会再持续增加 2、2.2亿账户&#xff0c;每年还以1600万在增加 3、60-90万亿市值 4、每天6000亿-万亿交易额&#xff0c;看趋势还在增加 也就是说&a…

时间序列-AR MA ARIMA

一、AR模型(自回归) AR探索趋势和周期性 预测依赖于过去的观测值和模型中的参数。模型的阶数 p pp 决定了需要考虑多少个过去时间点的观测值。 求AR模型的阶数 p和参数 ϕ i \phi_i ϕi​ &#xff0c;常常会使用统计方法如最小二乘法、信息准则&#xff08;如AIC、BIC&#xf…

开源的Java图片处理库介绍

在 Java 生态系统中&#xff0c;有几个流行的开源库可以用于图片处理。这些库提供了丰富的功能&#xff0c;如图像缩放、裁剪、颜色调整、格式转换等。以下是几个常用的 Java 图片处理库的介绍&#xff0c;包括它们的核心类、主要作用和应用场景&#xff0c;以及一些简单的例子…