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.
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.
In GameManager , crea le variabili per la cartella Events e l'evento MatchEnd.
-- Script del modulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Eventilocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")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 dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Attendere il segnaposto per la lunghezza del Gioco.matchEnd.Event:Wait()endTesta 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.
In ServerStorage > ModuleScripts, crea un nuovo script del modulo con nome Timer.
Sostituisci il codice con il codice seguente.
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 TimerNel MatchManager, richiedi i moduli GameSettings e Timer.
local MatchManager = {}-- Servizilocal ServerStorage = game:GetService("ServerStorage")-- Script del modulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))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.
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 localilocal function timeUp()print("Time is up!")end-- Funzioni del modulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerSotto timeUp() , aggiungi una funzione chiamata startTimer() con una dichiarazione di stampa. Mostrerai il timer in gioco più tardi.
-- Funzioni localilocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endPer avviare e fermare il timer, in startTimer() :
- Chiama myTimer.start() . Passa in gameSettings.matchDuration .
- Chiama myTimer.finished:Connect() . Passa in timeUp() .
-- Funzioni localilocal 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.
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 modulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Eventilocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")local matchEnd = events:WaitForChild("MatchEnd")--Crea orologiolocal myTimer = timer.new()Sopra return MatchManager , connetti l'evento di inizio della partita a startTimer() .
-- Funzioni del modulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerPer attivare l'evento di avvio della partita, in prepareGame(), digita matchStart:Fire() .
-- Funzioni del modulofunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endProva 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
-- Servizilocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Script del modulolocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Eventilocal 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()-- Attendere il segnaposto per la lunghezza del Gioco.matchEnd.Event:Wait()end