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.
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
W GAMEManager twórz zmienne dla katalogu Events i wydarzenia MatchEnd.
-- Skripty modułulocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Wydarzenialocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")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 dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Placeholder czeka na długość gra.matchEnd.Event:Wait()endTestuj 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.
W SerwerzePrzechowywania >ModuleScripts, utwórz nowy skrypt modułowy nazywający się Timer.
Zastąp kod poniższym kodem.
local Timer = {}Timer.__index = Timerfunction Timer.new()local self = setmetatable({}, Timer)self._finishedEvent = Instance.new("BindableEvent")self.finished = self._finishedEvent.Eventself._running = falseself._startTime = nilself._duration = nilreturn selfendfunction Timer:start(duration)if not self._running thentask.spawn(function()self._running = trueself._duration = durationself._startTime = tick()while self._running and tick() - self._startTime < duration dotask.wait()endlocal completed = self._runningself._running = falseself._startTime = nilself._duration = nilself._finishedEvent:Fire(completed)end)elsewarn("Warning: timer could not start again as it is already running.")endendfunction Timer:getTimeLeft()if self._running thenlocal now = tick()local timeLeft = self._startTime + self._duration - nowif timeLeft < 0 thentimeLeft = 0endreturn timeLeftelsewarn("Warning: could not get remaining time, timer is not running.")endendfunction Timer:isRunning()return self._runningendfunction Timer:stop()self._running = falseendreturn TimerW MatchManager wymagaj modułów GameSettings i Timer.
local MatchManager = {}-- Usługilocal ServerStorage = game:GetService("ServerStorage")-- Skripty modułulocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))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.
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 funkcjelocal function timeUp()print("Time is up!")end-- Funkcje modułufunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerPoniżej timeUp() , dodaj funkcję nazwaną startTimer() z drukową deklaracją. Będziesz wyświetlać timer w grze później.
-- Lokalne funkcjelocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endAby uruchomić i zatrzymać licznik, w startTimer() :
- Zadzwoń myTimer.start() . Przekaż w gameSettings.matchDuration .
- Zadzwoń myTimer.finished:Connect() . Przekaż w timeUp() .
-- Lokalne funkcjelocal 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.
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łulocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Wydarzenialocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")local matchEnd = events:WaitForChild("MatchEnd")--Tworzy zegarlocal myTimer = timer.new()Ponad return MatchManager , połącz wydarzenie rozpoczęcia mecze z startTimer() .
-- Funkcje modułufunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerAby uruchomić wydarzenie startowe meczu, w prepareGame() , wpisz matchStart:Fire() .
-- Funkcje modułufunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endZdobą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ługilocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skripty modułulocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Wydarzenialocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Placeholder czeka na długość gra.matchEnd.Event:Wait()end