Durante el curso de una ronda, los scripts deberán rastrear el tiempo y enviar señales entre diferentes scripts.El tiempo se gestionará usando un script de tiempo, mientras que los eventos, un concepto en la programación de Roblox, señalarán cambios como el fin de una coincidir.
Enviar señales con eventos
Con los jugadores ahora en la arena, los eventos se pueden utilizar para señalar el comienzo del partido y el código para el temporizador puede comenzar.Más tarde, un evento también se puede utilizar para señalar el final del coincidiry que es hora de transitar los jugadores de vuelta al vestíbulo.
Estos eventos no se preconstruyen, por lo que se deberán crear objetos de evento personalizados llamados eventos vinculables .Los eventos vinculables se utilizan a menudo para acciones disparadas por el jugador y son similares a eventos como Touched o Changed .
Múltiples scripts pueden escuchar los mismos eventos vinculables.Esto mantiene tu código organizado y facilita agregar código adicional para el comienzo o el final del partido más tarde, si es necesario.
Crear eventos vinculables
Empieza creando objetos de evento vinculables para el comienzo y el final del coincidir.Dado que los eventos vinculables no interactúan con el cliente, se pueden almacenar en el almacenamiento del servidor.
En ServerStorage, crea una nueva carpeta llamada Eventos. En esa carpeta, crea dos eventos vinculables llamados MatchStart y MatchEnd.
Utilizar eventos
En este momento, cuando los jugadores ingresan a la arena, la intermisión sigue reiniciándose en lugar de comenzar el temporizador.El ciclo de juego principal debe ser informado para detenerse y esperar hasta que se active el evento MatchEnd antes de pasar a la siguiente parte del código.
Los eventos tienen dos funciones integradas: Connect() y Wait() .En lugar de usar Connect() como antes, llama a Wait() en MatchEnd para pausar el script del administrador del juego hasta que se active MatchEnd.En este caso, la función de espera pausa el código hasta que el administrador del juego reciba una señal de que la partida terminó.
En GameManager , crea variables para la carpeta Events y el evento MatchEnd.
-- Scripts de módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Eventoslocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")Haga que el script espere el evento de final de partido para disparar antes de seguir adelante. En el bucle , en el final , introducir: 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()-- Espera de marcador de posición para la duración del juego.matchEnd.Event:Wait()endPrueba el juego.Confirma que una vez que los jugadores estén en la arena, el bucle de intermisión no continúa .El script ahora está esperando a que se desencadenarla señal matchEnd.
Consejos de solución de problemas
En este punto, el código no funciona como se esperaba, prueba uno de los siguientes a continuación.
- Revisa doblemente el uso de los operadores punto o colon en matchEnd.Event:Wait() .
- Asegúrese de que MatchEnd sea un evento vinculable, y no otro introducir, como un evento remoto.
Usa un temporizador
Una de las condiciones que causará el fin del partido es un temporizador que se agota, que se manejará a través del script.
Configura el temporizador
Para agregar un temporizador al juego, use el guión de módulo prefabricado en los pasos a continuación.Incluye funciones para iniciar y finalizar un temporizador, así como para devolver la cantidad de tiempo restante.
En ServerStorage > ModuleScripts, crea un nuevo script de módulo llamado Timer.
Reemplace el código con el código siguiente.
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 TimerEn MatchManager, requiere los módulos GameSettings y Timer.
local MatchManager = {}-- Servicioslocal ServerStorage = game:GetService("ServerStorage")-- Scripts de módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))Debajo de las variables, crea un nuevo objeto de temporizador al establecer una variable llamada myTimer igual a timer.new().Este objeto se usará para llamar funciones que inicien y detengan el temporizador.
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Crea un nuevo objeto de temporizador para usar para rastrear el tiempo de la partida.local myTimer = timer.new()
Iniciar y detener
Ahora que se ha creado un temporizador, utilice las funciones incluidas start() y stop() durante una coincidir.A continuación se describe cada función y el parámetro que acepta.
- start(time) - Inicia el temporizador, con tiempo en segundos como parámetro.
- finished:Connect(functionName) - Cuando termina el temporizador, se ejecuta la función pasada como parámetro.
En MatchManager , crea una nueva función llamada timeUp() para ejecutarse cada vez que termine el temporizador. Incluye una declaración de impresión de prueba.
local myTimer = timer.new()-- Funciones localeslocal function timeUp()print("Time is up!")end-- Funciones de módulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerDebajo de timeUp(), agrega una función llamada startTimer() con una declaración de impresión. Mostrarás el temporizador en el juego más tarde.
-- Funciones localeslocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endPara iniciar y detener el temporizador, en startTimer() :
- Llama myTimer.start() . Pasa en gameSettings.matchDuration .
- Llama myTimer.finished:Connect() . Pasa en timeUp() .
-- Funciones localeslocal function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)end
Inicia el temporizador
El temporizador se puede activar al comienzo de una partida usando el evento de inicio de partido.
En MatchManager, bajo las variables del módulo, crea variables para almacenar la carpeta de eventos, MatchStart y MatchEnd (que se usa en una lección futura).
-- Scripts de módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Eventoslocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")local matchEnd = events:WaitForChild("MatchEnd")--Crea un temporizadorlocal myTimer = timer.new()Por encima de return MatchManager, conecta el evento de inicio de la coincidencia a startTimer().
-- Funciones de módulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerPara disparar el evento de inicio de la partida, en prepareGame(), escriba matchStart:Fire().
-- Funciones de módulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endPrueba el juego. En la ventana de salida, confirma que puedes ver las declaraciones de impresión para las funciones de inicio y de parada del temporizador.
Guiones completados
A continuación, se completan los scripts para verificar doblemente tu trabajo.
Guión scriptMatchManager
local MatchManager = {}
-- Servicios
local ServerStorage = game:GetService("ServerStorage")
-- Scripts de módulo
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Eventos
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Crea un nuevo objeto de temporizador para usar para rastrear el tiempo de la partida.
local myTimer = timer.new()
-- Funciones locales
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
end
-- Funciones de módulo
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
scriptdel administrador del juego
-- Servicioslocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Scripts de módulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Eventoslocal 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()-- Espera de marcador de posición para la duración del juego.matchEnd.Event:Wait()end