2020-04-27 16:11:54 +03:00
---
title: HUD
layout: default
root: ../..
idx: 4.6
2020-07-11 11:30:46 +03:00
description: come creare elementi a schermo
redirect_from: /it/chapters/hud.html
2020-04-27 16:11:54 +03:00
---
2020-07-11 11:30:46 +03:00
## Introduzione <!-- omit in toc -->
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Le HUD (Heads Up Display) ti permettono di mostrare testi, immagini e altri elementi grafici senza interrompere il giocatore.
Le HUD, infatti, non accettano input dall'utente, lasciando quel ruolo ai [formspec ](formspecs.html ).
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
- [Posizionamento ](#posizionamento )
2023-05-01 14:22:02 +03:00
- [Posizione e scostamento ](#posizione-e-scostamento )
- [Allineamento ](#allineamento )
- [Esempio: tabellone segnapunti ](#esempio-tabellone-segnapunti )
2020-07-11 11:30:46 +03:00
- [Elementi di testo ](#elementi-di-testo )
2023-05-01 14:22:02 +03:00
- [Parametri ](#parametri )
- [Tornando all'esempio ](#tornando-allesempio )
2020-07-11 11:30:46 +03:00
- [Elementi immagine ](#elementi-immagine )
2023-05-01 14:22:02 +03:00
- [Parametri ](#parametri-1 )
- [Tornando all'esempio ](#tornando-allesempio-1 )
2020-07-11 11:30:46 +03:00
- [Cambiare un elemento ](#cambiare-un-elemento )
- [Salvare gli ID ](#salvare-gli-id )
- [Altri elementi ](#altri-elementi )
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
## Posizionamento
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
### Posizione e scostamento
2020-04-27 16:11:54 +03:00
< figure class = "right_image" >
< img
width="300"
src="{{ page.root }}//static/hud_diagram_center.svg"
2020-07-11 11:30:46 +03:00
alt="Diagramma che mostra un elemento di testo centrato">
2020-04-27 16:11:54 +03:00
< / figure >
2020-07-11 11:30:46 +03:00
Essendoci schermi di tutte le dimensioni e risoluzioni, per funzionare bene le HUD devono sapersi adattare a ognuno di essi.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Per ovviare al problema, Minetest specifica il collocamento di un elemento usando sia una posizione in percentuale che uno scostamento (*offset*).
La posizione percentuale è relativa alla grandezza dello schermo, dacché per posizionarne un elemento al centro, bisogna fornire un valore di 0.5 (cioè il 50%).
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Lo scostamento è poi usato per - appunto - scostare un elemento in relazione alla sua posizione.
2020-04-27 16:11:54 +03:00
< div style = "clear:both;" > < / div >
2020-07-11 11:30:46 +03:00
### Allineamento
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
L'allineamento (*alignment*) è dove il risultato della posizione e dello scostamento viene applicato sull'elemento - per esempio, `{x = -1.0, y = 0.0}` allineerà i valori degli altri due parametri sulla sinistra dell'elemento.
Questo è particolarmente utile quando si vuole allineare del testo a sinistra, a destra o al centro.
2020-04-27 16:11:54 +03:00
< figure >
< img
width="500"
src="{{ page.root }}//static/hud_diagram_alignment.svg"
2020-07-11 11:30:46 +03:00
alt="Diagramma che mostra i vari tipi di allineamento">
2020-04-27 16:11:54 +03:00
< / figure >
2020-07-11 11:30:46 +03:00
Il diagramma qui in alto mostra mostra tre finestre (in blu), ognuna contenente un elemento HUD (in giallo) con ogni volta un allineamento diverso.
La freccia è il risultato del calcolo di posizione e scostamento.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
### Esempio: tabellone segnapunti
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Per capire meglio il capitolo, vedremo come posizionare e aggiornare un pannello contenente dei punti come questo:
2020-04-27 16:11:54 +03:00
< figure >
< img
src="{{ page.root }}//static/hud_final.png"
2020-07-11 11:30:46 +03:00
alt="Screenshot dell'HUD da realizzare">
2020-04-27 16:11:54 +03:00
< / figure >
2020-07-11 11:30:46 +03:00
Nello screenshot sovrastante, tutti gli elementi hanno la stessa posizione percentuale (100%, 50%) - ma scostamenti diversi.
Questo permette all'intero pannello di essere ancorato sulla destra della finestra, senza posizioni/scostamenti strani al ridimensionarla.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
## Elementi di testo
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Puoi creare un elemento HUD una volta ottenuto il riferimento al giocatore al quale assegnarla:
2020-04-27 16:11:54 +03:00
```lua
2020-07-11 11:30:46 +03:00
local giocatore = minetest.get_player_by_name("tizio")
local idx = giocatore:hud_add({
2020-04-27 16:11:54 +03:00
hud_elem_type = "text",
position = {x = 0.5, y = 0.5},
offset = {x = 0, y = 0},
2020-07-11 11:30:46 +03:00
text = "Ciao mondo!",
alignment = {x = 0, y = 0}, -- allineamento centrato
scale = {x = 100, y = 100}, -- lo vedremo tra poco
2020-04-27 16:11:54 +03:00
})
```
2020-07-11 11:30:46 +03:00
La funzione `hud_add` ritorna l'ID di un elemento, che è utile per modificarlo o rimuoverlo.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
### Parametri
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Il tipo dell'elemento è ottenuto usando la proprietà `hud_elem_type` nella tabella di definizione.
Cambiando il tipo, cambia il significato di alcune delle proprietà che seguono.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
`scale` sono i limiti del testo; se esce da questo spazio, viene tagliato - nell'esempio `{x=100, y=100}` .
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
`number` è il colore del testo, ed è in [formato esadecimale ](http://www.colorpicker.com/ ) - nell'esempio `0xFF0000` .
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
### Tornando all'esempio
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Andiamo avanti e piazziamo tutto il testo nel nostro pannello (si son tenute le stringhe in inglese per non confondere con l'immagine, NdT):
2020-04-27 16:11:54 +03:00
```lua
2020-07-11 11:30:46 +03:00
-- Ottiene il numero di blocchi scavati e piazzati dallo spazio d'archiviazione; se non esiste è 0
local meta = giocatore:get_meta()
local digs_testo = "Digs: " .. meta:get_int("punteggio:digs")
local places_testo = "Places: " .. meta:get_int("punteggio:places")
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
giocatore:hud_add({
2020-04-27 16:11:54 +03:00
hud_elem_type = "text",
position = {x = 1, y = 0.5},
offset = {x = -120, y = -25},
text = "Stats",
alignment = 0,
scale = { x = 100, y = 30},
number = 0xFFFFFF,
})
2020-07-11 11:30:46 +03:00
giocatore:hud_add({
2020-04-27 16:11:54 +03:00
hud_elem_type = "text",
position = {x = 1, y = 0.5},
offset = {x = -180, y = 0},
2020-07-11 11:30:46 +03:00
text = digs_testo,
2020-04-27 16:11:54 +03:00
alignment = -1,
scale = { x = 50, y = 10},
number = 0xFFFFFF,
})
2020-07-11 11:30:46 +03:00
giocatore:hud_add({
2020-04-27 16:11:54 +03:00
hud_elem_type = "text",
position = {x = 1, y = 0.5},
offset = {x = -70, y = 0},
2020-07-11 11:30:46 +03:00
text = places_testo,
2020-04-27 16:11:54 +03:00
alignment = -1,
scale = { x = 50, y = 10},
number = 0xFFFFFF,
})
```
2020-07-11 11:30:46 +03:00
Il risultato è il seguente:
2020-04-27 16:11:54 +03:00
< figure >
< img
src="{{ page.root }}//static/hud_text.png"
2020-07-11 11:30:46 +03:00
alt="Screenshot della HUD finora">
2020-04-27 16:11:54 +03:00
< / figure >
2020-07-11 11:30:46 +03:00
## Elementi immagine
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Le immagini sono create in un modo molto simile a quelli del testo:
2020-04-27 16:11:54 +03:00
```lua
player:hud_add({
hud_elem_type = "image",
position = {x = 1, y = 0.5},
offset = {x = -220, y = 0},
2020-07-11 11:30:46 +03:00
text = "punteggio_sfondo.png",
2020-04-27 16:11:54 +03:00
scale = { x = 1, y = 1},
alignment = { x = 1, y = 0 },
})
```
2020-07-11 11:30:46 +03:00
Siamo ora a questo punto:
2020-04-27 16:11:54 +03:00
< figure >
< img
src="{{ page.root }}//static/hud_background_img.png"
2020-07-11 11:30:46 +03:00
alt="Screenshot della HUD finora">
2020-04-27 16:11:54 +03:00
< / figure >
2020-07-11 11:30:46 +03:00
### Parametri
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Il campo `text` in questo caso viene usato per fornire il nome dell'immagine.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Se una coordinata in `scale` è positiva, allora è un fattore scalare dove 1 è la grandezza originale, 2 è il doppio e così via.
Tuttavia, se una coordinata è negativa, sarà la percentuale della grandezza dello schermo.
Per esempio, `x=-100` equivale al 100% della larghezza di quest'ultimo.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
### Tornando all'esempio
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Creiamo la barra di progresso per il nostro tabellone usando `scale` :
2020-04-27 16:11:54 +03:00
```lua
2020-07-11 11:30:46 +03:00
local percentuale = tonumber(meta:get("punteggio:score") or 0.2)
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
giocatore:hud_add({
2020-04-27 16:11:54 +03:00
hud_elem_type = "image",
position = {x = 1, y = 0.5},
offset = {x = -215, y = 23},
2020-07-11 11:30:46 +03:00
text = "barra_punteggio_vuota.png",
2020-04-27 16:11:54 +03:00
scale = { x = 1, y = 1},
alignment = { x = 1, y = 0 },
})
2020-07-11 11:30:46 +03:00
giocatore:hud_add({
2020-04-27 16:11:54 +03:00
hud_elem_type = "image",
position = {x = 1, y = 0.5},
offset = {x = -215, y = 23},
2020-07-11 11:30:46 +03:00
text = "barra_punteggio_piena.png",
scale = { x = percentuale, y = 1},
2020-04-27 16:11:54 +03:00
alignment = { x = 1, y = 0 },
})
```
2020-07-11 11:30:46 +03:00
Abbiamo ora una HUD uguale identica a quella della prima immagine!
C'è un problema, tuttavia: non si aggiornerà al cambiare delle statistiche.
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
## Cambiare un elemento
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Per cambiare un elemento si usa l'ID ritornato dal metodo `hud_add` .
2020-04-27 16:11:54 +03:00
```lua
2020-07-11 11:30:46 +03:00
local idx = giocatore:hud_add({
2020-04-27 16:11:54 +03:00
hud_elem_type = "text",
2020-07-11 11:30:46 +03:00
text = "Ciao mondo!",
-- parametri rimossi per brevità
2020-04-27 16:11:54 +03:00
})
2020-07-11 11:30:46 +03:00
giocatore:hud_change(idx, "text", "Nuovo testo")
giocatore:hud_remove(idx)
2020-04-27 16:11:54 +03:00
```
2020-07-11 11:30:46 +03:00
Il metodo `hud_change` prende l'ID dell'elemento, la proprietà da cambiare e il nuovo valore.
La chiamata qui sopra cambia la proprietà `text` da "Ciao mondo!" a "Nuovo test".
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
Questo significa che fare `hud_change` subito dopo `hud_add` è funzionalmente equivalente a
fare ciò che segue, in maniera alquanto inefficiente:
2020-04-27 16:11:54 +03:00
```lua
2020-07-11 11:30:46 +03:00
local idx = giocatore:hud_add({
2020-04-27 16:11:54 +03:00
hud_elem_type = "text",
2020-07-11 11:30:46 +03:00
text = "Nuovo testo",
2020-04-27 16:11:54 +03:00
})
```
2020-07-11 11:30:46 +03:00
## Salvare gli ID
2020-04-27 16:11:54 +03:00
```lua
2020-07-11 11:30:46 +03:00
local hud_salvate = {}
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
function punteggio.aggiorna_hud(giocatore)
local nome_giocatore = giocatore:get_player_name()
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
-- Ottiene il numero di blocchi scavati e piazzati dallo spazio d'archiviazione; se non esiste è 0
local meta = giocatore:get_meta()
local digs_testo = "Digs: " .. meta:get_int("punteggio:digs")
local places_testo = "Places: " .. meta:get_int("punteggio:places")
local percentuale = tonumber(meta:get("punteggio:score") or 0.2)
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
local ids = hud_salvate[nome_giocatore]
2020-04-27 16:11:54 +03:00
if ids then
2020-07-11 11:30:46 +03:00
giocatore:hud_change(ids["places"], "text", places_testo)
giocatore:hud_change(ids["digs"], "text", digs_testo)
giocatore:hud_change(ids["bar_foreground"],
"scale", { x = percentuale, y = 1 })
2020-04-27 16:11:54 +03:00
else
ids = {}
2020-07-11 11:30:46 +03:00
hud_salvate[player_name] = ids
2020-04-27 16:11:54 +03:00
2020-07-11 11:30:46 +03:00
-- crea gli elementi HUD e imposta gli ID in `ids`
2020-04-27 16:11:54 +03:00
end
end
2020-07-11 11:30:46 +03:00
minetest.register_on_joinplayer(punteggio.aggiorna_hud)
2020-04-27 16:11:54 +03:00
minetest.register_on_leaveplayer(function(player)
2020-07-11 11:30:46 +03:00
hud_salvate[player:get_player_name()] = nil
2020-04-27 16:11:54 +03:00
end)
```
2020-07-11 11:30:46 +03:00
## Altri elementi
2020-04-27 16:11:54 +03:00
2023-05-01 14:22:02 +03:00
Dai un occhio a [lua_api.md ](https://minetest.gitlab.io/minetest/hud/ ) per una lista completa degli elementi HUD.