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

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

一、新建ghost场景

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

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

extends Node2D
var playerN=1 #定义显示的主任公

func _ready():
	#创建间补动画将主人公透明0.5秒后变为0
	var 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 #闪现时间减1
		var 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 #设置速度为0
		dash_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_speed
	elif playerDirecion.x>0: #当主人公面向左侧,x轴度减去闪现速度
		velocity.x += dash_speed
	elif playerDirecion.y>0:#当主人公面向下方,y轴度加上闪现速度
		velocity.y += dash_speed
	elif  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=v
		match  state:
			IDLE:
				idle_state()
			WALK:
				walk_state()
			SWORD:
				sword_state()
			HURT:
				hurt_state()
			DASH:
				dash_state()
		
const SPEED = 120.0
var enemyPositon
var knockback=200


func _ready():
	Globals.last_Player = position
	

func _physics_process(delta):	
	direcion = Vector2.ZERO
	direcion.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 = WALK
			playerDirecion = direcion
		else:
			velocity=Vector2.ZERO
			state=IDLE
	if Input.is_action_just_pressed("sword"):
		velocity= Vector2.ZERO
		state = SWORD
	if state!=DASH and state!=HURT:
		if Input.is_action_just_pressed("dash"):
			state = DASH
	Globals.last_Player = position
	move_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=IDLE
	
func hurt_state():#受伤状态
	var dir = enemyPositon.direction_to(global_position).normalized()
	anima_tree["parameters/playback"].travel("Hurt")
	if dir.x>0:
		velocity.x +=knockback
	else:
		velocity.x -=knockback
	await anima_tree.animation_finished
	stats.health -=10	
	state=WALK
func dash_state():
	velocity = Vector2.ZERO
	$DashTime.start()
	if playerDirecion.x <0:
		velocity.x -= dash_speed
	elif playerDirecion.x>0:
		velocity.x += dash_speed
	elif playerDirecion.y>0:
		velocity.y += dash_speed
	elif  playerDirecion.y<0:
		velocity.y -= dash_speed	
	else:
		velocity.x -= dash_speed
	pass
	
func _on_hurt_box_area_entered(area):
	enemyPositon = area.owner.global_position
	state=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 -= 1
		var ghost = Ghost.instantiate()
		ghost.global_position = global_position
		if 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 = 0
		dash_time = 5
		$DashTime.stop()
		state=IDLE

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《vtk9 book》 官方web版 第3章 - 计算机图形基础 (3 / 6)

3.8 演员几何 我们已经看到了光照属性如何控制演员的外观&#xff0c;以及相机如何结合变换矩阵将演员投影到图像平面上。剩下的是定义演员的几何形状&#xff0c;以及如何将其定位在世界坐标系中。 建模 计算机图形学研究中的一个重要主题是建模或表示物体的几何形状。…

第五十四回 高太尉大兴三路兵 呼延灼摆布连环马-AI通过构建并训练CNN网络来进行飞机识别

呼延灼举荐了百胜将韩滔和天目将彭玘做先锋。 两军对战&#xff0c;韩滔和秦明斗二十回合&#xff0c;呼延灼与林冲斗在一起&#xff0c;花荣与彭玘斗在一处&#xff0c;后彭玘与一丈青扈三娘斗在一起&#xff0c;被扈三娘抓住。 尽管梁山占优&#xff0c;宋江也没有乘胜追击&…

❤ Vue3项目搭建系统篇(二)

❤ Vue3项目搭建系统篇&#xff08;二&#xff09; 1、安装和配置 Element Plus&#xff08;完整导入&#xff09; yarn add element-plus --savemain.ts中引入&#xff1a; // 引入组件 import ElementPlus from element-plus import element-plus/dist/index.css const ap…

B端系统升级,登录页必在升级之列,不容置疑。

进行B端界面升级时&#xff0c;首先升级登录页有以下几个原因&#xff1a; 用户体验&#xff1a;登录页是用户进入系统的第一个页面&#xff0c;用户首先接触到的界面。通过升级登录页&#xff0c;可以提升用户的第一印象&#xff0c;增强用户对系统的信任感和好感度&#xff…

基于Unity3D引擎RPG游戏设计与开发

目 录 摘 要 I Abstract II 引 言 1 1.相关技术 3 1.1 Unity基础界面 3 1.2 C#脚本编写 3 1.3 Unity脚本 3 1.4 Unity物理引擎 3 1.5 UGUI 3 1.6 Unity动画系统 4 1.7 本章小结 4 2. 系统分析 5 2.1游戏内容需求分析 5 2.2游戏流程需求分析 5 2.3游戏场景需求分析 5 2.4怪物系…

GPT-4-turbo还是大家心中第一!Claude 3竞技场人类投票成绩出炉:仅居第三

Claude 3的竞技场排名终于揭晓了&#xff1a; 在仅仅3天的时间里&#xff0c;20000张投票使得排名的流量达到了前所未有的高度。 最后&#xff0c;Claude 3的"大杯"模型Opus以1233的分数赢得了胜利&#xff0c;成为了第一个能和GPT-4-Turbo匹敌的选手。 "中杯…

基于范围的for循环(C++11)和auto

auto C11中&#xff0c;标准委员会赋予了auto全新的含义即&#xff1a; auto不再是一个存储类型指示符&#xff0c;而是作为一个新的类型 指示符来指示编译器&#xff0c;auto声明的变量必须由编译器在编译时期推导而得。 int a 10;auto b a;auto c a;auto d TestAuto(…

Vue:自动按需导入element-plus图标

自动导入使用 unplugin-icons 和 unplugin-auto-import 从 iconify 中自动导入任何图标集。 完整vite.config.js参考模板 https://download.csdn.net/download/ruancexiaoming/88928539 导入element-plus图标 命令行安装unplugin-icons pnpm i -D unplugin-icons//没有安装自…

银河麒麟V10 安装部署大数据管理软件 DataSophon

一、概览 1、愿景 致力于快速实现部署、管理、监控以及自动化运维大数据云原生平台&#xff0c;帮助您快速构建起稳定、高效、可弹性伸缩的大数据云原生平台。 2、DataSophon是什么 《三体》&#xff0c;这部获世界科幻文学最高奖项雨果奖的作品以惊艳的"硬科幻"…

Joe主题网站

一款博客网站源码 发现源码为大家内置了主题 清爽又强大真正的永久可用的一条源码&#xff0c;该版本为整合版本&#xff0c;内置了Joe主题&#xff0c;搭建后直接启用即可~ 安装环境要求&#xff1a; PHP 7.2 以上 MySQL, PostgreSQL, SQLite 任意一种数据库支持&#xff0c;…

一个爬虫自动化数据采集的故事~

目录 一、原文二、故事前半段背景内容三、正经的讲点DrissionPage知识四、故事的收尾 一、原文 原文来自一个爬虫自动化数据采集的故事~ , 建议点击链接看文章末尾的视频笔者不擅长自动化&#xff0c;一个小小故事分享给大家&#xff0c;仅个人观点 二、故事前半段背景内容 …

C#中对象的相等性与同一性的判断方法总结

C#对象的相等性与同一性 1. 概述与准备1.1 概述1.2 准备 2. Equals(Object)2.1 功能&#xff1a;2.2 实例&#xff1a;2.3 扩展&#xff1a;2.4 重写此方法 3. Equals(Object, Object)3.1 功能3.2 实例 4. ReferenceEquals(Object, Object)4.1 功能4.2 使用场景&#xff1a;4.3…

突破编程_前端_JS编程实例(自适应表格列宽)

1 开发目标 针对如下的表格组件&#xff1a; 根据表格的各个列字符串宽度动态调整表格列宽&#xff1a; 2 详细需求 本组件目标是提供一个自动调整 HTML 表格列宽的解决方案&#xff0c;通过 JS 实现动态计算并调整表格每列的宽度&#xff0c;以使得表格能够自适应容器宽度&a…

Matlab|配电网智能软开关(sop)规划模型

目录 1 主要内容 目标函数 2 部分程序 3 程序结果 3.1 sop选址定容优化模型 3.2 对比算例&#xff08;不含sop&#xff09; 4 下载链接 1 主要内容 该程序参考文献《基于改进灵敏度分析的有源配电网智能软开关优化配置》&#xff0c;采用二阶锥算法&#xff0c;以改进的…

vscode 格式化prettier失败出现一大堆错误

如题&#xff0c;使用vscode开发项目时候&#xff0c;会自动进行格式化【安装prettier插件】 但是有时候会出现格式化失败的情况&#xff0c;如果插件安装正确&#xff0c;则可能是代码出现了格式问题。

使用腾讯云快速搭建WordPress网站流程详解

专栏系列文章&#xff1a; WordPress建站主题美化系列教程https://blog.csdn.net/seeker1994/category_12184577.html 一文搞懂WordPress是什么&#xff1f;为什么用它建站&#xff1f;怎么安装与部署&#xff1f; 初次安装WordPress后如何进行网站设置&#xff08;主题安装、…

揭秘接口测试:完整流程指南!

在讲接口测试之前&#xff0c;首先需要给大家申明下&#xff1a;接口测试对于测试人员而言&#xff0c;非常非常重要&#xff0c;懂功能测试接口测试&#xff0c;就能在企业中拿到一份非常不错的薪资。 这么重要的接口测试&#xff0c;一般也是面试笔试必问。为方便大家更好的…

Python快速入门系列-2(Python基础语法)

第三章&#xff1a;Python基础语法 3.1 变量与数据类型3.1.1 变量的定义与赋值3.1.2 数据类型3.1.3 类型转换 3.2 注释与缩进3.2.1 注释3.2.2 缩进 3.3 条件语句与循环结构3.3.1 条件语句3.3.2 循环结构 3.4 函数与模块3.4.1 函数3.4.2 参数和返回值3.4.3 模块3.4.4 标准库中的…

基于SSH的点餐服务管理系统的设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 开发工具相关技术 3 1.1 SSH框架 3 1.1.1 Spring 3 1.1.2 Spring MVC 3 1.1.3 Hibernate 4 1.2 前端技术 4 1.2.1 jQuery 5 1.2.2 Bootstrap 5 1.3 数据库技术 5 1.4 本章小结 6 2 系统分析 7 2.1 需求分析 7 2.2 系统工作流程 8 2.3 用例…

一学就会 | ChatGPT提示词极简指南-有爱AI实战教程(三)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 导读&#xff1a;在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#xff0c;如…