Tadores 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 transcurso de una ronda, los scripts necesitarán rastrear el tiempo y enviar señales entre diferentes scripts. El tiempo se gestionará utilizando un script de tiempo, mientras que los eventos, un concepto en el código de Roblox, enviarán señales como el final de un coincidir.

Enviando señales con eventos

Con los jugadores ahora en la arena, los eventos se pueden usar para señalar el comienzo de la partida y el código para el temporizador se puede comenzar. Luego, un evento también se puede usar para señalar el final de la coincidir, y que es hora de devolver los jugadores a la sala de espera.

Estos eventos no están preconstruidos, por lo que los objetos de eventos personalizados llamados objetos de eventos vinculables necesitarán ser creados. Los eventos vinculables a menudo se utilizan para acciones de jugadores 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 hace más fácil agregar código adicional para el comienzo o final de la partida si es necesario.

Crear Eventos Vinculables

Comienza creando objetos de evento vinculables para el inicio y el final de la 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 Events. En esa carpeta, crea dos Eventos vinculables llamados MatchStart y MatchEnd.

Usando eventos

Ahora mismo, cuando los jugadores ingresan a la arena, la intermisión se reinicia en lugar de comenzar el temporizador. La principal ronda de juego necesita ser告诉停止 y esperar hasta que se ejecute el evento MatchEnd antes de seguir adelante con la siguiente parte del código.

Los eventos tienen dos funciones incrustadas: Connect() y Wait(). En lugar de usar Connect() como antes, llama 2>Wait2> en MatchEnd para pausar el script del administrador del juego hasta que se ejecute el lanzamiento. En este caso, la función de espera pausa el código hasta que el administrador del juego recibe una señal de que el lanzamiento ha terminado.

  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. Tenga el script esperando para que se ejecute el evento de finalización de la coincidencia antes de seguir adelante. En el loop , en el end, 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()
    -- El marcador espera por la longitud del juego.
    matchEnd.Event:Wait()
    end
  3. Prueba el juego. Confirma que una vez que los jugadores estén en la arena, la interrupción de la intermedio no continúa. El script ahora está esperando la señal de salida matchEnd para desencadenar.

Consejos de solución de problemas

En este punto, el código no funciona como debería, intenta uno de los siguientes abajo.

  • Revise dos veces el uso de los operadores de punto o colon en matchEnd.Event:Wait() .
  • Asegúrese de que MatchEnd sea un BindableEvent, no otro introducir, como un RemoteEvent.

Usando un temporizador

Una de las condiciones que causará el final de la partida es un temporizador que se acaba, que se manejará a través del script.

Configurando el temporizador

Para agregar un temporizador al juego, use el script de módulo predeterminado en los pasos a continuación. Incluye funciones para iniciar y terminar un temporizador, así como返回剩余的时间。

  1. En ServerStorage >ModuleScripts, crea un nuevo módulo de script llamado Timer.

    Reemplace el código con el código a continuación.


    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, cree un nuevo objeto de temporizador al establecer una variable llamada myTimer que es igual a timer.new() . Este objeto se usará para llamar funciones que inician y terminan el temporizador.


    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Crea un nuevo objeto de tiempo para usarlo para rastrear el tiempo de la partida.
    local myTimer = timer.new()

Iniciando y Parando

Ahora que se crea un temporizador, usa las funciones incluidas start() y stop() durante una coincidir. Abajo está una descripción de cada función y el parámetro que acepta.

  • start(time) - Inicia el temporizador, con el tiempo en segundos como parámetro.
  • finished:Connect(functionName) - Cuando el temporizador termina, se ejecuta la función pasada como parámetro.
  1. En MatchManager , crea una nueva función llamada timeUp() para que se ejecute cuando el temporizador se haya acabado. Include una declaració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() :

    • Llamar myTimer.start() . Pasar en gameSettings.matchDuration .
    • Llamar myTimer.finished:Connect() . Pasar en timeUp() .

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

Comenzando el temporizador

El temporizador se puede activar al comienzo de un partido utilizando el evento Inicio de partida.

  1. En MatchManager, bajo las variables de 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. En return MatchManager, conecta el evento de inicio de la partida a startTimer() .


    -- Funciones de módulo
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Para iniciar el evento de inicio de la partida, en prepareGame(), escribe 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 el inicio y la parada de las funciones del temporizador.

Scripts Completados

A continuación, están los scripts completados para revisar tu trabajo.

Guión de MatchManager


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 tiempo para usarlo 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

Script de GameManager


-- 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()
-- El marcador espera por la longitud del juego.
matchEnd.Event:Wait()
end