1 新建蝙蝠小怪

新建一个CharatBody2D节点Bat(蝙蝠小怪),保存在ememies目录下

image-20240512182335775

2 制作蝙蝠待机动画

1 在它下方新建一个动画节点AnimatedSprite2D,用来制作蝙蝠小怪动画,步骤:

  • 添加素材图片Bat.png,有5张图片,所以Hframes设置成5
  • 调整offsety坐标为-12(在坐标原点上方,实现漂浮),然后在animation菜单下新建SpriteFrame
  • 动画命名为Fly,然后按下图添加动画素材

image-20240512184403715

  • 添加Bat.png做动画,横向5帧,竖向1帧,添加后设置动画为加载后自动播放

image-20240512184110981

2 新建一张图片,关联smallshadow.png,作为阴影

3 给碰撞形状

image-20240512233154078

play层级

image-20240604144142634

bat层级

image-20240604144223568

3 小怪受击检测

1 制作小怪碰撞体积

引入Hurtbox节点,组合之前的子节点,跳转连接,并改为可编辑,新增碰撞体积,碰撞框处于enemyhurtbox层

image-20240513014309757

2 物理层级

bat的hurtbox层级

image-20240604151600289

player的SwordHitbox层级

image-20240604152138073

3 更新玩家物理层

Mask新增朝向enemy层

4 蝙蝠击退效果

1 击退方向

击退方向定义在SwordHitbox节点中

swordhitbox.gd

1
2
3
extends Area2D

var knockback_vector = Vector2.ZERO

2 击退速度

定义在Bat节点中

bat.gd:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
extends CharacterBody2D

#初始化击退速度
var knockback = Vector2.ZERO

func _physics_process(delta):

#定义击退的速度向量
#不能连写,连写没有保留前一帧的 velocity 减速状态,就会停不下来!!
knockback = knockback.move_toward(Vector2.ZERO,200 * delta)
velocity = knockback
move_and_slide()

#受击检测,通过编辑器添加的进入信号!!直接这样写代码不会生效
func _on_hurtbox_area_entered(area):
#击退方向knockback_vector还没处理
#测试先随便用一个方向,比如右方向,替换掉knockback_vector
knockback = area.knockback_vector *120

#敌人消失不再简单处理,下节会好好处理
#func _on_hurtbox_area_entered(area: Area2D) -> void:
#queue_free()

使用编辑器添加进入信号

image-20240513014539379

3 同步敌人被击退方向

先获取定义了击退方向的节点SwordHitbox,再将玩家的朝向赋给它

1
2
@onready var sword_hitbox: Area2D = $HitboxPivot/SwordHitbox
sword_hitbox.knockback_vector=input_vector