【Godot4自学手册】第十六节敌人的攻击和主人公的受伤

2024-02-25 22:28

本文主要是介绍【Godot4自学手册】第十六节敌人的攻击和主人公的受伤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

各位同学大家好,前面我们学习了敌人的攻击动画,但是没有真正意义上实现攻击功能。今天我们将要学习敌人的攻击和主任的受伤功能的实现,其实原理很简单我们以前都学过,主要是给敌人添加一个Area2D子节点,这个结点用于与主任公发生碰撞达到进攻记录的目的;给主人公添加一个Area2D子节点用于接收敌人的进攻。开始吧。

一、敌人的进攻

1.结点布置。

在Enemy场景中添加Area2D结点,命名为HitBox,在该节点下添加CollisionShape2D结点,该节点用于敌人攻击与主任公发生碰撞的位置,在检测其中将Shape选择矩形碰撞,属性Disabled启用,这样的目的是禁用改碰撞默认启用,后面只有在敌人进攻的时候启用。
请添加图片描述

2.适当调整碰撞位置。

单击AnimationP结点,在动画面板中,选择Attack动画,切换到第七帧,根据动画调整HitBox到合适位置,整个过程如下:
请添加图片描述

3.停用启用碰撞

切换到动画面板,然后选择Attack动画,将播放位置拖到第一帧,然后在Hitbox子节点CollisionShape2D的检查器中,属性Disabled启用后单击后面的关键帧,这样会在动画第一帧中添加一个启用Disable的关键帧。如下:
请添加图片描述

同理,在Attack动画的第七帧添加一个不启用Disable的关键帧,在最后一帧添加启用Disable的关键帧,最终动画设置如下:
请添加图片描述

这样,只用敌人进攻时,碰撞才起作用。

4.修改代码

在Enemy代码中,完善代码一是翻转攻击碰撞HitBox,攻击框随着敌人的翻转而翻转;二是添加敌人攻击力。
攻击框翻转代码如下:

@onready var hit_box = $HitBox #获取攻击框
#chase_state函数中,hit_box.scale.x =-1翻转碰撞框
func chase_state():anima.play("Run")var direction =  Globals.last_Player-global_positionif direction.x<0:animaS.flip_h=truehit_box.scale.x =-1else:animaS.flip_h = falsehit_box.scale.x=1global_position = global_position.move_toward(Globals.last_Player,SPEED)

敌人攻击力代码简单的写一行,以后会逐步完善,代码如下:

var hitCount=2

目前,整个敌人的代码如下:

extends CharacterBody2D
enum {IDLE,CHASE,ATTACK,HURT,DEATH
}
const SPEED = 1.0
var hitCount=2
@onready var anima = $AnimaP
@onready var animaS =$AnimaS
@onready var hit_box = $HitBoxvar state = IDLEfunc _physics_process(delta):match state:IDLE:idle_state()CHASE:chase_state()ATTACK:attack_state()HURT:hurt_state()DEATH:death_state()move_and_slide()func idle_state():anima.play("Idle")func chase_state():anima.play("Run")var direction =  Globals.last_Player-global_positionif direction.x<0:animaS.flip_h=truehit_box.scale.x =-1else:animaS.flip_h = falsehit_box.scale.x=1global_position = global_position.move_toward(Globals.last_Player,SPEED)func attack_state():		anima.play("Attack")	await  anima.animation_finishedstate = IDLEawait  get_tree().create_timer(1).timeoutstate = ATTACK
func hurt_state():pass
func death_state():passfunc _on_trace_area_body_entered(body):if body.name=="Player" :state = CHASEfunc _on_trace_area_body_exited(body):if body.name=="Player" :state = IDLEfunc _on_hit_area_body_entered(body):if body.name=="Player" :state = ATTACKfunc _on_hit_area_body_exited(body):if body.name=="Player" :state = CHASE

二、碰撞层的设置

单击菜单栏中的项目,然后选择项目设置,在项目设置对话框中选择层名称->2D物理层,在第5层中输入HitEnemy,这个层用于与敌人发生碰撞。
请添加图片描述

进入Enemy场景选择HitBox结点,在检查器中Collision属性中将Layer设置为HitEnemy,Mask不进行设置,这样HitBox会位于HitEnemy层,为下一步碰撞做好准备。如下:
请添加图片描述

三、设置主人公受伤

1.搭建子节点。

进入Player场景,在跟场景添加Area2D结点,命名为HurtBox。为HurtBox添加子节点CollisionShape2D,形状选择胶囊碰撞,在检查器中Collision属性中将Layer不进行设置,Mask设置为HitEnemy,这样表示该节点与HitEnemy发生碰撞,设置如下:
请添加图片描述

2.设置受伤动画

进入主人公场景,选择AnimatedSprite2D结点,在动画帧控制面板中,新建两个动画一个是Hurt_Left,一个是Hurt_Right,操作如下:
请添加图片描述

然后单击从精灵表中添加帧,然后选择Playerer素材,在弹出的选择帧对话框中,水平设置4,垂直设为2,前两张图片添加到Hurt_Left动画,后两张图片添加到Hurt_Right动画,如下:
请添加图片描述

切换到AnimationPlayer结点,在检查器中单击导入按钮,将AnimatedSprite2D导入到该节点下,操作如下:
请添加图片描述

在动画面板中将Hurt_Left动画时长设置0.2,并调整动画帧到0.2秒内,如下:
请添加图片描述

同理,Hurt_Right进行同样设置。
切换到AnimationTree结点,在动画树面板中选择创建新节点按钮,命名为Hurt,然后单击后面的小笔图标。如下所示:
请添加图片描述

在Hurt面板内选择创建点按钮,然后在最左侧单击按钮选择添加动画->Hurt_Left,在最右侧添加Hurt_Right;最后选择混合模式选择离散模式,而不是连续模式。操作如下:
请添加图片描述

3.添加信号编写代码

在Player场景中,给Player结点添加Area2D结点,命名为HurtBox。给HurtBox结点添加CollisionShape2D子节点,检查器中shape中选择椭圆形碰撞结点,根据主人公调整大小。如下:
请添加图片描述

选择HurtBox结点,切换到信号,双击area_entered信号在弹出信号连接对话框中选择Player,单击链接按钮,操作如下:
请添加图片描述

切换Enemy代码,编写代码如下:

func _on_hurt_box_area_entered(area):state=HURT	#切换到HURT状态enemyPositon = area.owner.global_position #敌人位置func hurt_state():	var dir = enemyPositon.direction_to(global_position).normalized()#判断攻击方向anima_tree.set("parameters/Hurt/blend_position",dir.x)anima_tree["parameters/playback"].travel("Hurt")#播放受伤动画if dir.x>0:velocity.x +=10else :velocity.x -=10#击退效果await anima_tree.animation_finishedstate=WALKvelocity = Vector2.ZERO#动画播放完成后,人物状态切换到WALK状态,速度降为0

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

这节就到这,还有许多问题需要完善,我们下节完善吧。同学们,下次再见!

这篇关于【Godot4自学手册】第十六节敌人的攻击和主人公的受伤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/746900

相关文章

速盾高防cdn是怎么解决网站攻击的?

速盾高防CDN是一种基于云计算技术的网络安全解决方案,可以有效地保护网站免受各种网络攻击的威胁。它通过在全球多个节点部署服务器,将网站内容缓存到这些服务器上,并通过智能路由技术将用户的请求引导到最近的服务器上,以提供更快的访问速度和更好的网络性能。 速盾高防CDN主要采用以下几种方式来解决网站攻击: 分布式拒绝服务攻击(DDoS)防护:DDoS攻击是一种常见的网络攻击手段,攻击者通过向目标网

linux dlopen手册翻译

名称 dlclose, dlopen, dlmopen 打开和关闭一个共享对象 简介 #include <dlfcn.h>void *dlopen(const char*filename, int flags);int dlclose(void *handle);#define _GNU_SOURCE#include <dlfcn.h>void *dlmoopen(Lmid_t lm

Web安全之XSS跨站脚本攻击:如何预防及解决

1. 什么是XSS注入 XSS(跨站脚本攻击,Cross-Site Scripting)是一种常见的Web安全漏洞,通过注入恶意代码(通常是JavaScript)到目标网站的网页中,以此在用户浏览网页时执行。攻击者可以通过XSS获取用户的敏感信息(如Cookie、会话令牌)或控制用户浏览器的行为,进而造成信息泄露、身份冒用等严重后果。 2. XSS攻击类型 2.1 存储型XSS 存储型XS

【前端安全】浅谈XSS攻击和防范

定义 XSS是跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。 恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 分类 大分类小分类原理非存储DOM型① 不需要经过服务器

Git命令文本手册

git init # 初始化本地git仓库(创建新仓库)git config --global user.name "xxx" # 配置用户名git config --global user.email "xxx@xxx.com"

新型 RAMBO 侧信道攻击通过 RAM 无线电波泄露数据

内盖夫本·古里安大学的研究人员发现了一种从隔离系统中泄露敏感数据的方法。 引入了一种称为 RAMBO(基于 RAM 的电磁隐蔽通道)的新型攻击技术。 该攻击利用计算机 RAM 产生的电磁辐射,使攻击者能够窃取加密密钥、密码、生物特征数据和文件等信息。 即使在系统与外部网络物理隔离的环境中,这种攻击也能实现。 信息泄露速度达 7.5 kB/分钟 该研究由 Morde

DDoS对策是什么?详细解说DDoS攻击难以防御的理由和对策方法

攻击规模逐年增加的DDoS攻击。据相关调查介绍,2023年最大的攻击甚至达到了700Gbps。 为了抑制DDoS攻击的危害,采取适当的对策是很重要的。 特别是在网站显示花费时间或频繁出现504错误的情况下,可能已经受到了DDoS攻击,需要尽早采取对策。 本文将介绍受到DDoS攻击时的事件、受害内容和作为DDoS对策有效的三种服务。 到底什么是DDoS攻击? 理解事件、手段和损害 D

SMIDI-SAP接口配置手册

目录 一、 SAPERP相关接口配置(必要条件) 1. SAP ERP 配置 1.1 配置

五一假期出行必备的高科技手册

今天小编看了眼朋友圈,发现无节操的同学真是太多了,你们出去玩就好了,为啥要发图呢……各种晒,简直要虐死上班狗啊。 不过掐指一算,小编期盼已久的五一马上就要来了。抱着拯救同样期待假期出行同胞们的想法,小编给大家准备了一份出行旅游必备的高科技手册,助大家防火防水防(yi)搭(yue)讪( pao),下面将会开启高(zhuang)冷(BI)模式,如有雷同,纯属故意。 攻略篇 攻略在手,说走就走。

合宙Air780E硬件设计手册02

上文文主要介绍了Air780E的硬件设计中的的应用接口部分。 上文链接:Air780E低功耗4G模组硬件设计手册01-CSDN博客 在本文我们会继续介绍Air780E的硬件设计介绍。  二、应用接口 2.10  SIM卡接口 Air780E支持2路SIM卡接口,支持ETSI和IMT-2000卡规范,支持1.8V和3.0VUSIM卡。 以满足双SIM 卡切换的需求。 2.10.1. S