Kodowanie pętli gry

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Z mapą stworzoną, nadszedł czas na zaczęcie budowania skryptów. Reszta tego kursu będzie się skupiać głównie na budowaniu wszystkich różnych elementów pętli gry.

Konfiguracja Skrypt

Bitwa będzie używać kombinacji modułowych skrypt i zwykłych skryptów. Poniżej są skrypcity i ich funkcje.

GAMEManagerSkrypt. Wykonuje funkcje z kodu źródłowego z Menu meczu używając zmiennej z ustawień gry
MatchManagerScript modułu. Wykonuje funkcje, takie jak wysyłanie graczy na arenę lub śledzenie czasu w dopasowywać.
UstawieniaGrySkrypt modułu. Przechowuje używane przez inne skrypty zmienne.

Skrypt GameSettings

Utwórz skrypt modułowy o nazwie GameSettings, aby przechowywać zmienne używane przez inne skrypty, takie jak czas trwania meczu i przerwy. Te zmienne zostaną użyte przez skrypt GameManager później.

  1. W ServerStorage , utwórz katalog o nazwie ModuleScripts. W tym katalogu utwórz nowy skrypt modułowy nazyający się GameSettings.

  2. Otwórz GameSettings i zmień nazwę tabeli modułu, aby pasować do nazwy skryptu.


    local GameSettings = {}
    return GameSettings
  3. W tabeli modułu dodaj zmienne dla następujących użyć. Zrób swoje najlepsze podejście dla każdej wartości, zawsze możesz go zmienić później podczas testowania.

    • Czas przerwy - Drukuj gracze czekają przed dopasowywać.
    • Czas meczu - Długość meczu w sekundach.
    • Minimalna liczba graczy - najmniejsza liczba graczy wymagana do rozpoczynać.
    • Czas przejścia - Czas przed i po meczu w sekundach. Zmniejsza przejście między częściami gry w pętli.

    local GameSettings = {}
    -- Zróżnicowane gry
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

Skrypt MatchManager

Drugim skryptem połąзанym z GameManager jest MatchManager. Ten skrypt zarządza zadaniami, takimi jak uruchomienie licznika lub reset graczy po zakończeniu meczu.

W MatchManager jest funkcja nazyjąca się prepareGame() Zaczyna grę poprzez przeniesienie graczy do dopasowywać.

  1. W ServerStorage > ModuleScripts > dodaj modułowy skrypt nazywający się MatchManager. Zmień tabelę modułu.


    local MatchManager = {}
    return MatchManager
  2. Dodaj nową funkcję modułu nazyającą się prepareGame(). Zawiera ona drukową stwierdzenie, aby testować skrypt później.


    local MatchManager = {}
    function MatchManager.prepareGame()
    print("Game starting!")
    end
    return MatchManager

Kodowanie pętli gry

Główny pętel w grze zostanie zapisany w skrypcie GameManager używając zmiennych właśnie utworzonych. Pamiętaj, że w grze jest trzy fazy: przerwa, konkurs i czyszczenie i resetować.

Skrypt GameManager

Ten skrypt jest zwykłym skryptem serwera, więc umieść go w ServerScriptService, a nie w katalogu modułów. Prawdziwy pętel gry będzie w pewnym czasie prawdziwy pętel.

  1. W ServerScriptService utwórz nowy skrypt o nazwie GameManager.

  2. Dodaj zmienne dla usługi "ServerStorage", gdzie są Moduły Skryptów. Następnie dodaj zmienne dla usługi "Players", która będzie wymagana do sprawdzenia liczby graczy podczas przerw.


    -- Usługi
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. Aby użyć wcześniej stworzonych modułów:

    • Ustaw zmienne nazyjące się moduleScripts w lokalizacji katalogu ModuleScripts.
    • Dodaj zmienne nazyjące się matchManager i gameSettings. Ustaw każdą zmienną, aby wymagała odpowiedniego skryptu.

    -- Usługi
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Skripty modułu
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
  4. Po zmienne, dodaj pętlię while true do. Wszystkie fazy pętli gry będą idły do wewnątrz, aby powtarzać nieskończono.


    -- Skripty modułu
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Główny pętel w grze
    while true do
    end

Kodowanie przerwy

Gdy pętla gry biegnie nieokreślony czas, przerwa powinna wstrzymać pętlę i kontynuować tylko wtedy, gdy jest wystarczająco dużo graczy do dopasowywać. Aby skodować tę przerwę, włącz pętło powtarzania w pętli i tylko kontynuuj, gdy będzie wystarczająco dużo graczy, aby wyjść i przenieść graczy do dopasowywać.

Z użyciem powtarzającego się pętla , kod w pętli będzie się wykonuje przynajmniej raz. Nie jak pętla czasu, nie sprawdza warunku, dopóki pętla się nie zakończy. To gwarantuje, że gracze zawsze idą do lobby przed dopasowywać.

  1. W pętli while true do wpisuj repeat i naciśnij Enter, aby automatycznie uzupełnić słowo kluczowe 1>do1>.


    while true do
    repeat
    until
    end
  2. Sprawdź, czy obecna liczba graczy (#Players:GetPlayers()) jest większa lub równa wartości minimumPlayers zmiennej stworzonej w module UstawieniaGry.


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. W pętli powtarzalnej dodaj oświadczenie drukowania mówiące, że przerwa się zaczyna. Użyj task.wait() , aby wstrzymać przerwę używając intermissionDuration z GameSettings.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Zagrajtestuj i sprawdź, że drukowanie oświadczenia "Starting intermission" jest wyświetlane co najmniej dwa razy. Widząc wiadomość dwa razy potwierdza, że pętla powtarzania nie znajduje wystarczającej liczby graczy i zaczął ponownie. Będziesz musiał czekać na długość przerwy, zanim zobaczysz wiadomość po raz drugi.

Wskazówki dotyczące rozwiązywania problemów

W tym momencie, jeśli nie spawiasz się, jak chciałbyś, spróbuj jednej z poniższych opcji.

  • task.wait() powinien być w środku pętli powtarzania. Bez czekania, skrypt będzie wykonuje zbyt wiele razy w ciągu sekundy, co powoduje przeciążenie Roblox Studio i powoduje błąd.
  • W module Ustawienia w grze zmienne intermissionDuration powinno być większe niż 1. Jeśli jest mniejsze, skrypt może się powtarzać zbyt często, powodując problemy z opóźnieniem.

Zakończenie przerwy

Gdy wystarczy liczba wystarczająca graczy, pozwól im poczekać na krótką czas do przejścia. Następnie wysyłaj ich do meczu poprzez wezwanie funkcji prepareGame() w Menu meczu. Pamiętaj, że funkcja ta tylko drukuje linię, ale będziesz dodać więcej kodu później.

  1. Na końcu powtarzającego się pętla dodaj oświadczenie drukowania mówiące, że przerwa się zakończyła, aby przetestować swój kod. Następnie podążaj za nim za pomocą zmiennej task.wait() używającej zmiennej transitionTime GameSettings.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. Po czekach, wezwij prepareGame() z modułu MatchManager. Gdy kod zostanie wykonany, to tylko tekst zostanie wydrukowany do okienka wyjścia. Poczekaj do następnego sekcji, aby przetestować ten kod.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    end

Testowanie gier wieloosobowych

Obecnie, aby mieć kod zbiegać się prepareGame() , musi wyjść z pętli powtarzania. Ale, aby to zrobić, musi być więcej niż jeden gracz. Oznacza to, że jeśli użyjesz przycisku playtest, funkcja nigdy nie zostanie wykonana, ponieważ jesteś jedynym graczem w grze (chyba że twoi minimalni gracze są jeden). Aby to

Początkujący lokalny serwer

Aby testować kod wymagający więcej niż jednego gracza, stwórz lokalny serwer. Meskie gry są zwykle na serwerach Roblox, ale lokalny serwer simuluje grę wieloosobową na Twoim komputerze z graczami simulowanymi.

  1. Aby uruchomić lokalny serwer, w zakładce Test > Klienci i serwery > ustaw Dropdown gracza na liczbę graczy w zmiennej grze minimumPlayers. Ta lekcja używa 2 graczy.

  2. Kliknij Start, aby uruchomić serwer.

  3. Poczekaj kilka sekund, aby serwer się ustawił. Wiele okien zostanie otwartych oprócz Twojego pierwotnego okna Studio. Możliwe, że będziesz musiał pozwolić na dostęp do Roblox Studio z firewalls lub innego oprogramowania antywirusowego.

Wskazówki dotyczące rozwiązywania problemów

W tym momencie nie możesz zobaczyć serwerów testowych, spróbuj jednej z poniższych opcji.

  • Jeśli masz jakiekolwiek problemy z uruchomieniem serwera, sprawdź ponownie artykuł Kwestie firewall i routera.
  • Ustaw liczbę graczy na niewielką ilość, jak 2 lub 3.
  • Jeśli problem nie zostanie rozwiązany, spróbuj ponownie uruchomić Studio lub ponownie uruchomić komputer.

Testowanie na lokalnym serwerze

Zobaczysz wiele okien, gdy serwer się uruchomi. Każde z nich reprezentuje inną część relacji serwera/klienta.

  • Serwer (zielony pasek) zarabia gra.
  • Klient (niebieskie granice) simuluje doświadczenie gracza.
Serwer z zieloną granicą
Klient z niebieską granicą

Gdy serwer jest aktywny, możesz sprawdzić, czy kod działał.

  1. Znajdź Okno Serwera z zielonym panelem. Sprawdź drukowanie zgłoszenia z pasku MatchManager. Ponieważ jest powtarzające się panele, zobaczysz tę samą drukowanie zgłoszeń.

  2. Po zakończeniu testu, w dowolnym oknie, zamknij serwer przyciskiem Uruchom czyszczenie . To zamyka wszystkie okna serwera i klienta i przenosi cię do normalnego okna Studio.

Wskazówki dotyczące rozwiązywania problemów

W tym momencie, jeśli nie pojawiły się zamiarowane deklaracje drukowania, spróbuj jednej z poniższych opcji.

  • Sprawdź, czy funkcje takie jak prepareGame() są w zakresie prawdziwego pętla while.
  • Jeśli druk z MatchManager nie działał, sprawdź kilka rozwiązań problemów z modułami, takich jak upewnienie się, że skrypt MatchManager jest wymagany w GameManager lub że prepareGame() jest dodany do tabeli modułu.

Ukończone Skrypcity

Poniżej znajdują się zakończone skrypty, aby podwoić sprawdzenie swojej pracy.

Skrypt GameManager


-- Usługi
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Skripty modułu
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Główny pętel w grze
while true do
repeat
print("Starting intermission")
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
end

Skrypt MatchManager


local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager

Skrypt GameSettings


local GameSettings = {}
-- Zróżnicowane gry
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings