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

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

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


    -- Modul-Scripts
    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. Habe das Skript warten, bis das Match-End-Ereignis abgeschlossen ist, bevor es weitergeht. Im Loop , am End , 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()
    -- Der Platzhalter wartet auf die Länge des Spiels.
    matchEnd.Event:Wait()
    end
  3. Teste 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.

  1. In ServerStorage > ModulScripts erstellen Sie ein neues Modulskript namens Timer.

    Ersetzen Sie 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. In MatchManager benötigen Sie die GameSettings und Timer-Module.


    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"))
  3. 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.
  1. 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 Funktionen
    local function timeUp()
    print("Time is up!")
    end
    -- Modul-Funktionen
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. timeUp() , füge eine Funktion namens startTimer() mit einem Print-Ausdruck hinzu. Du wirst den Timer im Spiel später 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() :

    • Rufe myTimer.start() . Pass in gameSettings.matchDuration .
    • Rufen Sie myTimer.finished:Connect() . Pass in timeUp() .

    -- Lokale Funktionen
    local 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.

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


    -- Modul-Funktionen
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Um das Match-Start-Ereignis zu aktivieren, in prepareGame() , tippe matchStart:Fire() .


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


-- Dienste
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Modul-Scripts
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()
-- Der Platzhalter wartet auf die Länge des Spiels.
matchEnd.Event:Wait()
end