Codice del Game Loop

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

Con la mappa creata, è ora di iniziare a costruire gli script. Il resto di questo corso si concentra principalmente sulla programmazione di tutti gli elementi del game loop.

Configurazione degli script

Il battle royale userà una combinazione di script del modulo e script normali. Di seguito sono gli script e le loro funzioni.

GameManager ]Script. Esegue funzioni dal Gestore della Corrispondenza utilizzando le variabili dalle Impostazioni di Gioco
MatchManagerScript del modulo. Esegue funzioni come l'invio di giocatori in un'arena o il mantenimento del tempo in una Corrisponde.
Impostazioni di giocoScript del modulo. memorizza le variabili comunemente utilizzate utilizzate da altri script.

Script di GameSettings

Crea uno script del modulo chiamato GameSettings per memorizzare le variabili utilizzate da altri script, come la durata della partita e l'intervallo. Questi valori saranno utilizzati dal script del GameManager in seguito.

  1. In ServerStorage , crea una cartella chiamata ModuleScripts. In that cartella, crea uno script di modulo chiamato GameSettings.

  2. Apri GameSettings e rinomina la tabella del modulo per corrispondere al nome dello script.


    local GameSettings = {}
    return GameSettings
  3. Nella tabella dei moduli, aggiungi variabili per i seguenti utilizzi. Prendi la tua migliore indovinanza per ciascun valore, puoi sempre cambiarlo in seguito mentre testi.

    • Durata della interruzione - Secondi i giocatori aspettano prima di una Corrisponde.
    • Durata della corrispondenza - Lunghezza di una corrispondenza in secondi.
    • Minimum Players - Numero minimo di giocatori richiesti per Iniziare, cominciare.
    • Tempo di transizione - Tempo prima e dopo una partita in secondi. Rende il passaggio tra le parti del flusso di gioco meno improvviso.

    local GameSettings = {}
    -- Variabili di gioco
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

Script del MatchManager

Il secondo script connesso a GameManager è il MatchManager. Questo script gestisce le attività come l'avvio del timer o il ripristino dei giocatori una volta terminata la partita.

All'interno di MatchManager c'è una funzione chiamata prepareGame() che inizia il gioco trasformando i giocatori nella Corrisponde.

  1. In ServerStorage > ModuleScripts > aggiungi uno script del modulo chiamato MatchManager. Rinomina la tabella del modulo.


    local MatchManager = {}
    return MatchManager
  2. Aggiungi una nuova funzione del modulo a MatchManager chiamata prepareGame() . Includi una dichiarazione di stampa per testare lo script in seguito.


    local MatchManager = {}
    function MatchManager.prepareGame()
    print("Game starting!")
    end
    return MatchManager

Codice del Game Loop

Il principale game loop sarà codificato nel script GameManager utilizzando le variabili appena create. Ricorda, ci sono tre fasi nel game loop: interruzione, competizione e pulizia e Ripristina.

Script del GameManager

Questo script è uno script del server normale, quindi mettilo in ServerScriptService, piuttosto che nel modulo script del modulo. Il vero game loop sarà in un while true do loop.

  1. In ServerScriptService, crea uno script nuovo chiamato GameManager.

  2. Aggiungi una variabile per il servizio "ServerStorage", che è dove si trovano i Modulescripts. Quindi aggiungi una variabile per il servizio "Players", che sarà necessaria per controllare il numero di giocatori durante gli intervalli.


    -- Servizi
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. Per utilizzare i moduli creati in precedenza:

    • Imposta una variabile chiamata moduleScripts nella posizione della cartella ModulScripts.
    • Aggiungi le variabili con il nome matchManager e gameSettings . Imposta ogni variabile per richiedere lo script rispettivo.

    -- 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"))
  4. Dopo le variabili, aggiungi un while true do loop. Tutte le fasi del game loop andranno all'interno per essere ripetute indefinitamente.


    -- Script del modulo
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Main game loop
    while true do
    end

Codice l'Interruzione

Mentre il ciclo di gioco viene eseguito indefinitamente, l'interruzione dovrebbe interrompere il ciclo e continuare solo quando ci sono abbastanza giocatori per una Corrisponde. Per codificare questa interruzione, includi un ciclo ripetuto indefinito per l'interruzione nella while loop. Questo ciclo ripetuto indefinito si ripetrà fino a quando ci sono abbastanza giocatori, causando l'interruzione principale. Una volta che ci sono abbastanza giocatori, eseguirà e transizione i giocatori in una Corrisponde.

Con un iteratore di ripetizione , il codice nell'iteratore viene eseguito almeno una volta. A differenza di un while loop, non controlla le sue condizioni fino alla fine dell'iteratore. Ciò garantisce che i giocatori siano sempre andati nella lobby prima di una Corrisponde.

  1. Nel while true do loop, type repeat e press Enter per autocompletare con la parola chiave 1> until1> .


    while true do
    repeat
    until
    end
  2. Controlla se il numero attuale di giocatori (#Players:GetPlayers()) è maggiore o uguale alla variabile minimumPlayers creata nel modulo GameSettings.


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. Nel loop di ripetizione, aggiungi una dichiarazione di stampa che dice che l'interruzione sta iniziando. Usa task.wait() per暂停 per l'interruzione usando intermissionDuration da GameSettings.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Prova e assicurati che la dichiarazione di stampa "Starting intermission" sia mostrata almeno due volte. Vedere il messaggio due volte dimostra che il loop di ripetizione non ha trovato abbastanza giocatori e ha eseguito di nuovo. Avrai bisogno di aspettare la durata dell'intervallo prima di vedere il messaggio un'altra volta.

Risolvere i problemi

A questo punto, se non stai spawnando come previsto, prova uno dei seguenti.

  • task.wait() dovrebbe essere all'interno del loop di ripetizione. Senza il wait, lo script eseguirà troppi volte in un secondo, sovraccaricando Roblox Studio e causando un errore.
  • Nel modulo Impostazioni di gioco, la variabile intermissionDuration dovrebbe essere maggiore di 1. Se inferiore, lo script può ripetere troppo spesso, causando problemi di rallentamento.

Finire l'Intervallo

Una volta che ci sono abbastanza giocatori, fai loro aspettare un breve periodo di transizione. Quindi, inviali nella partita chiamando la funzione prepareGame() in MatchManager. Ricorda, quella funzione stampa solo una linea, ma aggiungerai più codice più tardi.

  1. Alla fine del loop di ripetizione, aggiungi una dichiarazione di stampa che dice che l'interruzione è finita per testare il tuo codice. Quindi, seguitelo con un task.wait() utilizzando la variabile GameSettings's transitionTime.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. Dopo la attesa, chiama il prepareGame() dal modulo MatchManager. Quando il codice viene eseguito, questo stampa solo il testo nella finestra di uscita. Attendere fino alla prossima sezione per testare questo codice.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    end

Testare i giochi multiplayer

In questo momento, per avere il codice in esecuzione prepareGame() , deve uscire dal loop di ripetizione. Ma, per farlo, ci deve essere più di un Giocatore. Ciò significa che se usi il pulsante playtest , la funzione non verrà mai eseguita poiché sei l'unico giocatore nel gioco (a meno che i tuoi giocatori minimi non siano uno). Per testare questo, devi simulare un Giocomultiplayer.

Avvio di un server locale

Per testare il codice che richiede più di un Giocatore, crea un Serverlocale. Mentre i giochi pubblicati sono normalmente sui server Roblox, un server locale simula un gioco multiplayer sul tuo computer con giocatori simulati.

  1. Per avviare un Serverlocale, nella scheda Test > Client e server > imposta il player dropdown sul numero di giocatori nella variabile minimaPlayers di GameSettings. Questa lezione utilizza 2 giocatori.

  2. Fai clic su Inizia per iniziare il Server.

  3. Attendere pochi secondi per l'avvio del server. Viene visualizzata più di una finestra del tuo vecchio Studio. Potrebbe essere necessario consentire l'accesso a Roblox Studio da firewall o altri software di sicurezza online.

Risolvere i problemi

A questo punto, non sei in grado di vedere i server di prova, prova uno dei seguenti sotto.

  • Se hai problemi con l'avvio del server, controlla doppio il articolo Problemi con il firewall e il router.
  • Imposta il numero di giocatori su un piccolo numero, come 2 o 3.
  • Se l'errore non si risolve, prova a riavviare Studio o riavviare il tuo computer.

Testare sul server locale

Vedrai più finestre quando il server inizia. Ciascuna rappresenta una parte diversa del rapporto server/client.

  • Server (green border) esegue il Gioco.
  • Client (bluoi confini) simula l'esperienza di un Giocatore.
Server con bordura verde
Client con bordura blu

Con il server up, puoi controllare se il codice ha funzionato.

  1. Trova la Server finestra con il bordo verde. Controlla la dichiarazione di stampa chiamata dalla script MatchManager. Poiché ci sono rami ripetuti, vedrai le stesse dichiarazioni di stampa ripetute.

  2. Una volta terminato il test, in qualsiasi finestra, chiudi il server con il pulsante di pulizia . Questo chiude tutte le finestre Server e Client e ti riporta alla tua finestra di Studio normale.

Risolvere i problemi

Al momento, se le dichiarazioni di stampa intenzionali non sono apparse, prova una delle seguenti opzioni a seguire.

  • Assicurati che le funzioni come prepareGame() siano in range while true do loop.
  • Se la stampa da MatchManager non ha funzionato, controlla alcuni problemi comuni con gli script del modulo, come assicurarti che lo script MatchManager sia richiesto in GameManager o che prepareGame() sia aggiunto alla tabella di quel modulo.

Script completati

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

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"))
-- Main game loop
while true do
repeat
print("Starting intermission")
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
end

Script del MatchManager


local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager

Script di GameSettings


local GameSettings = {}
-- Variabili di gioco
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings