Timer und Ereignisse

*Dieser Inhalt wurde mit KI (Beta) übersetzt und kann Fehler enthalten. Um diese Seite auf Englisch zu sehen, klicke hier.

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.

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

  1. In GameManager erstellen Sie Variablen für den Ordner Events und das Ereignis MatchEnd.


    -- Modul-Skripte
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Ereignisse
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
  2. 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 do
    repeat
    task.wait(gameSettings.intermissionDuration)
    print("Restarting intermission")
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    -- Platzhalter warten auf die Länge des Spiels.
    matchEnd.Event:Wait()
    end
  3. Teste 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.

  1. In ServerStorage > ModuleScripts erstellen Sie ein neues Modulskript mit dem Namen Timer.

    Ersetze den Code durch den Code unten.


    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. Im MatchManager erfordern die GameSettings- und Timer-Module.


    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"))
  3. 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.
  1. 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 Funktionen
    local function timeUp()
    print("Time is up!")
    end
    -- Modulfunktionen
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Unter 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 Funktionen
    local function timeUp()
    print("Time is up!")
    end
    local function startTimer()
    print("Timer started")
    end
  3. Um 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 Funktionen
    local 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.

  1. 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-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 Timer
    local myTimer = timer.new()
  2. Über return MatchManager , verbinde das Match-Start-Ereignis mit startTimer() .


    -- Modulfunktionen
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Um das Match-Start-Ereignis abzufeuern, geben Sie in prepareGame() , type matchStart:Fire() .


    -- Modulfunktionen
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    matchStart:Fire()
    end
  4. Teste 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


-- Dienste
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Modul-Skripte
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Ereignisse
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()
-- Platzhalter warten auf die Länge des Spiels.
matchEnd.Event:Wait()
end