minetest_modding_book/_de/players/hud.md

294 lines
8.8 KiB
Markdown
Raw Normal View History

2022-09-29 22:41:23 +03:00
---
title: HUD
layout: default
root: ../..
idx: 4.6
description: Lernen Sie, wie man HUD-Elemente anzeigt
redirect_from: /de/chapters/hud.html
---
2022-10-27 12:02:49 +03:00
## Einleitung <!-- omit in toc -->
2022-09-29 22:41:23 +03:00
2022-11-30 20:14:26 +03:00
Heads Up Display (HUD) Elemente ermöglichen es Ihnen, Texte, Bilder und andere grafische Elemente anzuzeigen.
2022-09-29 22:41:23 +03:00
Das HUD akzeptiert keine Benutzereingaben; dafür sollten Sie eine [formspec](formspecs.html) verwenden.
- [Positionierung](#positionierung)
- [Position und Versatz](#position-und-versatz)
2022-10-27 12:02:49 +03:00
- [Ausrichtung](#ausrichtung)
2022-11-04 21:02:23 +03:00
- [Anzeigetafel](#anzeigetafel)
2022-10-27 12:02:49 +03:00
- [Textelemente](#textelemente)
2022-11-04 21:02:23 +03:00
- [Parameter](#parameter)
2022-10-27 12:02:49 +03:00
- [Unser Beispiel](#unser-beispiel)
2022-11-04 21:02:23 +03:00
- [Bild-Elemente](#bild-Elemente)
2022-10-27 12:02:49 +03:00
- [Parameter](#parameter-1)
2022-09-29 22:41:23 +03:00
- [Scale](#scale)
2022-11-04 21:02:23 +03:00
- [Ein Element verändern](#ein-element-verändern)
- [IDs speichern](#ids-speichern)
- [Andere Elemente](#andere-elemente)
2022-09-29 22:41:23 +03:00
## Positionierung
### Position und Versatz
<figure class="right_image">
<img
width="300"
src="{{ page.root }}//static/hud_diagram_center.svg"
alt="Diagramm mit einem zentrierten Textelement">
</figure>
2022-11-30 20:14:26 +03:00
Bildschirme gibt es in verschiedenen Größen und Auflösungen. Ein HUD muss auf allen
Bildschirmtypen gut funktionieren.
2022-09-29 22:41:23 +03:00
Die Lösung von Minetest besteht darin, die Position eines Elements sowohl durch
2022-11-30 20:14:26 +03:00
einer prozentualen Position und einem Versatz festzulegen.
2022-09-29 22:41:23 +03:00
Die prozentuale Position bezieht sich auf die Bildschirmgröße, d. h. um ein Element
in der Mitte des Bildschirms zu platzieren, müssen Sie eine prozentuale Position von der Hälfte
des Bildschirms, z. B. (50%, 50%), und einen Versatz von (0, 0) angeben.
Der Versatz wird dann verwendet, um ein Element relativ zur Prozentposition zu verschieben.
<div style="clear:both;"></div>
2022-10-27 12:02:49 +03:00
### Ausrichtung
2022-09-29 22:41:23 +03:00
Die Ausrichtung gibt an, wo das Ergebnis von Position und Versatz auf dem Element liegt -
2022-11-30 20:14:26 +03:00
zum Beispiel `{x = -1.0, y = 0.0}` lässt das Ergebnis von Position und Versatz
2022-10-27 12:02:49 +03:00
auf die linke Seite der Elementbegrenzung liegen. Dies ist besonders nützlich, wenn Sie
ein Textelement links-, mittel- oder rechtsbündig ausrichten wollen.
2022-09-29 22:41:23 +03:00
<figure>
<img
width="500"
src="{{ page.root }}//static/hud_diagram_alignment.svg"
alt="Diagramm zur Ausrichtung">
</figure>
Das obige Diagramm zeigt 3 Fenster (blau), jedes mit einem einzelnen HUD-Element (gelb)
und jeweils einer anderen Ausrichtung. Der Pfeil ist das Ergebnis der Berechnung von Position
und Versatzberechnung.
2022-10-27 12:02:49 +03:00
### Anzeigetafel
2022-09-29 22:41:23 +03:00
2022-10-27 12:02:49 +03:00
In diesem Kapitel werden Sie lernen, wie Sie eine Anzeigetafel
positionieren und aktualisieren können:
2022-09-29 22:41:23 +03:00
<figure>
<img
src="{{ page.root }}//static/hud_final.png"
2022-10-27 12:02:49 +03:00
alt="Screenshot vom uns angestrebten HUD">
2022-09-29 22:41:23 +03:00
</figure>
2022-10-27 12:02:49 +03:00
Im obigen Screenshot haben alle Elemente die gleiche prozentuale Position
2022-11-30 20:14:26 +03:00
(100%, 50%) - aber unterschiedliche Versätze. Dadurch wird das Ganze am rechten Rand des Fensters verankert, kann aber in der Größe verändert werden, ohne einen Bruch zu benutzen.
2022-09-29 22:41:23 +03:00
2022-10-27 12:02:49 +03:00
## Textelemente
2022-09-29 22:41:23 +03:00
2022-10-27 12:02:49 +03:00
Sie können ein HUD-Element erstellen, sobald Sie eine Kopie des Spieler-Objekts haben:
2022-09-29 22:41:23 +03:00
```lua
2022-10-27 12:02:49 +03:00
local player = minetest.get_player_by_name("benutzername")
2022-09-29 22:41:23 +03:00
local idx = player:hud_add({
hud_elem_type = "text",
position = {x = 0.5, y = 0.5},
offset = {x = 0, y = 0},
2022-10-27 12:02:49 +03:00
text = "Hallo Welt!",
alignment = {x = 0, y = 0}, -- mittig Ausrichtung
scale = {x = 100, y = 100}, -- Später behandelt
2022-09-29 22:41:23 +03:00
})
```
2022-10-27 12:02:49 +03:00
Die Funktion `hud_add` gibt eine Element-ID zurück - diese kann später verwendet werden, um ein
HUD-Element zu modifizieren oder zu entfernen.
2022-09-29 22:41:23 +03:00
2022-10-27 12:02:49 +03:00
### Parameter
2022-09-29 22:41:23 +03:00
2022-10-27 12:02:49 +03:00
Der Typ des Elements wird mit der Eigenschaft `hud_elem_type` in der Definitionstabelle angegeben
Tabelle angegeben. Die Bedeutung der anderen Eigenschaften hängt von diesem Typ ab.
2022-09-29 22:41:23 +03:00
2022-10-27 12:02:49 +03:00
`scale` ist die maximale Begrenzung des Textes; Text außerhalb dieser Begrenzung wird abgeschnitten, z. B.: `{x=100, y=100}`.
2022-09-29 22:41:23 +03:00
2022-10-27 12:02:49 +03:00
`number` ist die Farbe des Textes in [hexadezimaler Form] (http://www.colorpicker.com/), z. B.: `0xFF0000`.
2022-09-29 22:41:23 +03:00
2022-10-27 12:02:49 +03:00
### Unser Beispiel
2022-09-29 22:41:23 +03:00
2022-10-27 12:02:49 +03:00
Lassen Sie uns fortfahren und den gesamten Text in unserer Punkte-Tafel platzieren:
2022-09-29 22:41:23 +03:00
```lua
2022-10-27 12:02:49 +03:00
-- Holt sich die Anzahl der Abbauungen und Platzierungen aus dem Speicher, oder setzt den Wert auf standardmäßig 0
2022-09-29 22:41:23 +03:00
local meta = player:get_meta()
2022-10-27 12:02:49 +03:00
local abbau_text = "Abgebaut: " .. meta:get_int("score:digs")
local platzier_text = "Platziert: " .. meta:get_int("score:places")
2022-09-29 22:41:23 +03:00
player:hud_add({
hud_elem_type = "text",
position = {x = 1, y = 0.5},
offset = {x = -120, y = -25},
2022-10-27 12:02:49 +03:00
text = "Statistiken",
2022-09-29 22:41:23 +03:00
alignment = 0,
scale = { x = 100, y = 30},
number = 0xFFFFFF,
})
player:hud_add({
hud_elem_type = "text",
position = {x = 1, y = 0.5},
offset = {x = -180, y = 0},
2022-10-27 12:02:49 +03:00
text = abbau_text,
2022-09-29 22:41:23 +03:00
alignment = -1,
scale = { x = 50, y = 10},
number = 0xFFFFFF,
})
player:hud_add({
hud_elem_type = "text",
position = {x = 1, y = 0.5},
offset = {x = -70, y = 0},
2022-10-27 12:02:49 +03:00
text = platzier_text,
2022-09-29 22:41:23 +03:00
alignment = -1,
scale = { x = 50, y = 10},
number = 0xFFFFFF,
})
```
2022-10-27 12:02:49 +03:00
Daraus ergibt sich das Folgende:
2022-09-29 22:41:23 +03:00
<figure>
<img
src="{{ page.root }}//static/hud_text.png"
2022-10-27 12:02:49 +03:00
alt="Screenshot des HUD, den wir anstreben">
2022-09-29 22:41:23 +03:00
</figure>
2022-11-04 21:02:23 +03:00
## Bild-Elemente
2022-09-29 22:41:23 +03:00
2022-11-04 21:02:23 +03:00
Bild-Elemente werden auf sehr ähnliche Weise wie Text-Elemente erstellt:
2022-09-29 22:41:23 +03:00
```lua
player:hud_add({
hud_elem_type = "image",
position = {x = 1, y = 0.5},
offset = {x = -220, y = 0},
2022-11-04 21:02:23 +03:00
text = "punkte_hintergrund.png",
2022-09-29 22:41:23 +03:00
scale = { x = 1, y = 1},
alignment = { x = 1, y = 0 },
})
```
2022-11-04 21:02:23 +03:00
Sie werden jetzt dies haben:
2022-09-29 22:41:23 +03:00
<figure>
<img
src="{{ page.root }}//static/hud_background_img.png"
2022-11-04 21:02:23 +03:00
alt="Screenshot des bisherigen HUDs">
2022-09-29 22:41:23 +03:00
</figure>
2022-11-04 21:02:23 +03:00
### Parameter
2022-09-29 22:41:23 +03:00
2022-11-04 21:02:23 +03:00
Das Feld `text` wird für die Angabe des Bildnamens verwendet.
2022-09-29 22:41:23 +03:00
2022-11-04 21:02:23 +03:00
Wenn eine Koordinate positiv ist, handelt es sich um einen Skalierungsfaktor, wobei 1
2022-11-30 20:14:26 +03:00
die ursprüngliche Bildgröße, 2 die doppelte Größe usw. ist.
2022-11-04 21:02:23 +03:00
Ist eine Koordinate jedoch negativ, handelt es sich um einen Prozentsatz der Bildschirmgröße.
Zum Beispiel ist `x=-100` 100% der Breite.
2022-09-29 22:41:23 +03:00
### Scale
2022-11-04 21:02:23 +03:00
Lassen Sie uns den Fortschrittsbalken für unser Score-Panel als Beispiel für die Skala erstellen:
2022-09-29 22:41:23 +03:00
```lua
local percent = tonumber(meta:get("score:score") or 0.2)
player:hud_add({
hud_elem_type = "image",
position = {x = 1, y = 0.5},
offset = {x = -215, y = 23},
2022-11-04 21:02:23 +03:00
text = "punkte_balken_leer.png",
2022-09-29 22:41:23 +03:00
scale = { x = 1, y = 1},
alignment = { x = 1, y = 0 },
})
player:hud_add({
hud_elem_type = "image",
position = {x = 1, y = 0.5},
offset = {x = -215, y = 23},
2022-11-04 21:02:23 +03:00
text = "punkte_balken_voll.png",
2022-09-29 22:41:23 +03:00
scale = { x = percent, y = 1},
alignment = { x = 1, y = 0 },
})
```
2022-11-30 20:14:26 +03:00
Wir haben jetzt ein HUD, der wie der im ersten Abschnitt aussieht!
2022-11-04 21:02:23 +03:00
Es gibt jedoch ein Problem: Es wird nicht aktualisiert, wenn sich die Statistiken ändern.
2022-09-29 22:41:23 +03:00
2022-11-04 21:02:23 +03:00
## Ein Element verändern
2022-09-29 22:41:23 +03:00
2022-11-04 21:02:23 +03:00
Sie können die von der Methode `hud_add` zurückgegebene ID verwenden, um es später zu aktualisieren oder zu entfernen.
2022-09-29 22:41:23 +03:00
```lua
local idx = player:hud_add({
hud_elem_type = "text",
2022-11-04 21:02:23 +03:00
text = "Hallo Welt!",
-- Parameter der Kürze halber entfernt
2022-09-29 22:41:23 +03:00
})
2022-11-04 21:02:23 +03:00
player:hud_change(idx, "text", "Neuer Text")
2022-09-29 22:41:23 +03:00
player:hud_remove(idx)
```
2022-11-04 21:02:23 +03:00
Die Methode `hud_change` nimmt die Element-ID, die zu ändernde Eigenschaft und den
neuen Wert. Der obige Aufruf ändert die Eigenschaft `text` von "Hallo Welt!" in "Neuer Text".
2022-09-29 22:41:23 +03:00
2022-11-04 21:02:23 +03:00
Das bedeutet, dass die Ausführung von `hud_change` unmittelbar nach `hud_add` funktionell
äquivalent zu folgendem ist, und zwar auf eine ziemlich ineffiziente Weise:
2022-09-29 22:41:23 +03:00
```lua
local idx = player:hud_add({
hud_elem_type = "text",
2022-11-04 21:02:23 +03:00
text = "Neuer Text",
2022-09-29 22:41:23 +03:00
})
```
2022-11-04 21:02:23 +03:00
## IDs speichern
2022-09-29 22:41:23 +03:00
```lua
2022-11-04 21:02:23 +03:00
punkte = {}
local gespeicherte_huds = {}
2022-09-29 22:41:23 +03:00
2022-11-04 21:02:23 +03:00
function punkte.update_hud(player)
2022-09-29 22:41:23 +03:00
local player_name = player:get_player_name()
2022-11-04 21:02:23 +03:00
-- Holt die Anzahl der Abbauungen und Orte aus dem Speicher, oder setzt ihn auf standardmäßig 0
2022-09-29 22:41:23 +03:00
local meta = player:get_meta()
2022-11-04 21:02:23 +03:00
local abbau_text = "Abbauungen: " .. meta:get_int("score:digs")
local platier_text = "Platzierungen: " .. meta:get_int("score:places")
local prozent = tonumber(meta:get("score:score") or 0.2)
2022-09-29 22:41:23 +03:00
2022-11-04 21:02:23 +03:00
local ids = gespeicherte_huds[player_name]
2022-09-29 22:41:23 +03:00
if ids then
2022-11-04 21:02:23 +03:00
player:hud_change(ids["platzierungen"], "text", places_text)
player:hud_change(ids["abbauungen"], "text", digs_text)
player:hud_change(ids["balken_vordergrund"],
"scale", { x = prozent, y = 1 })
2022-09-29 22:41:23 +03:00
else
ids = {}
2022-11-04 21:02:23 +03:00
gespeicherte_huds[player_name] = ids
2022-09-29 22:41:23 +03:00
2022-11-04 21:02:23 +03:00
-- Erstellt HUD-Elemente und setzt die IDs in `ids`
2022-09-29 22:41:23 +03:00
end
end
2022-11-04 21:02:23 +03:00
minetest.register_on_joinplayer(punkte.update_hud)
2022-09-29 22:41:23 +03:00
minetest.register_on_leaveplayer(function(player)
2022-11-04 21:02:23 +03:00
gespeicherte_huds[player:get_player_name()] = nil
2022-09-29 22:41:23 +03:00
end)
```
2022-11-04 21:02:23 +03:00
## Andere Elemente
2022-09-29 22:41:23 +03:00
2022-11-04 21:02:23 +03:00
Lesen Sie [lua_api.txt 🇬🇧](https://minetest.gitlab.io/minetest/hud/) für eine vollständige Liste der HUD-Elemente.