Godot

Lektion 4

För att implementera ett system där spelaren kan samla in föremål som lagras i inventariet och sedan konsumera dem vid behov, kan du följa dessa steg i Godot 4.3:

1. Definiera en Item-klass:

Skapa en resursfil som representerar olika typer av föremål.

# item.gd
extends Resource
class_name Item

@export var name: String
@export var icon: Texture2D
@export var effect: String  # T.ex. "heal", "boost_speed"

Denna klass innehåller information om föremålets namn, ikon och vilken effekt det har när det används.

2. Skapa en Collectible-scen:

Skapa en scen för föremål som spelaren kan samla in.

# Collectible.gd
extends Area2D

@export var item: Item

signal collected(item: Item)

func _ready() -> void:
    body_entered.connect(_on_body_entered)

func _on_body_entered(body: Node) -> void:
    if body.name == "Player":
        collected.emit(item)
        queue_free()

När spelaren kolliderar med föremålet, emitteras en signal med det insamlade föremålet, och föremålet tas bort från scenen.

3. Uppdatera spelarens skript (Player.gd):

I spelarens skript, hantera insamling och användning av föremål.

# Player.gd
extends CharacterBody2D

var inventory: Array[Item] = []

func _ready() -> void:
    # Anslut signalen från Collectible
    get_tree().connect("collected", self, "_on_item_collected")

func _on_item_collected(item: Item) -> void:
    inventory.append(item)
    update_inventory_display()

func use_item(item: Item) -> void:
    if item in inventory:
        match item.effect:
            "heal":
                increase_health()
            "boost_speed":
                boost_speed()
            _:
                print("Okänd effekt: ", item.effect)
        inventory.erase(item)
        update_inventory_display()

Här hanteras insamling av föremål och deras effekter när de används.

4. Implementera effekter för föremål:

Lägg till funktioner för att hantera specifika effekter.

func increase_health() -> void:
    health = min(health + 20, max_health)
    update_health_display()

func boost_speed() -> void:
    speed *= 1.5
    await get_tree().create_timer(5.0).timeout
    speed /= 1.5

Dessa funktioner ökar spelarens hälsa eller hastighet temporärt.

5. Uppdatera inventarievisningen:

Skapa en funktion för att uppdatera UI och visa aktuella föremål i inventariet.

func update_inventory_display() -> void:
    var inventory_ui = $UI/Inventory
    clear_children(inventory_ui)
    for item in inventory:
        var item_button = Button.new()
        item_button.text = item.name
        item_button.icon = item.icon
        item_button.connect("pressed", callable(self, "_on_item_button_pressed").bind(item))
        inventory_ui.add_child(item_button)

Denna funktion skapar en knapp för varje föremål i inventariet.

6. Hantera knapptryckningar för att använda föremål:

Lägg till en funktion som hanterar när spelaren klickar på ett föremål i inventariet.

func _on_item_button_pressed(item: Item) -> void:
    use_item(item)

När spelaren klickar på en knapp i inventariet, används det motsvarande föremålet.

7. Definiera clear_children-funktionen:

Eftersom VBoxContainer inte har en inbyggd metod för att rensa sina barn, kan du definiera en egen funktion:

func clear_children(container: VBoxContainer) -> void:
    for child in container.get_children():
        container.remove_child(child)
        child.queue_free()

Denna funktion itererar över alla barnnoder i container, tar bort dem och frigör dem från minnet.

Genom att följa dessa steg kan du implementera ett system där spelaren samlar in föremål som lagras i inventariet och sedan konsumerar dem vid behov i Godot 4.3.