Während des Kurses einer Runde müssen die Skripte die Zeit verfolgen und Signale zwischen verschiedenen Skripts senden. Die Zeit wird mit einem Skript, das. PL: die Skriptsverwaltet, während Ereignisse, ein Konzept in Roblox-Programmierung, Signale wie das Ende eines übereinstimmensenden.
Senden von Signalen mit Ereignissen
Mit Spielern, die jetzt in der Arena sind, können Ereignisse verwendet werden, um den Start des Spiels zu signalisieren, und der Code für den Timer kann beginnen. Später kann auch ein Ereignis verwendet werden, um das Ende des übereinstimmenzu signalisieren, und dass es Zeit ist, die Spieler zurück in die Lobby zu übertragen.
Diese Ereignisse sind nicht vordefiniert, so dass benutzerdefinierte Ereignis-Objekte namens Bindbare Ereignisse erstellt werden müssen. Bindbare Ereignisse werden oft für Spieler-feuer-Aktionen verwendet und ähneln Ereignissen wie Touched oder Changed.
Mehrere Skripte können auf die gleichen baubaren Ereignisse hören. Dies hält Ihren Code organisiert und macht es einfacher, später bei Bedarf zusätzlichen Code für den Start oder das Ende des Matches hinzuzufügen.
Bindbare Ereignisse erstellen
Beginnen Sie mit der Erstellung von bindbaren Ereignisobjekten für den Start und das Ende des übereinstimmen. Da bindbare Ereignisse nicht mit dem Client interagieren, können sie in Server-Storage gespeichert werden.
In ServerStorage erstellen Sie einen neuen Ordner namens Events. In diesem Ordner erstellen Sie zwei BindbareEvents mit dem Namen MatchStart und MatchEnd.
Verwendung von Ereignissen
Derzeit, wenn Spieler die Arena betreten, wird die Pause neu gestartet, anstatt den Timer zu starten. Der Hauptspiel-Loop muss gesagt werden, dass er aufgehört und warten muss, bis das MatchEnd-Ereignis abgefeuert wird, bevor er zum nächsten Teil des Codes fortgeschritten wird.
Ereignisse haben zwei integrierte Funktionen: Connect() und Wait(). Statt Connect() wie zuvor verwenden Sie 2>Wait2> auf MatchEnd, um das Spiel-Manager-Skript bis zum MatchEnd zu pausieren. In diesem Fall unterbricht die Warte-Funktion die Code, bis der Spiel-Manager-Skript bis zum MatchEnd erhalten hat.
In GameManager erstellen Sie Variablen für den Events-Ordner und das MatchEnd-Ereignis.
-- Modul-Scriptslocal 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")Habe das Skript warten, bis das Match-End-Ereignis abgeschlossen ist, bevor es weitergeht. Im Loop , am End , 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()-- Der Platzhalter wartet auf die Länge des Spiels.matchEnd.Event:Wait()endTeste das Spiel. Bestätige, dass einmal Spieler in der Arena sind, der Pause-Loop nicht weitergeht. Das Skript wartet jetzt auf das Signal matchEnd , um zu initiieren.
Troubleshooting-Tipps
An diesem Punkt funktioniert der Code nicht wie erwartet, versuchen Sie einen der folgenden unten.
- Überprüfen Sie die Verwendung von Punkt- oder Colon-Betreibern in matchEnd.Event:Wait() .
- Stellen Sie sicher, dass MatchEnd ein BindbaresEreignis ist, und nicht ein anderes eingeben, wie ein RemoteEreignis.
Verwendung eines Tinners
Eine der Bedingungen, die das Ende des Spiels verursachen wird, ist ein Timer, der läuft, der wird durch das Skript, das. PL: die Skriptsbehandelt.
Timer einrichten
Um dem Spiel ein Timer hinzuzufügen, verwende das vordefinierte Modul-Skript in den Schritten unten. Es enthält Funktionen, um einen Timer zu starten und zu beenden, sowie die Rückgabe der verbleibenden Zeit.
In ServerStorage > ModulScripts erstellen Sie ein neues Modulskript namens Timer.
Ersetzen Sie 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 TimerIn MatchManager benötigen Sie die GameSettings und Timer-Module.
local MatchManager = {}-- Dienstelocal ServerStorage = game:GetService("ServerStorage")-- Modul-Scriptslocal 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, erstellen Sie ein neues Timer-Objekt, indem Sie eine Variable namens myTimer ähnlich ist timer.new() . 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 Match-Zeit zu verfolgen.local myTimer = timer.new()
Starten und Stoppen
Jetzt, da ein Timer erstellt ist, verwenden Sie die inklusiven Funktionen start() und stop() während eines übereinstimmen. Die Beschreibung jedes Funktions und des zu akzeptierenden Paramètres ist unten.
- start(time) - Startet den Timer, mit Zeit in Sekunden als Parameter.
- finished:Connect(functionName) - Wenn der Timer fertig ist, wird die Funktion als Parameter zurückgegeben.
In MatchManager erstellen Sie eine neue Funktion namens timeUp() , um immer zu laufen, wenn der Timer fertig ist. Fügen Sie einen Test-Print-Zeichen hinzu.
local myTimer = timer.new()-- Lokale Funktionenlocal function timeUp()print("Time is up!")end-- Modul-Funktionenfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagertimeUp() , füge eine Funktion namens startTimer() mit einem Print-Ausdruck hinzu. Du wirst den Timer im Spiel später 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() :
- Rufe myTimer.start() . Pass in gameSettings.matchDuration .
- Rufen Sie myTimer.finished:Connect() . Pass in timeUp() .
-- Lokale Funktionenlocal function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)end
Timer starten
Der Timer kann am Beginn eines Matches mit dem Match-Start-Ereignis ausgelöst werden.
In MatchManager, unter den Modul- Variablen, erstellen Sie Variablen, um den Events-Ordner, MatchStart und MatchEnd zu speichern (der in einer zukünftigen Lektion verwendet wird).
-- Modul-Scriptslocal 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 , verbinden Sie das Match-Start-Ereignis mit startTimer() .
-- Modul-Funktionenfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerUm das Match-Start-Ereignis zu aktivieren, in prepareGame() , tippe matchStart:Fire() .
-- Modul-Funktionenfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endTesten Sie das Spiel. Im Ausgabe-Fenster bestätigen Sie, dass Sie die druckenden Anweisungen für die Start- und Stoppfunktionen des Tinners sehen können.
Abgeschlossene Skripte
Dies sind abgeschlossene Skripte, um deine Arbeit zu überprüfen.
MatchManager-Skript
local MatchManager = {}
-- Dienste
local ServerStorage = game:GetService("ServerStorage")
-- Modul-Scripts
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 Match-Zeit 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
-- Modul-Funktionen
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
GameManager-Skript
-- Dienstelocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Modul-Scriptslocal 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()-- Der Platzhalter wartet auf die Länge des Spiels.matchEnd.Event:Wait()end