Während einer Runde müssen die Skripte die Zeit verfolgen und Signale zwischen verschiedenen Skripten senden.Die Zeit wird mit einem Skript, das. PL: die Skriptsverwaltet, während Ereignisse, ein Konzept in Roblox-Programmierung, Änderungen wie das Ende eines übereinstimmensignalisieren.
Sende Signale mit Ereignissen
Mit Spielern in der Arena können Ereignisse verwendet werden, um den Beginn des Spiels und den Code für den Timer anzukündigen.Später kann ein Ereignis auch verwendet werden, um das Ende des übereinstimmenzu signalisieren und dass es Zeit ist, Spieler zurück in die Lobby zu überführen.
Diese Ereignisse sind nicht vorgefertigt, sodass benutzerdefinierte Ereignisobjekte namens bindbare Ereignisse erstellt werden müssen.Bindbare Ereignisse werden oft für vom Spieler ausgelöste Aktionen verwendet und sind ähnlich wie Ereignisse wie Touched oder Changed.
Mehrere Skripte können auf die gleichen bindbaren Ereignisse hören.Dies hält deinen Code organisiert und erleichtert es, zusätzlichen Code für den Beginn oder das Ende des Spiels später hinzuzufügen, wenn er benötigt wird.
Erstelle bindbare Ereignisse
Beginne, indem du bindbare Ereignisobjekte für den Anfang und das Ende des übereinstimmenerstellst.Da bindbare Ereignisse nicht mit dem Client interagieren, können sie im Server-Speicher gespeichert werden.
Erstellen Sie in ServerStorage einen neuen Ordner mit dem Namen Events. In diesem Ordner erstellen Sie zwei BindbareEvents mit den Namen MatchStart und MatchEnd.
Verwende Ereignisse
Im Moment, wenn Spieler die Arena betreten, wird die Pause immer wieder neu gestartet, anstatt den Timer zu starten.Die Hauptspielschleife muss gesagt werden, um zu stoppen und zu warten, bis das Ereignis MatchEnd ausgelöst wird, bevor sie zum nächsten Teil des Codes übergeht.
Ereignisse haben zwei integrierte Funktionen: Connect() und Wait().Anstatt wie zuvor Connect() zu verwenden, rufe Wait() auf MatchEnd auf, um das Spielmanagerskript bis zum Auslösen von MatchEnd zu pausieren.In diesem Fall pausiert die Wartefunktion den Code, bis der Spielmanager ein Signal erhält, dass das Spiel beendet ist.
In GameManager erstellen Sie Variablen für den Ordner Events und das Ereignis MatchEnd.
-- Modul-Skriptelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Ereignisselocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")Lassen Sie das Skript warten, bis das Match-End-Ereignis abgefeuert wird, bevor Sie fortfahren. Im Loop , am Ende , geben Sie eingeben: 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()-- Platzhalter warten auf die Länge des Spiels.matchEnd.Event:Wait()endTeste das Spiel.Bestätigen Sie, dass sobald Spieler in der Arena sind, die Pause-Schleife nicht fortgesetzt wird.Das Skript wartet jetzt auf das matchEnd Signal, um zu initiieren.
Problemlösungstipps
An diesem Punkt funktioniert der Code nicht wie erwartet, versuche eines der folgenden Optionen.
- Überprüfe die Verwendung der Punktoperatoren oder Kolonnenoperatoren in matchEnd.Event:Wait() .
- Stellen Sie sicher, dass MatchEnd ein BindbaresEreignis ist und nicht eine andere eingeben, wie ein RemoteEreignis.
Verwende einen Timer
Eine der Bedingungen, die zum Ende des Spiels führen wird, ist ein abgelaufener Timer, der durch das Skript, das. PL: die Skriptsbehandelt wird.
Stelle den Timer ein
Um einen Timer in das Spiel einzufügen, verwende das vordefinierte Modulskript in den folgenden Schritten.Es enthält Funktionen zum Starten und Beenden eines T timers, sowie zur Rückgabe der verbleibenden Zeit.
In ServerStorage > ModuleScripts erstellen Sie ein neues Modulskript mit dem Namen Timer.
Ersetze den Code durch den Code unten.
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 TimerIm MatchManager erfordern die GameSettings- und Timer-Module.
local MatchManager = {}-- Dienstelocal ServerStorage = game:GetService("ServerStorage")-- Modul-Skriptelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))Unter den Variablen erstellt du ein neues Timer-Objekt, indem du eine Variable mit dem Namen myTimer festlegst, die gleich timer.new() ist.Dieses Objekt wird verwendet, um Funktionen aufzurufen, die den Timer starten und stoppen.
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Erstellt ein neues Timer-Objekt, das verwendet wird, um die Spielzeit zu verfolgen.local myTimer = timer.new()
Starten und stoppen
Nun, da ein Timer erstellt wurde, verwende die enthaltenen Funktionen start() und stop() während eines übereinstimmen.Im Folgenden finden Sie eine Beschreibung jeder Funktion und der Parameter, die sie akzeptiert.
- start(time) - Startet den Timer mit Zeit in Sekunden als Parameter.
- finished:Connect(functionName) - Wenn der Timer beendet wird, wird die Funktion als Parameter übergeben ausgeführt.
In MatchManager , erstelle eine neue Funktion mit dem Namen timeUp(), die immer ausgeführt wird, wenn der Timer abgelaufen ist. Füge eine Testdruck-Anweisung hinzu.
local myTimer = timer.new()-- Lokale Funktionenlocal function timeUp()print("Time is up!")end-- Modulfunktionenfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerUnter timeUp() , füge eine Funktion mit dem Namen startTimer() hinzu, die eine Druckausgabe enthält. Du wirst den Timer später im Spiel anzeigen.
-- Lokale Funktionenlocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endUm den Timer zu starten und zu stoppen, in startTimer() :
- Rufen Sie myTimer.start() . Passen Sie in gameSettings.matchDuration .
- Rufen Sie myTimer.finished:Connect() . Passen Sie in timeUp() .
-- Lokale Funktionenlocal function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)end
Starte den Timer
Der Timer kann am Beginn eines Spiels ausgelöst werden, indem das Ereignis Spielbeginn verwendet wird.
Erstelle in MatchManager unter den Modulvariablen Variablen, um den Ordner Veranstaltungen, Matchstart und Matchende (der in einer zukünftigen Lektion verwendet wird) zu speichern.
-- Modul-Skriptelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Ereignisselocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")local matchEnd = events:WaitForChild("MatchEnd")--Erstellt Timerlocal myTimer = timer.new()Über return MatchManager , verbinde das Match-Start-Ereignis mit startTimer() .
-- Modulfunktionenfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerUm das Match-Start-Ereignis abzufeuern, geben Sie in prepareGame() , type matchStart:Fire() .
-- Modulfunktionenfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endTeste das Spiel. Bestätige im Ausgabe-Fenster, dass du die Druckausdrücke für die Start- und Stopp-Funktionen des Timers sehen kannst.
Abgeschlossene Skripte
Im Folgenden sind abgeschlossene Skripte, um deine Arbeit zu überprüfen.
Skript, das. PL: die Skripts
local MatchManager = {}
-- Dienste
local ServerStorage = game:GetService("ServerStorage")
-- Modul-Skripte
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Ereignisse
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Erstellt ein neues Timer-Objekt, das verwendet wird, um die Spielzeit zu verfolgen.
local myTimer = timer.new()
-- Lokale Funktionen
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
end
-- Modulfunktionen
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
Skript, das. PL: die Skripts
-- Dienstelocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Modul-Skriptelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Ereignisselocal 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()-- Platzhalter warten auf die Länge des Spiels.matchEnd.Event:Wait()end