Temporisateurs et événements

*Ce contenu est traduit en utilisant l'IA (Beta) et peut contenir des erreurs. Pour consulter cette page en anglais, clique ici.

Pendant le cours d'une ronde, les scripts devront suivre le temps et envoyer des signaux entre différents scripts.Le temps sera géré à l'aide d'un script de temps, tandis que les événements, un concept dans le codage Roblox, signaleront des changements tels que la fin d'un correspondre.

Envoyer des signaux avec des événements

Avec les joueurs maintenant dans l'arène, les événements peuvent être utilisés pour signaler le début du match et le code pour le minuteur peut commencer.Plus tard, un événement peut également être utilisé pour signaler la fin du correspondreet qu'il est temps de transférer les joueurs de retour dans le lobby.

Ces événements ne sont pas préfabriqués, donc des objets d'événement personnalisés appelés événements liables devront être créés.Les événements bindables sont souvent utilisés pour des actions déclenchées par le joueur et sont similaires à des événements comme Touched ou Changed .

Plusieurs scripts peuvent écouter les mêmes événements bindables.Cela garde votre code organisé et facilite l'ajout de code supplémentaire pour le début ou la fin du match plus tard, si nécessaire.

Créer des événements liés créables

Commencez par créer des objets d'événement bindables pour le début et la fin du correspondre.Puisque les événements bindables ne communiquent pas avec le client, ils peuvent être stockés dans le stockage du serveur.

  1. Dans ServerStorage, créez un nouveau dossier nommé Événements. Dans ce dossier, créez deux Événements liables nommés MatchStart et MatchEnd.

Utiliser des événements

En ce moment, lorsque les joueurs entrent dans l'arène, l'intermission redémarre sans cesse plutôt que de commencer le minutage.La boucle de jeu principale doit être dite pour s'arrêter et attendre jusqu'à ce que l'événement MatchEnd se déclenche avant de passer à la partie suivante du code.

Les événements ont deux fonctions intégrées : Connect() et Wait() .Au lieu d'utiliser Connect() comme précédemment, appelez Wait() sur MatchEnd pour mettre en pause le script du gestionnaire de jeu jusqu'à ce que MatchEnd soit tiré.Dans ce cas, la fonction d'attente met en pause le code jusqu'à ce que le gestionnaire du jeu reçoive un signal indiquant que le match s'est terminé.

  1. Dans GameManager , créez des variables pour le dossier Events et l'événement MatchEnd.


    -- Scripts de module
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Événements
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
  2. Faites en sorte que le script attende l'événement de fin du match pour tirer avant de passer à la suite. Dans le boucle , à la fin , taper:


    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()
    -- Attente de placeholder pour la longueur du jeu.
    matchEnd.Event:Wait()
    end
  3. Tester le jeu.Confirmez que une fois que les joueurs sont dans l'arène, la boucle d'intermission ne se poursuit pas .Le script attend maintenant le signal matchEnd pour lancer.

Conseils de dépannage

À ce stade, le code ne fonctionne pas comme prévu, essayez l'une des options suivantes.

  • Doublez la vérification de l'utilisation des opérateurs point ou colonne dans matchEnd.Event:Wait() .
  • Assurez-vous que MatchEnd est un événement bindable, et non pas un autre taper, comme un événement distant.

Utiliser un minuterie

Une des conditions qui provoquera la fin du match est l'expiration d'un minuterie, qui sera gérée via le script.

Configurer la minuterie

Pour ajouter une minuterie dans le jeu, utilisez le script de module prédéfini dans les étapes ci-dessous.Il inclut des fonctions pour démarrer et terminer un minuterie, ainsi que pour retourner la quantité de temps restant.

  1. Dans ServerStorage > ModuleScripts, créez un nouveau script de module nommé Timer.

    Remplacez le code par le code ci-dessous.


    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. Dans MatchManager, exigez les modules GameSettings et Timer.


    local MatchManager = {}
    -- Services
    local ServerStorage = game:GetService("ServerStorage")
    -- Scripts de module
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
  3. En dessous des variables, créez un nouvel objet de minuterie en définissant une variable nommée myTimer égale à timer.new().Cet objet sera utilisé pour appeler des fonctions qui démarreront et arrêteront le minuteur.


    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Crée un nouvel objet de minuterie à utiliser pour suivre le temps du match.
    local myTimer = timer.new()

Démarrer et arrêter

Maintenant qu'un minuterie est créée, utilisez les fonctions incluses start() et stop() pendant un correspondre.Ci-dessous est une description de chaque fonction et du paramètre qu'elle accepte.

  • start(time) - Démarrage de la minuterie, avec le temps en secondes comme paramètre.
  • finished:Connect(functionName) - Lorsque le minuteur se termine, exécute la fonction transmise en tant que paramètre.
  1. Dans MatchManager , créez une nouvelle fonction nommée timeUp() pour exécuter chaque fois que le minuteur est terminé. Incluez une déclaration d'impression de test.


    local myTimer = timer.new()
    -- Fonctions locales
    local function timeUp()
    print("Time is up!")
    end
    -- Fonctions de module
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. En dessous de timeUp(), ajoutez une fonction nommée startTimer() avec une déclaration d'impression. Vous afficherez le minuterie dans le jeu plus tard.


    -- Fonctions locales
    local function timeUp()
    print("Time is up!")
    end
    local function startTimer()
    print("Timer started")
    end
  3. Pour démarrer et arrêter la minuterie, dans startTimer() :

    • Appellez myTimer.start(). Transmettez gameSettings.matchDuration.
    • Appellez myTimer.finished:Connect(). Transmettez timeUp().

    -- Fonctions locales
    local function startTimer()
    print("Timer started")
    myTimer:start(gameSettings.matchDuration)
    myTimer.finished:Connect(timeUp)
    end

Démarrez la minuterie

Le minuteur peut être déclenché au début d'un match en utilisant l'événement de début de match.

  1. Dans MatchManager, sous les variables de module, créez des variables pour stocker le dossier Événements, MatchStart et MatchEnd (qui est utilisé dans une leçon future).


    -- Scripts de module
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Événements
    local events = ServerStorage:WaitForChild("Events")
    local matchStart = events:WaitForChild("MatchStart")
    local matchEnd = events:WaitForChild("MatchEnd")
    --Crée une minuterie
    local myTimer = timer.new()
  2. Au-dessus de return MatchManager, connectez l'événement de début du match à startTimer().


    -- Fonctions de module
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Pour déclencher l'événement de début du match, dans prepareGame(), tapez matchStart:Fire().


    -- Fonctions de module
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    matchStart:Fire()
    end
  4. Testez le jeu. Dans la fenêtre de sortie, confirmez que vous pouvez voir les déclarations d'impression pour les fonctions de démarrage et d'arrêt du minuterie.

Scripts terminés

Ci-dessous, les scripts terminés pour vérifier à nouveau votre travail.

scriptde MatchManager


local MatchManager = {}
-- Services
local ServerStorage = game:GetService("ServerStorage")
-- Scripts de module
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Événements
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Crée un nouvel objet de minuterie à utiliser pour suivre le temps du match.
local myTimer = timer.new()
-- Fonctions locales
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
end
-- Fonctions de module
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager

scriptdu gestionnaire de jeu


-- Services
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Scripts de module
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Événements
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()
-- Attente de placeholder pour la longueur du jeu.
matchEnd.Event:Wait()
end