Tempo e eventi

*Questo contenuto è tradotto usando AI (Beta) e potrebbe contenere errori. Per visualizzare questa pagina in inglese, clicca qui.

Durante il corso di un round, gli script dovranno tracciare il tempo e inviare segnali tra diversi script. Il tempo sarà gestito utilizzando uno script di tempo, mentre gli eventi, un concetto in Roblox codice, invieranno segnali come la fine di una Corrisponde.

Invio segnali con eventi

Con i giocatori ora nell'arena, gli eventi possono essere utilizzati per segnalare l'inizio della partita e il codice per il timer può iniziare. In seguito, un evento può anche essere utilizzato per segnalare la fine della Corrisponde, e che è ora di passare i giocatori alla lobby.

Questi eventi non sono pre-costruiti, quindi gli oggetti evento personalizzati chiamati eventi legabili dovranno essere creati. Gli eventi legabili sono spesso utilizzati per azioni del giocatore e sono simili agli eventi come Touched o Changed .

Più script possono ascoltare gli stessi eventi legabili. Ciò mantiene il tuo codice organizzato e rende più facile aggiungere ulteriore codice per l'avvio o la fine della partita se necessario.

Creazione di eventi legabili

Inizia creando oggetti evento legabili per l'inizio e la fine della Corrisponde. Poiché gli eventi legabili non interagiscono con il client, possono essere memorizzati nel Server Storage.

  1. In ServerStorage, crea una nuova cartella chiamata Eventi . In quella cartella, crea due Eventi legabili chiamati MatchStart e MatchEnd.

Usa gli eventi

Al momento, quando i giocatori entrano nell'arena, l'interruzione viene riavviata in modo che non inizi il timer. Il principale ciclo di gioco deve essere detto di fermarsi e aspettare fino all'evento MatchEnd prima di passare alla prossima parte del codice.

Gli eventi hanno due funzioni built-in: Connect() e Wait(). Invece di utilizzare Connect() come prima, chiama 2>Wait2> su MatchEnd per sospendere lo script del gestore del gioco fino a quando MatchEnd non viene attivato. In questo caso, la funzione di attesa sospende lo script del gestore del gioco fino a quando il match è finito.

  1. In GameManager , crea variabili per la cartella Events e MatchEnd .


    -- Script del modulo
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Eventi
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
  2. Fai in modo che lo script aspetti per l'evento di fine match per essere in grado di passare avanti. Nel loop, all'end, inserisci / scrivi: 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()
    -- Il placeholder aspetta per la lunghezza del Gioco.
    matchEnd.Event:Wait()
    end
  3. Prova il Gioco. Conferma che una volta che i giocatori sono nell'arena, il loop di interruzione non continua. Lo script ora sta aspettando il segnale matchEnd per Lanciare.

Risolvere i problemi

A questo punto, il codice non funziona come dovrebbe, prova uno dei seguenti sotto.

  • Controlla l'uso dei trattini o dei trattini in matchEnd.Event:Wait() .
  • Assicurati che MatchEnd sia un BindableEvent, non un altro inserisci / scrivi, come un RemoteEvent.

Uso di un Timer

Una delle condizioni che causeranno la fine della partita è un timer che termina, che verrà gestito attraverso lo script.

Configurazione del timer

Per aggiungere un timer nel Gioco, usa lo script del modulo prefabbricato nei passaggi seguenti. Include funzioni per avviare e terminare un timer, nonché restituire il tempo rimasto.

  1. In ServerStorage > ModuleScripts, crea uno script del modulo nuovo chiamato Timer.

    Remplace il codice con il codice seguente.


    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. In MatchManager, richiedi i moduli GameSettings e Timer.


    local MatchManager = {}
    -- Servizi
    local ServerStorage = game:GetService("ServerStorage")
    -- Script del modulo
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
  3. Sotto le variabili, crea un nuovo oggetto timer impostando una variabile chiamata myTimer uguale a timer.new() . Questo oggetto sarà utilizzato per chiamare funzioni che avviano e fermano il timer.


    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Crea un nuovo oggetto timer per essere utilizzato per tracciare il tempo della partita.
    local myTimer = timer.new()

Avvio e Stopping

Ora che è stato creato un timer, usa le funzioni incluse start() e stop() durante una Corrisponde. Di seguito è una descrizione di ogni funzione e del parametro che accetta.

  • start(time) - Avvia il timer, con il tempo in secondi come parametro.
  • finished:Connect(functionName) - Quando il timer finisce, esegue la funzione passata come parametro.
  1. In MatchManager , crea una nuova funzione chiamata timeUp() per essere eseguita ogni volta che il timer è finito. Includi una dichiarazione di stampa di test.


    local myTimer = timer.new()
    -- Funzioni locali
    local function timeUp()
    print("Time is up!")
    end
    -- Funzioni del modulo
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Sotto timeUp() , aggiungi una funzione chiamata startTimer() con una dichiarazione di stampa. Mostrerai il timer in gioco più tardi.


    -- Funzioni locali
    local function timeUp()
    print("Time is up!")
    end
    local function startTimer()
    print("Timer started")
    end
  3. Per avviare e fermare il timer, in startTimer() :

    • Chiama myTimer.start() . Pass in gameSettings.matchDuration .
    • Chiama myTimer.finished:Connect() . Pass in timeUp() .

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

Avvio del timer

Il timer può essere attivato all'inizio di una partita utilizzando l'evento Inizio partita .

  1. In MatchManager, sotto le variabili del modulo, crea le variabili per memorizzare la cartella Eventi, MatchStart e MatchEnd (che viene utilizzata in una lezione futura).


    -- Script del modulo
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Eventi
    local events = ServerStorage:WaitForChild("Events")
    local matchStart = events:WaitForChild("MatchStart")
    local matchEnd = events:WaitForChild("MatchEnd")
    --Crea un timer
    local myTimer = timer.new()
  2. Al di sopra di return MatchManager, connetti l'evento di avvio della partita a startTimer() .


    -- Funzioni del modulo
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Per avviare l'evento di avvio della partita, in prepareGame() , digita matchStart:Fire() .


    -- Funzioni del modulo
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    matchStart:Fire()
    end
  4. Prova il Gioco. Nella finestra di output, conferma di poter vedere le dichiarazioni di output per il timer di avvio e stop.

Script completati

Di seguito sono gli script completati per il doppio controllo del tuo lavoro.

Script del MatchManager


local MatchManager = {}
-- Servizi
local ServerStorage = game:GetService("ServerStorage")
-- Script del modulo
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Eventi
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Crea un nuovo oggetto timer per essere utilizzato per tracciare il tempo della partita.
local myTimer = timer.new()
-- Funzioni locali
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
end
-- Funzioni del modulo
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager

Script del GameManager


-- Servizi
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Script del modulo
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Eventi
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()
-- Il placeholder aspetta per la lunghezza del Gioco.
matchEnd.Event:Wait()
end