Durante o curso de uma rodada, os scripts precisarão rastrear o tempo e enviar sinais entre diferentes scripts.O tempo será gerenciado usando um script de tempo, enquanto eventos, um conceito no código Roblox, sinalizarão mudanças como o fim de uma conferir.
Envie sinais com eventos
Com jogadores agora na arena, eventos podem ser usados para sinalizar o início da partida e o código para o cronômetro pode começar.Mais tarde, um evento também pode ser usado para sinalizar o fim da conferire que é hora de transicionar os jogadores de volta ao lobby.
Esses eventos não são pré-construídos, então objetos de evento personalizados chamados eventos vinculáveis precisarão ser criados.Eventos vinculáveis são frequentemente usados para ações disparadas pelo jogador e são semelhantes a eventos como Touched ou Changed.
Múltiplos scripts podem ouvir os mesmos eventos bindables.Isso mantém seu código organizado e facilita adicionar código adicional para o início ou fim da partida mais tarde, se necessário.
Criar eventos vinculados
Comece criando objetos de evento vinculáveis para o começo e o fim da conferir.Como eventos vinculados não interagem com o cliente, eles podem ser armazenados no Armazenamento do Servidor.
No Armazenamento do Servidor, crie uma nova pasta chamada Eventos. Nessa pasta, crie dois Eventos Vinculáveis chamados Início de Partida e Fim de Partida.
Usar eventos
No momento, quando os jogadores entram na arena, a intermissão continua reiniciando em vez de começar o cronômetro.O ciclo de jogo principal precisa ser dito para parar e esperar até que o evento MatchEnd seja acionado antes de passar para a próxima parte do código.
Eventos têm duas funções integradas: Connect() e Wait().Em vez de usar Connect() como antes, chame Wait() em MatchEnd para pausar o script do gerenciador de jogos até que MatchEnd seja disparado.Neste caso, a função de espera põe em pausa o código até que o gerente do jogo receba um sinal de que a partida terminou.
Em Gerenciador de Jogo , crie variáveis para o diretório Events e o 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")Tenha o script esperar o evento de fim de partida para disparar antes de seguir em frente. No loop , no fim , digitar: 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()-- Espaço reservado aguarde o comprimento do jogo.matchEnd.Event:Wait()endTeste o jogo.Confirme que uma vez que os jogadores estão na arena, o ciclo de intermissão não continua .O script agora está esperando pela sinal matchEnd de Iniciar / executar.
Dicas de solução de problemas
Neste ponto, o código não funciona como esperado, tente um dos seguintes abaixo.
- Verifique duas vezes o uso dos operadores ponto ou vírgula em matchEnd.Event:Wait() .
- Certifique-se de que o MatchEnd seja um BindableEvent, e não outro digitar, como um RemoteEvent.
Use um cronômetro
Uma das condições que causará o fim da partida é um tempo limite que expirará, que será tratado através do script.
Configure o cronômetro
Para adicionar um cronômetro ao jogo, use o script de módulo pré-feito nas etapas abaixo.Inclui funções para iniciar e terminar um cronômetro, bem como retornar a quantidade de tempo restante.
No Armazenamento de Servidor > ModuleScripts, crie um novo script de módulo chamado Timer.
Substitua o código pelo código abaixo.
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 TimerNo MatchManager, exija os módulos de Configurações do Jogo e Temporizador.
local MatchManager = {}-- Serviçoslocal 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"))Abaixo das variáveis, crie um novo objeto de temporizador definindo uma variável chamada myTimer igual a timer.new().Este objeto será usado para chamar funções que iniciam e param o cronômetro.
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Cria um novo objeto de cronômetro para ser usado para acompanhar o tempo da partida.local myTimer = timer.new()
Começar e parar
Agora que um cronômetro foi criado, use as funções incluídas start() e stop() durante uma conferir.Abaixo está uma descrição de cada função e o parâmetro que ela aceita.
- start(time) - Inicia o cronômetro, com tempo em segundos como parâmetro.
- finished:Connect(functionName) - Quando o cronômetro termina, executa a função passada como um parâmetro.
Em Gerenciador de Partida , crie uma nova função chamada timeUp() para executar sempre que o cronômetro terminar. Inclua uma declaração de impressão de teste.
local myTimer = timer.new()-- Funções Locaislocal function timeUp()print("Time is up!")end-- Funções de Módulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerAbaixo de timeUp(), adicione uma função chamada startTimer() com uma declaração de impressão. Você exibirá o tempo em jogo mais tarde.
-- Funções Locaislocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endPara iniciar e parar o cronômetro, em startTimer() :
- Chame myTimer.start(). Passe em gameSettings.matchDuration.
- Chame myTimer.finished:Connect(). Passe em timeUp().
-- Funções Locaislocal function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)end
Inicie o cronômetro
O cronômetro pode ser acionado no início de uma partida usando o evento Início de Partida.
No MatchManager, sob as variáveis do módulo, crie variáveis para armazenar o diretório de Eventos, MatchStart e MatchEnd (que é usado em uma lição 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")--Cria cronômetrolocal myTimer = timer.new()Acima de return MatchManager, conecte o evento de início da partida a startTimer().
-- Funções de Módulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerPara disparar o evento de início da partida, em prepareGame(), digite matchStart:Fire().
-- Funções de Módulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endTeste o jogo. Na janela de Saída, confirme que você pode ver as declarações de impressão para as funções de início e parada do cronômetro.
Scripts concluídos
Abaixo estão scripts concluídos para verificar duas vezes o seu trabalho.
scriptdo Gerenciador de Partida
local MatchManager = {}
-- Serviços
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")
-- Cria um novo objeto de cronômetro para ser usado para acompanhar o tempo da partida.
local myTimer = timer.new()
-- Funções Locais
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
end
-- Funções de Módulo
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
scriptdo Gerenciador de Jogo
-- Serviçoslocal 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()-- Espaço reservado aguarde o comprimento do jogo.matchEnd.Event:Wait()end