Temporizadores y eventos

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

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.

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

  1. En GameManager , crea variables para la carpeta Events y el evento MatchEnd.


    -- Scripts de módulo
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Eventos
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
  2. 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 do
    repeat
    task.wait(gameSettings.intermissionDuration)
    print("Restarting intermission")
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    -- Espera de marcador de posición para la duración del juego.
    matchEnd.Event:Wait()
    end
  3. Prueba 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.

  1. 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 = 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. En MatchManager, requiere los módulos GameSettings y Timer.


    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"))
  3. 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.
  1. 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 locales
    local function timeUp()
    print("Time is up!")
    end
    -- Funciones de módulo
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Debajo 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 locales
    local function timeUp()
    print("Time is up!")
    end
    local function startTimer()
    print("Timer started")
    end
  3. Para iniciar y detener el temporizador, en startTimer() :

    • Llama myTimer.start() . Pasa en gameSettings.matchDuration .
    • Llama myTimer.finished:Connect() . Pasa en timeUp() .

    -- Funciones locales
    local 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.

  1. 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ó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 temporizador
    local myTimer = timer.new()
  2. Por encima de return MatchManager, conecta el evento de inicio de la coincidencia a startTimer().


    -- Funciones de módulo
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Para disparar el evento de inicio de la partida, en prepareGame(), escriba matchStart:Fire().


    -- Funciones de módulo
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    matchStart:Fire()
    end
  4. Prueba 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


-- Servicios
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Scripts de módulo
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Eventos
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()
-- Espera de marcador de posición para la duración del juego.
matchEnd.Event:Wait()
end