Jak tworzyć poziomy w grach Godot

Photo of author

By maciekx

Projektowanie poziomów to fundamentalny element w procesie tworzenia gier, który ma potężny wpływ na atrakcyjność całej produkcji. To właśnie poziomy nadają grze strukturę i oferują wyzwania, które podtrzymują zainteresowanie graczy i motywują ich do dalszego eksplorowania świata gry.

Poprzez staranne planowanie i tworzenie dobrze zaprojektowanych poziomów, możesz zaoferować graczom znacznie bardziej wciągające i satysfakcjonujące doświadczenie. Bez względu na to, czy jesteś początkującym, czy doświadczonym twórcą, Godot zapewnia narzędzia ułatwiające kreowanie zapadających w pamięć poziomów, które sprawią, że gracze będą chcieli wracać po więcej.

Przygotowanie środowiska gry w Godot

Zanim rozpoczniesz proces projektowania poziomów, niezbędne jest właściwe przygotowanie projektu gry 2D w silniku Godot.

Kod, który jest wykorzystany w tym artykule, znajdziesz w tym repozytorium GitHub. Jest on udostępniony bezpłatnie na licencji MIT.

Zacznij od utworzenia nowej sceny i dodania węzła typu Node2D jako głównego węzła. Będzie on pełnił rolę kontenera dla wszystkich pozostałych węzłów na scenie. Gdy projekt będzie już skonfigurowany, możesz przejść do dodania postaci gracza.

W panelu Scena, kliknij prawym przyciskiem myszy i wybierz opcję „Nowa scena”, aby utworzyć kolejną. Następnie dodaj węzeł CharacterBody2D, który będzie reprezentował postać gracza. Węzeł CharacterBody2D oferuje wbudowane funkcje wykrywania ruchu i kolizji dla obiektów 2D.

W obrębie węzła CharacterBody2D dodaj węzeł CollisionShape2D, nadając mu kształt prostokąta, a także węzeł Sprite, który będzie odpowiadał za wygląd postaci gracza.

Po skonfigurowaniu postaci gracza oraz jej wizualnej reprezentacji, możesz skupić się na stworzeniu pierwszego poziomu gry.

Projektowanie dwóch unikalnych poziomów

W Godot poziomy można tworzyć za pomocą plików scen (.tscn), z których każdy reprezentuje odrębny poziom. Używając dwóch różnych poziomów, masz możliwość zaimplementowania unikalnych układów oraz ruchomych platform.

Kod odpowiedzialny za gracza

Skrypt przypisany do węzła CharacterBody2D odpowiada za obsługę ruchu gracza na podstawie danych wejściowych od użytkownika. W przedstawionym GDScript kierunek ruchu jest obliczany na podstawie wciśniętych klawiszy, a prędkość gracza jest odpowiednio ustawiana.

Prędkość gracza definiuje, jak szybko się porusza, a funkcja move_and_collide odpowiada za detekcję kolizji.

 extends CharacterBody2D

var speed = 300

func _physics_process(delta):
    var input_dir = Vector2.ZERO

    if Input.is_action_pressed("ui_left"):
        input_dir.x -= 1

    if Input.is_action_pressed("ui_right"):
        input_dir.x += 1

    if Input.is_action_pressed("ui_up"):
        input_dir.y -= 1

    if Input.is_action_pressed("ui_down"):
        input_dir.y += 1

    velocity = input_dir.normalized() * speed
    move_and_collide(velocity * delta)

Kod odpowiedzialny za platformy

Skrypt dla platformy rozszerza StaticBody2D, co oznacza, że platforma pozostanie nieruchoma, dopóki nie zostanie na nią nałożony ruch. W tym przypadku, za pomocą zmiennej move_speed można kontrolować szybkość poruszania się platformy.

Platforma porusza się w poziomie, w przód i w tył, w określonym zakresie (w tym przykładzie od 100 do 400 jednostek). Po dotarciu do granicy, kierunek ruchu zostaje odwrócony.

 
extends StaticBody2D

const move_speed = 100
var move_direction = Vector2(1, 0)

func _physics_process(delta):
    var platform_movement = move_direction * move_speed * delta
    translate(platform_movement)

    
    if position.x > 400 or position.x < 100:
        move_direction *= -1

Dzięki wykorzystaniu tych skryptów, możliwe jest tworzenie intrygujących wzorców ruchu dla platform oraz projektowanie angażującej rozgrywki w grach platformowych.

Łączenie poszczególnych poziomów

W typowej grze pożądane jest, aby gracze płynnie przemieszczali się pomiędzy poziomami. Aby to osiągnąć, należy zaimplementować skrypt Menedżera poziomów, który będzie zarządzał zmianą poziomów w momencie, gdy gracz przekroczy granice ekranu.

Skrypt Menedżera poziomów monitoruje aktualny numer poziomu oraz rozmiar ekranu. W funkcji _ready() ładuje on początkowy poziom (poziom 1). Funkcja load_level przyjmuje numer poziomu jako argument wejściowy, konstruuje ścieżkę do odpowiedniego pliku sceny, a następnie tworzy instancję tej sceny.

Dodanie nowego poziomu jako elementu potomnego Menedżera poziomów powoduje efektywną zmianę aktualnie wyświetlanego poziomu.

 extends Node2D

var level_number = 1
var screen_size = Vector2()
var is_switching_level = false

func _ready():
    screen_size = get_viewport_rect().size
    load_level(level_number)

func load_level(level):
    var level_path = "res://Level" + str(level) + ".tscn"
    var level_scene = load(level_path)
    var level_instance = level_scene.instantiate()
    add_child(level_instance)
    is_switching_level = false

func switch_level():
    if is_switching_level:
        return

    is_switching_level = true
    level_number += 1

    if level_number > 2:
        level_number = 1

    
    var player = get_node("Node2D/Player")

    if player:
        var player_position = player.position

        if player_position.x < 0:
            player.position.x = screen_size.x
        elif player_position.x > screen_size.x:
            player.position.x = 0
        elif player_position.y < 0:
            player.position.y = screen_size.y
        elif player_position.y > screen_size.y:
            player.position.y = 0

    get_node("Node2D").queue_free()
    load_level(level_number)

func _process(delta):
    
    
    var player = get_node("Node2D/Player")

    if player:
        var player_position = player.position
        var condition1 = player_position.x < 0
        var condition2 = player_position.x > screen_size.x
        var condition3 = player_position.y < 0
        var condition4 = player_position.y > screen_size.y

        if condition1 or condition2 or condition3 or condition4 :
            switch_level()

Wykorzystując Menedżera poziomów, możesz zapewnić płynne przechodzenie pomiędzy poszczególnymi poziomami oraz zachowywać dane gracza między nimi, co przekłada się na spójną rozgrywkę.

Włączanie dodatkowych elementów

Projektowanie poziomów daje możliwość włączenia do gry rozmaitych elementów, które uatrakcyjniają rozgrywkę i sprawiają, że staje się ona bardziej ekscytująca.

Przedmioty kolekcjonerskie

Dodaj przedmioty kolekcjonerskie, na przykład monety, gwiazdki lub klucze, które gracze będą mogli zbierać, aby odblokowywać nowe obszary lub otrzymywać nagrody. Przedmioty kolekcjonerskie zachęcają do eksploracji i wprowadzają dodatkowy poziom wyzwań do rozgrywki.

Przeciwnicy

Wprowadź różnorodnych przeciwników o odmiennych zachowaniach i wzorcach poruszania się. Przeciwnicy stanowią przeszkody, z którymi gracz musi sobie poradzić, wprowadzając do gry element strategii i ekscytacji.

Ulepszenia

Dodaj ulepszenia, które tymczasowo wzmacniają umiejętności gracza, na przykład zwiększają prędkość, dają nieśmiertelność lub usprawniają ataki. Ulepszenia oferują chwile wzmocnienia i pomagają graczom pokonać trudne fragmenty gry.

Łamigłówki

Zaprojektuj elementy logiczne, które gracz musi rozwiązać, aby przejść przez poziom. Łamigłówki wprowadzają do rozgrywki element intelektualny i dają graczom poczucie satysfakcji po ich rozwiązaniu.

Poprzez włączenie tych dodatkowych elementów do swoich poziomów, możesz stworzyć rozbudowaną i urozmaiconą rozgrywkę, która przyciągnie graczy i pozwoli im zanurzyć się w świecie gry.

Dobre praktyki projektowania poziomów

Podczas tworzenia poziomów warto pamiętać o kilku dobrych praktykach, które zagwarantują graczom dobrze dopracowane i satysfakcjonujące doświadczenie:

Zbalansowany poziom trudności

Utrzymuj spójną krzywą trudności na wszystkich poziomach. Stopniowo podnoś poprzeczkę, aby utrzymać zaangażowanie graczy, jednocześnie nie przytłaczając ich. Wprowadzaj nowe mechaniki i wyzwania stopniowo, dając graczom czas na adaptację i naukę.

Zachęta do eksploracji

Projektuj poziomy z ukrytymi ścieżkami, sekretami i opcjonalnymi obszarami, które gracze będą mogli odkrywać. Eksploracja nagradza graczy premiami, przedmiotami kolekcjonerskimi lub skrótami, co wzbogaca rozgrywkę.

Testowanie i iteracja

Dokładnie testuj swoje poziomy, aby wyłapać wszelkie problemy, błędy lub braki w balansie. Na podstawie opinii graczy iteracyjnie ulepszaj projekt poziomów, aby podnieść jakość całościowego doświadczenia.

Warstwa wizualna i dźwiękowa

Zwróć uwagę na warstwę wizualną i dźwiękową swoich poziomów. Atrakcyjna grafika oraz wysokiej jakości efekty dźwiękowe mogą znacząco podnieść atmosferę i immersję w grze.

Płynność poziomu

Zapewnij płynny i logiczny przepływ poziomu. Prowadź graczy przez poziom za pomocą czytelnych wskazówek wizualnych i unikaj ślepych zaułków lub mylących układów.

Postępując zgodnie z tymi dobrymi praktykami, możesz projektować poziomy, które są nie tylko przyjemne w grze, ale także dobrze przemyślane i spójne z resztą gry.

Poziomy sprawiają, że gry Godot są bardziej wciągające

Poziomy odgrywają fundamentalną rolę w zwiększaniu atrakcyjności gier Godot dla graczy. Dobrze zaprojektowane poziomy dają poczucie postępu, osiągnięć oraz eksploracji, motywując graczy do kontynuowania rozgrywki.

Dzięki zrozumieniu zasad projektowania poziomów, wykorzystaniu możliwości Godota oraz włączaniu dodatkowych elementów, możesz tworzyć poziomy, które zachwycą graczy i przeniosą Twoją grę na wyższy poziom.


newsblog.pl