Przedmioty do zbierania w grach są realizowane za pomocą węzłów takich jak Area2D
(dla gier 2D) lub Area3D
(dla gier 3D), które umożliwiają wykrywanie kolizji z graczem. Poniżej znajduje się szczegółowy proces tworzenia takich przedmiotów.
1. Struktura sceny przedmiotu
Przykład struktury sceny:
CollectibleItem (Area2D)
├── Sprite2D (ikona przedmiotu)
└── CollisionShape2D (kształt kolizji)
- Area2D: Służy do wykrywania wejścia w obszar kolizji.
- Sprite2D: Wyświetla ikonę lub obraz przedmiotu.
- CollisionShape2D: Definiuje obszar kolizji.
2. Tworzenie sceny dla przedmiotu
a) Dodanie węzłów
- Utwórz nową scenę i dodaj węzeł bazowy typu
Area2D
. - Dodaj dziecko
Sprite2D
i przypisz do niego teksturę (np. obrazek monety lub przedmiotu). - Dodaj dziecko
CollisionShape2D
i wybierz kształt kolizji (np.RectangleShape2D
lubCircleShape2D
).
b) Skrypt obsługujący przedmiot
Przypisz skrypt do węzła Area2D
, aby obsługiwał zdarzenie kolizji z graczem:
extends Area2D
@export var value: int = 10 # Wartość przedmiotu (np. punkty lub złoto)
func _ready():
connect("body_entered", self, "_on_body_entered")
func _on_body_entered(body):
if body.name == "Player": # Sprawdź, czy to gracz
print("Przedmiot zebrany! Wartość: ", value)
queue_free() # Usuń przedmiot
3. Dodanie przedmiotu do świata gry
- W głównej scenie gry (
main.tscn
) dodaj wcześniej utworzoną scenę przedmiotu jako instancję:- Kliknij
Instance Child Scene
i wybierz swoją scenę przedmiotu.
- Kliknij
- Umieść instancję przedmiotu w świecie gry, gdzie gracz będzie mógł go zebrać.
4. Rozbudowa logiki przedmiotu
a) Dodanie animacji
Aby przedmiot wyglądał bardziej atrakcyjnie, możesz dodać animację:
- Dodaj węzeł
AnimationPlayer
jako dzieckoArea2D
. - Stwórz animację (np. obrót lub pulsowanie) w
AnimationPlayer
. - W skrypcie uruchom animację:
func _ready(): $AnimationPlayer.play("rotate")
b) Integracja z systemem punktów
Dodaj system punktów w grze i zwiększaj wynik gracza po zebraniu przedmiotu:
- W głównej scenie dodaj zmienną do zarządzania punktami:
var score: int = 0
- W funkcji
_on_body_entered
przedmiotu odwołaj się do systemu punktów:func _on_body_entered(body): if body.name == "Player": body.add_score(value) # Zakładamy, że gracz ma metodę
add_scorequeue_free()
c) Losowe generowanie przedmiotów
Aby generować przedmioty w losowych miejscach:
- Dodaj węzeł
Timer
do sceny gry i ustaw jego czas. - W skrypcie głównej sceny generuj przedmioty w funkcji
_on_Timer_timeout
:func _on_Timer_timeout(): var item = preload("res://CollectibleItem.tscn").instance() item.global_position = Vector2(randf() * screen_width, randf() * screen_height) add_child(item)
5. Testowanie i debugowanie
- Sprawdź kolizje:
- Włącz opcję
Visible Collision Shapes
w menu debugowania, aby zobaczyć obszar kolizji przedmiotu.
- Włącz opcję
- Monitoruj logi:
- Używaj
print()
w funkcji_on_body_entered
, aby upewnić się, że zdarzenie działa poprawnie.
- Używaj
6. Rozszerzenie systemu przedmiotów
a) Tworzenie klas różnych przedmiotów
Możesz stworzyć bazowy skrypt dla przedmiotów i dziedziczyć go w innych klasach:
# BaseItem.gd
extends Area2D
@export var value: int = 10
func on_collected(player):
print("Przedmiot zebrany!")
Następnie dziedzicz w specjalizowanych przedmiotach:
# GoldItem.gd
extends "res://BaseItem.gd"
func on_collected(player):
player.gold += value
print("Zebrano złoto!")
queue_free()
b) Rzadkość przedmiotów
Dodaj różne poziomy rzadkości przedmiotów:
@export var rarity: String = "common" # Możliwe wartości: "common", "rare", "legendary"
func _ready():
match rarity:
"common":
$Sprite2D.modulate = Color(1, 1, 1) # Biały
"rare":
$Sprite2D.modulate = Color(0, 0, 1) # Niebieski
"legendary":
$Sprite2D.modulate = Color(1, 0.5, 0) # Pomarańczowy
Podsumowanie
Tworzenie przedmiotów do zbierania w Godot 4 jest proste i elastyczne dzięki użyciu węzłów Area2D
i CollisionShape2D
. Możesz łatwo dostosować ich zachowanie, dodawać animacje, integrować z systemem punktów czy losowo je generować. Ten fundament można rozbudować, tworząc bardziej zaawansowane systemy, takie jak rzadkość przedmiotów, efekty wizualne czy interakcje z innymi systemami gry.