1 尝试基础label节点

新建labelUI

image-20240607143410112

2 监听玩家health

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
extends Node2D

@export var max_health:int = 1
@onready var health = max_health:set=set_health

signal no_health
signal health_changed(value)

#health被设置时,set函数会被自动调用
func set_health(value):
health = value
emit_signal("health_changed",health)
if health <= 0:
emit_signal("no_health")

3 方法1——数字型生命条

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

var hearts = 4:set = set_hearts
var max_hearts = 4:set = set_max_hearts

@onready var label = $Label

#检查hearts
func set_hearts(value):
hearts = clamp(value,0,max_hearts)
if label != null:
label.text = "HP = " +str(hearts)

func set_max_hearts(value):
max_hearts = max(value,1)

func _ready() -> void:
self.max_hearts = PlayerStats.max_health
self.hearts = PlayerStats.health
PlayerStats.connect("health_changed",Callable(self,"set_hearts"))

4 方法2——图片形生命条

新建2个TextureRect,通过调整两个UI元素的size,实现控制心心个数

image-20240607153736528

stats.gd更新

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

@export var max_health:int = 1:set =set_max_health
var health = max_health:set=set_health

signal no_health
signal health_changed(value)
signal max_health_changed(value)

func set_max_health(value):
max_health = value
self.health = min(health,max_health)
emit_signal("max_health_changed",max_health)

#health被设置时,set函数会被自动调用
func set_health(value):
health = value
emit_signal("health_changed",health)
if health <= 0:
emit_signal("no_health")
func _ready() -> void:
self.health = max_health

health_ui.gd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
extends Control

var hearts = 4:set = set_hearts
var max_hearts = 4:set = set_max_hearts

@onready var hert_ui_empty: TextureRect = $HertUIEmpty
@onready var hert_ui_full: TextureRect = $HertUIFull


#@onready var label = $Label

#检查hearts
func set_hearts(value):
hearts = clamp(value,0,max_hearts)
if hert_ui_full != null:
#15根据材质大小来的
hert_ui_full.size.x = hearts * 15
#if label != null:
#label.text = "HP = " +str(hearts)

func set_max_hearts(value):
max_hearts = max(value,1)
self.hearts = min(hearts,max_hearts)
if hert_ui_empty != null:
hert_ui_empty.size.x = max_hearts * 15

func _ready() -> void:
self.max_hearts = PlayerStats.max_health
self.hearts = PlayerStats.health
PlayerStats.connect("health_changed",Callable(self,"set_hearts"))
PlayerStats.connect("max_health_changed",Callable(self,"set_max_hearts"))

5 再添加一些环境资源