1 全局变量stats
新建场景player_stats.tscn,挂载脚本stats.gd,作为全局变量,全局自动加载

//WARN,有更好的方法
2 no_health回调
获取PlayStats,一旦接收到no_health信号,回调queue_free
1 | var stats = PlayerStats |
3 玩家属性
- player节点引入hurtbox,给碰撞形状和碰撞层

- 实现player生命属性
1 | func _on_hurtbox_area_entered(area: Area2D) -> void: |
- 给蝙蝠hitbox,给碰撞形状,给层级
4 show_hit优化
show_hit有更好的方法优化,断开hurtbox的信号,把他抽取成函数
1 | func create_hit_effect(): |
5 实现玩家短暂无敌
目前能实现碰撞受伤,但有bug,不离开碰撞检测区域,比如在角落里,就不会再次受伤,解决方法,给hurtbox短暂的无敌时刻。
无敌时间的逻辑
1 | var invincible = false:set = set_invincible |
将它和持续时间联系起来
在hurtbox节点下,新建一个Timer节点,连接timeout信号
①
1 | func start_invincibility(duration): |
②时间到,调用信号,把无敌置为false
1 | func _on_timer_timeout() -> void: |
梳理下流程:
①调用start_invincibility,会设置invincible,开始计时器,
②timer计时器结束就会把无敌置为false
①②发生的同时,会设置invincible,那就会自动调用set_invincible方法,方法里面会发送对应的信号
这样能解决频繁进入玩家的hurtbox时,对玩家快速造成伤害,但是还有个bug,就是在区域里不能触发信号的问题
使用Monitoring和Monitorable为 true 时,该区域能够检测到进入和退出该区域的实体或区域,ing也就是对应启用检测mask,-able反之,搭配无敌检测,就解决了
1
使用2个信号,对mask
1 | #开始的时候,禁用mask检测,之后再开启 |
//WARN,这里不该使用信号,这样的写法不妥
给player开启无敌和击中
1 | func _on_hurtbox_area_entered(area: Area2D) -> void: |
也给bat
1 | hurtbox.create_hit_effect() |
//WARN直接设置collisionShape的disable呢?
复杂了,直接在hurtbox里改状态就行了,不用信号,export时间出去,以后再优化
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 芃狐!





