Godot Lesson 10: Heart UI¶
Summary¶
This adds player health to the HUD. It allows for as many rows and columns of hearts as desired and gives granularity of 1/4 heart.
Prerequisites¶
None - This is standalone
Video¶
Resources¶
Code¶
Repository: https://github.com/los-alamos-steam-lab/godot-tutorial/tree/10-heart-ui
HUD Code¶
Major Changes from the Video:
Created func new_heart() instead of setting everything in _ready(). This allows for easier MAX_HEALTH increase. Set the position in this code as well, instead of in _physics_process.
extends CanvasLayer
onready var player = get_node("../player")
# Number of hearts in a row
const HEART_ROW_SIZE = 8
# space between hearts (including heart width)
const HEART_OFFSET = 8
func _ready():
for i in player.MAXHEALTH:
new_heart()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
# find the heart that might not be full.
var last_heart = floor(player.health)
for heart in $hearts.get_children():
var index = heart.get_index()
# if this heart comes after the last heart, then it is empty
# if this hear is the last heart, find the fraction
# if this heart comes before the last heart, it is full
if index > last_heart:
heart.frame = 0
elif index == last_heart:
heart.frame = (player.health - last_heart) * 4
elif index < last_heart:
heart.frame = 4
# update the sprite frame to be the player keys
$keys.frame = player.keys
# I pulled this out into a separate function and combined positioning,
# that way you can call it when increasing maxhealth
func new_heart():
var newheart = Sprite.new()
newheart.texture = $hearts.texture
newheart.hframes = $hearts.hframes
$hearts.add_child(newheart)
var index = newheart.get_index()
var x = (index % HEART_ROW_SIZE) * HEART_OFFSET
# I explicitly state the floor hear to make the code more readable.
# Origingal code was relying on integer division
var y = floor(index / HEART_ROW_SIZE) * HEART_OFFSET
newheart.position = Vector2(x, y)