Jak efektywnie realizować wyświetlanie i chowanie menu za pomocą przycisku w Godot?

in polish •  2 days ago 

W grach i aplikacjach często pojawia się potrzeba wyświetlania oraz ukrywania menu lub interfejsu po naciśnięciu odpowiedniego przycisku. Godot Engine oferuje kilka sposobów realizacji tego problemu, a poniżej opiszę najbardziej praktyczne i efektywne rozwiązania.


Podstawowa metoda z Input i visible

Najprostszym i najefektywniejszym rozwiązaniem jest użycie funkcji Input.is_action_just_pressed() oraz właściwości visible obiektu.

Kod minimalny i czytelny:

extends Node2D

@onready var inventory = $"Inventory"  # Ścieżka do menu
func _process(delta: float) -> void:
    if Input.is_action_just_pressed("Toggle_Inventory"):
        inventory.visible = not inventory.visible

Dlaczego to działa dobrze?

  1. Input.is_action_just_pressed() wykrywa jedno naciśnięcie klawisza, bez ciągłego wywoływania.
  2. inventory.visible = not inventory.visible jest prostą operacją negacji wartości true/false, dzięki czemu menu zmienia stan (widoczne -> niewidoczne).

Alternatywne rozwiązanie z show() i hide()

Jeśli preferujesz bardziej czytelny styl, możesz użyć show() i hide() zamiast bezpośredniej manipulacji visible:

extends Node2D

@onready var inventory = $"Inventory"
var inventory_visible = false

func _process(delta: float) -> void:
    if Input.is_action_just_pressed("Toggle_Inventory"):
        inventory_visible = not inventory_visible
        if inventory_visible:
            inventory.show()
        else:
            inventory.hide()

Zalety:

  • Czytelny i bardziej rozbudowany kod dla początkujących.
  • Możliwość łatwego dodania dodatkowej logiki (np. efektów animacji).

Wady:

  • Nieco więcej linijek kodu.

Kompaktowy zapis z operatorem trójargumentowym

Dla osób, które preferują bardzo zwięzły kod, można użyć operatora trójargumentowego (conditional expression):

extends Node2D

@onready var inventory = $"Inventory"

func _process(delta: float) -> void:
    if Input.is_action_just_pressed("Toggle_Inventory"):
        inventory.show() if inventory.visible == false else inventory.hide()

Uwagi:

  • if ... else po wyrażeniu działa, ale jest bardziej zagmatwany dla osób początkujących.
  • Godot nie wymaga dwukropka po else (jak w Pythonie), więc można użyć jednej linii.

Najlepsze rozwiązanie

Najbardziej efektywne i czytelne podejście to:

extends Node2D

@onready var inventory = $"Inventory"

func _process(delta: float) -> void:
    if Input.is_action_just_pressed("Toggle_Inventory"):
        inventory.visible = not inventory.visible

Dlaczego to najlepsze rozwiązanie?

  1. Minimalna ilość kodu: Jedna linia zmienia stan widoczności menu.
  2. Optymalna wydajność: Operacja jest szybka i nie wymaga dodatkowych warunków.
  3. Czytelność: Logika jest prosta i zrozumiała nawet dla początkujących.

Dodatkowe uwagi

  1. Przypisanie akcji klawisza:

    • W edytorze Godot przejdź do Project -> Project Settings -> Input Map.
    • Dodaj nową akcję o nazwie Toggle_Inventory i przypisz do niej wybrany klawisz, np. Tab lub I.
  2. Efekty wizualne:

    • Możesz dodać animacje przy wyświetlaniu menu za pomocą AnimationPlayer.
    • Przykład dodania fade-in/fade-out do widoczności menu:

    @onready var animation_player = $"AnimationPlayer" func _process(delta: float) -> void: if Input.is_action_just_pressed("Toggle_Inventory"): if inventory.visible: animation_player.play("fade_out") inventory.visible = false else: inventory.visible = true animation_player.play("fade_in")


Podsumowanie

Najbardziej efektywne podejście polega na użyciu właściwości visible i prostej negacji za pomocą not:

inventory.visible = not inventory.visible

To rozwiązanie jest krótkie, czytelne i wydajne, co sprawia, że idealnie nadaje się do zarządzania widocznością interfejsu w Godot.

Published using WordPress Blurt Publisher from https://godot.com.pl.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE BLURT!