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.
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.
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")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 dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- El marcador espera por la longitud del juego.matchEnd.Event:Wait()endPrueba 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返回剩余的时间。
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 = 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, 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.
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 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() :
- Llamar myTimer.start() . Pasar en gameSettings.matchDuration .
- Llamar myTimer.finished:Connect() . Pasar en timeUp() .
-- Funciones localeslocal 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.
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ó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()En return MatchManager, conecta el evento de inicio de la partida a startTimer() .
-- Funciones de módulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerPara iniciar el evento de inicio de la partida, en prepareGame(), escribe 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 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
-- 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()-- El marcador espera por la longitud del juego.matchEnd.Event:Wait()end