Czas i wydarzenia

*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.

Podczas kursu rundy, skrypty będą musiały śledzić czas i wysyłały sygnały między różnymi skryptami. Czas będzie zarządzany za pomocą skryptu czasu, podczas gdy wydarzenia, koncepcja w kodowaniu Roblox, będą sygnalizować zmiany takie jak kończenie dopasowywać.

Wysyłanie sygnałów za pomocą wydarzeń

Z graczami teraz na arenie można używać wydarzeń, aby sygnalizować początek meczu i kod dla licznika może zacząć. Później wydarzenie może być również używane do sygnalizowania końca dopasowywaći czasu na przejście graczy do lobby.

Te wydarzenia nie są zapisane wcześniej, więc wymagają one stworzenia osobistego obiektu wydarzenia związanych . Wydarzenia związane są często używane do działań gracza i są podobne do wydarzeń takich jak Touched lub Changed.

Wiele skryptów może słuchać tych samych wiążących wydarzeń. To utrzymuje twój kod zorganizowany i ułatwia dodanie dodatkowego kodu na początek lub na końcu meczu, jeśli to konieczne.

Tworzenie powiązanych wydarzeń

Rozpocznij poprzez utworzenie wiążących obiektów wydarzeń dla początku i końca dopasowywać. Ponieważ wiążące wydarzenia nie wchodzą w interakcję z klientem, można je przechować w Serwerze Storage.

  1. W SerwerStorage utwórz nowy katalog nazyający się Events. W tym katalogu utwórz dwa Związane z wydarzeniem nazyające się MatchStart i MatchEnd.

Używanie wydarzeń

W tej chwili, gdy gracze wejdą na arenę, interwencja będzie się ponownie uruchomiała, a nie będzie to początek licznika. Główny pętel główny pętli gry musi zostać powiedziany, aby się zatrzymać i poczekać na uruchomienie wydarzenia MatchEnd przed przejściem do następnej części kodu.

Wydarzenia mają dwa zintegrowane funkcje: Connect() i Wait(). Zamiast używać Connect() jak wcześniej, wezwij 2>Wait2> na MatchEnd, aby wstrzymać kod do czasu uruchomienia 5>Match5>, aby uruchomić kod wstrzymań. W tym przypadku funkcja 8>Wait8> wstrzyma k

  1. W GAMEManager twórz zmienne dla katalogu Events i wydarzenia MatchEnd.


    -- Skripty modułu
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Wydarzenia
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
  2. Poczekaj, aż skrypt zakończy się po wydarzeniu końca meczu, aby się poruszać dalej. W pętli , w końcu, wpisywać: matchEnd.Event:Wait()


    while true do
    repeat
    task.wait(gameSettings.intermissionDuration)
    print("Restarting intermission")
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    -- Placeholder czeka na długość gra.
    matchEnd.Event:Wait()
    end
  3. Testuj grę. Potwierdź, że gdy gracze są na arenie, pętla przerwy nie działa. Skrypt jest teraz czekając na sygnał matchEnd do uruchomienia.

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

W tym momencie kod nie działa tak, jak powinien, spróbuj jednej z poniższych opcji.

  • Podwójnie sprawdź użycie operatorów kropki lub kolonki w matchEnd.Event:Wait() .
  • Upewnij się, że MatchEnd jest wydarzeniem dołączalnym, a nie innym wpisywać, takim jak zdalne wydarzenie.

Używanie kalendarza

Jednym z warunków, które skończą związanym z końcem mecze, jest ustawienie timera, które będzie zarządzane poprzez skrypt.

Ustawienie trybu licznika

Aby dodać do grakalendarz, użyj skryptu modułu w krokach poniżej. Zawiera funkcje uruchamiania i kończenia kalendarza, a także powrotu ilości czasu pozostałego.

  1. W SerwerzePrzechowywania >ModuleScripts, utwórz nowy skrypt modułowy nazywający się Timer.

    Zastąp kod poniższym kodem.


    local Timer = {}
    Timer.__index = Timer
    function Timer.new()
    local self = setmetatable({}, Timer)
    self._finishedEvent = Instance.new("BindableEvent")
    self.finished = self._finishedEvent.Event
    self._running = false
    self._startTime = nil
    self._duration = nil
    return self
    end
    function Timer:start(duration)
    if not self._running then
    task.spawn(function()
    self._running = true
    self._duration = duration
    self._startTime = tick()
    while self._running and tick() - self._startTime < duration do
    task.wait()
    end
    local completed = self._running
    self._running = false
    self._startTime = nil
    self._duration = nil
    self._finishedEvent:Fire(completed)
    end)
    else
    warn("Warning: timer could not start again as it is already running.")
    end
    end
    function Timer:getTimeLeft()
    if self._running then
    local now = tick()
    local timeLeft = self._startTime + self._duration - now
    if timeLeft < 0 then
    timeLeft = 0
    end
    return timeLeft
    else
    warn("Warning: could not get remaining time, timer is not running.")
    end
    end
    function Timer:isRunning()
    return self._running
    end
    function Timer:stop()
    self._running = false
    end
    return Timer
  2. W MatchManager wymagaj modułów GameSettings i Timer.


    local MatchManager = {}
    -- Usługi
    local ServerStorage = game:GetService("ServerStorage")
    -- Skripty modułu
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
  3. Poniżej zmienne, utwórz nowy obiekt timera ustawiając zmienną nazyającą się myTimer równą timer.new(). Ten obiekt będzie używany do wzywania funkcji, które uruchamiają i zatrzymują timer.


    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Tworzy nowy obiekt timer, aby używać do śledzenia czasu meczu.
    local myTimer = timer.new()

Początki i Zatrzymywanie

Teraz, gdy stworzono kalendarz, użyj funkcji wbudowanych start() i stop() podczas dopasowywać. Poniżej jest opis każdej funkcji i parametru, który akceptuje.

  • start(time) - Rozpoczyna kalendarz, z czasem w sekundach jako parametr.
  • finished:Connect(functionName) - Gdy skończy się odliczanie, zwraca funkcję jako parametr.
  1. W MatchManager utwórz nową funkcję nazwaną timeUp() , aby zostać uruchomiony za każdym razem, gdy skończy się odliczanie. Zawiera to stwierdzenie drukowania testowego.


    local myTimer = timer.new()
    -- Lokalne funkcje
    local function timeUp()
    print("Time is up!")
    end
    -- Funkcje modułu
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Poniżej timeUp() , dodaj funkcję nazwaną startTimer() z drukową deklaracją. Będziesz wyświetlać timer w grze później.


    -- Lokalne funkcje
    local function timeUp()
    print("Time is up!")
    end
    local function startTimer()
    print("Timer started")
    end
  3. Aby uruchomić i zatrzymać licznik, w startTimer() :

    • Zadzwoń myTimer.start() . Przekaż w gameSettings.matchDuration .
    • Zadzwoń myTimer.finished:Connect() . Przekaż w timeUp() .

    -- Lokalne funkcje
    local function startTimer()
    print("Timer started")
    myTimer:start(gameSettings.matchDuration)
    myTimer.finished:Connect(timeUp)
    end

Rozpoczynanie licznika

Zegar można uruchomić na początku meczu używając wydarzenia Zacznij mecz.

  1. W MatchManager, pod zmienne modułu, tworzyć zmienne, aby przechować katalog wydarzeń, MatchStart i MatchEnd (które są używane w przyszłej lekcji).


    -- Skripty modułu
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Wydarzenia
    local events = ServerStorage:WaitForChild("Events")
    local matchStart = events:WaitForChild("MatchStart")
    local matchEnd = events:WaitForChild("MatchEnd")
    --Tworzy zegar
    local myTimer = timer.new()
  2. Ponad return MatchManager , połącz wydarzenie rozpoczęcia mecze z startTimer() .


    -- Funkcje modułu
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Aby uruchomić wydarzenie startowe meczu, w prepareGame() , wpisz matchStart:Fire() .


    -- Funkcje modułu
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    matchStart:Fire()
    end
  4. Zdobądź dostęp do gra. W oknie wyjścia potwierdź, że możesz zobaczyć drukowane oświadczenia dla funkcji uruchomienia i zatrzymania timer'a.

Ukończone Skrypcity

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

Skrypt MatchManager


local MatchManager = {}
-- Usługi
local ServerStorage = game:GetService("ServerStorage")
-- Skripty modułu
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Wydarzenia
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Tworzy nowy obiekt timer, aby używać do śledzenia czasu meczu.
local myTimer = timer.new()
-- Lokalne funkcje
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
end
-- Funkcje modułu
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager

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"))
-- Wydarzenia
local events = ServerStorage:WaitForChild("Events")
local matchEnd = events:WaitForChild("MatchEnd")
while true do
repeat
task.wait(gameSettings.intermissionDuration)
print("Restarting intermission")
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
-- Placeholder czeka na długość gra.
matchEnd.Event:Wait()
end