Timer 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 verrà gestito utilizzando uno script di tempo, mentre gli eventi, un concetto nella programmazione Roblox, segnaleranno cambiamenti come la fine di una Corrisponde.

Invia segnali con eventi

Con i giocatori ora nella 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ò essere utilizzato anche per segnalare la fine della Corrispondee che è tempo di passare i giocatori alla lobby.

Questi eventi non sono precompilati, quindi gli oggetti evento personalizzati chiamati eventi leganti dovranno essere creati.Gli eventi bindabili vengono spesso utilizzati per azioni lanciate dal giocatore e sono simili ad eventi come Touched o Changed .

Più script possono ascoltare gli stessi eventi bindabili.Questo mantiene il tuo codice organizzato e rende più facile aggiungere ulteriori codici per l'inizio o la fine della partita in seguito, se necessario.

Crea eventi leganti

Inizia creando oggetti evento bindabili per l'inizio e la fine della Corrisponde.Poiché gli eventi bindabili non interagiscono con il client, possono essere memorizzati nell'archiviazione del server.

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

Usa eventi

Al momento, quando i giocatori entrano nell'arena, l'intervallo continua a riavviarsi piuttosto che iniziare il timer.Il ciclo di gioco principale deve essere detto di fermarsi e aspettare fino a quando l'evento MatchEnd non si attiva prima di passare alla prossima parte del codice.

Gli eventi hanno due funzioni integrate: Connect() e Wait() .Invece di utilizzare Connect() come precedentemente, chiama Wait() su MatchEnd per interrompere lo script del gestore di gioco fino a quando non viene eseguito MatchEnd.In questo caso, la funzione di attesa interrompe il codice fino a quando il gestore del gioco riceve un segnale che la partita è finita.

  1. In GameManager , crea le variabili per la cartella Events e l'evento 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 attenda l'evento di fine partita per essere attivato prima di procedere. Nel ciclo , alla fine , digita:


    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()
    -- Attendere il segnaposto per la lunghezza del Gioco.
    matchEnd.Event:Wait()
    end
  3. Testa il Gioco.Conferma che una volta che i giocatori sono nell'arena, il ciclo di interruzione non continua .Lo script ora sta aspettando il segnale matchEnd per essere Lanciare.

Suggerimenti per la risoluzione dei problemi

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

  • Doppio controllo sull'uso degli operatori punto o colon in matchEnd.Event:Wait() .
  • Assicurati che MatchEnd sia un BindableEvent, e non un altro inserisci / scrivi, come un RemoteEvent.

Utilizza un timer

Una delle condizioni che causerà la fine della partita è un timer in esaurimento, che verrà gestito attraverso lo script.

Imposta il timer

Per aggiungere un timer nel Gioco, usa lo script del modulo predefinito nei passaggi seguenti.Include funzioni per avviare e terminare un timer, nonché restituire la quantità di tempo rimanente.

  1. In ServerStorage > ModuleScripts, crea un nuovo script del modulo con nome Timer.

    Sostituisci 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. Nel 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 verrà utilizzato per chiamare funzioni che avviano e terminano il timer.


    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Crea un nuovo oggetto timer da utilizzare per tenere traccia del tempo di partita.
    local myTimer = timer.new()

Avvia e stoppa

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

  • start(time) - Avvia il timer, con il tempo in secondi come parametro.
  • finished:Connect(functionName) - Quando il timer termina, esegue la funzione passata come parametro.
  1. In MatchManager , crea una nuova funzione chiamata timeUp() per essere eseguita ogni volta che il timer è terminato. 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() . Passa in gameSettings.matchDuration .
    • Chiama myTimer.finished:Connect() . Passa in timeUp() .

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

Avvia il 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 archiviare 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 orologio
    local myTimer = timer.new()
  2. Sopra return MatchManager , connetti l'evento di inizio della partita a startTimer() .


    -- Funzioni del modulo
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Per attivare 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 che puoi vedere le dichiarazioni di stampa per le funzioni di avvio e stop del timer.

Script completati

Di seguito sono completati gli script per controllare due volte il tuo lavoro.

scriptdi 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 da utilizzare per tenere traccia del tempo di 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

scriptdi 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()
-- Attendere il segnaposto per la lunghezza del Gioco.
matchEnd.Event:Wait()
end