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.
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é.
Dans GameManager , créez des variables pour le dossier Events et l'événement MatchEnd.
-- Scripts de modulelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Événementslocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")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 dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Attente de placeholder pour la longueur du jeu.matchEnd.Event:Wait()endTester 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.
Dans ServerStorage > ModuleScripts, créez un nouveau script de module nommé Timer.
Remplacez le code par le code ci-dessous.
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 TimerDans MatchManager, exigez les modules GameSettings et Timer.
local MatchManager = {}-- Serviceslocal ServerStorage = game:GetService("ServerStorage")-- Scripts de modulelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))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.
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 localeslocal function timeUp()print("Time is up!")end-- Fonctions de modulefunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerEn 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 localeslocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endPour démarrer et arrêter la minuterie, dans startTimer() :
- Appellez myTimer.start(). Transmettez gameSettings.matchDuration.
- Appellez myTimer.finished:Connect(). Transmettez timeUp().
-- Fonctions localeslocal 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.
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 modulelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Événementslocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")local matchEnd = events:WaitForChild("MatchEnd")--Crée une minuterielocal myTimer = timer.new()Au-dessus de return MatchManager, connectez l'événement de début du match à startTimer().
-- Fonctions de modulefunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerPour déclencher l'événement de début du match, dans prepareGame(), tapez matchStart:Fire().
-- Fonctions de modulefunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endTestez 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
-- Serviceslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Scripts de modulelocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Événementslocal 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()-- Attente de placeholder pour la longueur du jeu.matchEnd.Event:Wait()end