Mengkode Game Loop

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Dengan peta yang dibuat, saatnya untuk mulai membangun skrip. Sisa dari kursus ini akan berfokus pada pembuatan semua elemen berbeda dari game loop.

Mengatur Skrip

Pertempuran royale akan menggunakan kombinasi script modul dan script normal. Berikut adalah script dan fungsinya.

Manajer PermainanSkrip. Mengeksekusi fungsi dari Manajer Pertandingan menggunakan variabel dari Game Settings
Manajer PertandinganSkrip Modul. Menjalankan fungsi seperti mengirim pemain ke arena atau menyimpan waktu dalam mencocokkan.
Pengaturan PermainanSkrip Modul. Menyimpan variabel umum yang digunakan oleh skrip lain.

Skrip GameSettings

Buat script modul bernama GameSettings untuk menyimpan variabel yang digunakan oleh skrip lain, seperti durasi pertandingan dan durasi istirahat. Variabel ini akan digunakan oleh script Manajer Game nanti.

  1. Di ServerStorage , buat folder bernama ModuleScripts. Di folder itu, buat script modul baru bernama GameSettings.

  2. Buka GameSettings dan ganti nama tabel modul untuk mencocokkan nama script.


    local GameSettings = {}
    return GameSettings
  3. Di tabel modul, tambahkan variabel untuk kegunaan berikut. Gunakan dugaan terbaik Anda untuk setiap nilai, Anda selalu dapat mengubahnya kemudian saat Anda menguji.

    • Durasi Istirahat - Detik pemain menunggu sebelum mencocokkan.
    • Durasi Pertandingan - Panjang pertandingan dalam detik.
    • Pemain Minimum - Angka pemain terkecil yang dibutuhkan untuk memulai.
    • Waktu Periode Transisi - Waktu sebelum dan sesudah pertandingan dalam detik. Membuat periode transisi antara bagian game loop kurang tiba-tiba.

    local GameSettings = {}
    -- Variabel Game
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

Skrip MatchManager

Skrip kedua yang terhubung dengan GameManager adalah MatchManager. Skrip ini mengelola tugas seperti memulai timer atau mengatur ulang pemain setelah pertandingan berakhir.

Dalam MatchManager ada fungsi bernama prepareGame() yang memulai permainan dengan menyiapkan pemain ke mencocokkan.

  1. Di ServerStorage > ModuleScripts > tambahkan skrip modul bernama MatchManager. Rename tabel modul.


    local MatchManager = {}
    return MatchManager
  2. Tambahkan fungsi modul baru bernama MatchManager bernama prepareGame() . Include a print statement to test script nanti.


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

Mengkode Game Loop

Loop permainan utama akan dipetakkan dalam script GameManager menggunakan variabel yang baru saja dibuat. Ingat, ada tiga fase dalam loop permainan: istirahat, kompetisi, dan bersihkan & reset.

Skrip GameManager

Skrip ini adalah skrip server normal, jadi letakkan di ServerScriptService, bukan modul skrip. Loop permainan sebenarnya akan berada dalam beberapa waktu sejati do loop.

  1. Di ServerScriptService, buat naskah baru bernama GameManager.

  2. Tambahkan variabel untuk layanan "ServerStorage", di mana ModulScripts berada. Kemudian tambahkan variabel untuk layanan "Pemain", yang akan diperlukan untuk memeriksa jumlah pemain selama istirahat.


    -- Layanan
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. Untuk menggunakan modul yang baru saja dibuat:

    • Tetapkan variabel bernama moduleScripts ke lokasi folder ModuleScripts.
    • Tambahkan variabel bernama matchManager dan gameSettings . Tetapkan setiap variabel untuk mengharuskan skrip masing-masing mereka.

    -- Layanan
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- Skrip Modul
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
  4. Setelah variabel, tambahkan while true do loop. Semua fase dari game loop akan masuk ke dalam untuk diulang tanpa batas.


    -- Skrip Modul
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Lingkaran permainan utama
    while true do
    end

Mengkode Ijazah

Sementara game loop berjalan tanpa batas, istirahat harus menghentikan loop dan hanya melanjutkan ketika ada cukup pemain untuk mencocokkan. Untuk mengkode istirahat ini, gunakan loop berulang bertumpuk-tumpuk untuk istirahat di loop utama. Setelah ada cukup pemain, itu akan keluar dan beralih pemain ke mencocokkan.

Dengan mengulangi loop , kode dalam loop akan dijalankan setidaknya satu kali. Berbeda dengan lainnya loop, ia tidak memeriksa kondisinya sampai akhir lainnya. Ini menjamin pemain selalu pergi ke lobi sebelum mencocokkan.

  1. Dalam while true do loop, ketik repeat dan tekan Enter untuk menyelesaikan otomatis dengan kata kunci 1> until1> .


    while true do
    repeat
    until
    end
  2. Periksa apakah jumlah pemain saat ini (#Players:GetPlayers()) adalah lebih besar atau sama dengan variabel minimumPlayers yang dibuat sebelumnya di modul GameSettings.


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. Dalam loop ulang, tambahkan pernyataan cetak mengatakan bahwa intermission dimulai. Gunakan task.wait() untuk berhenti untuk intermission menggunakan intermissionDuration dari GameSettings.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Mainkan dan periksa bahwa pernyataan cetak "Starting intermission" ditunjukkan setidaknya dua kali. Melihat pesan dua kali menunjukkan bahwa loop repeat tidak menemukan cukup pemain dan dijalankan lagi. Anda harus menunggu panjang istirahat sebelum melihat pesan kedua kali.

Tips Troubleshoot

Pada titik ini, jika Anda tidak spawn seperti yang diinginkan, coba salah satu dari berikut.

  • task.wait() seharusnya berada di dalam loop ulang. Tanpa menunggu, script akan mengeksekusi terlalu banyak kali dalam satu detik, mengisi ulang Roblox Studio dan menyebabkan kesalahan.
  • Dalam modul Pengaturan Permainan, variabel intermissionDuration harus lebih besar dari 1. Jika kurang, script dapat mengulangi terlalu sering, menyebabkan masalah penurunan.

Menyelesaikan Ijazah

Setelah ada cukup pemain, biarkan mereka menunggu waktu transisi singkat. Kemudian, kirim mereka ke pertandingan dengan memanggil fungsi prepareGame() di MatchManager. Ingat, fungsi itu hanya mencetak satu baris, tetapi Anda akan menambahkan lebih banyak kode nanti.

  1. Pada akhir latihan ulang, tambahkan pernyataan cetak mengatakan bahwa istirahat telah berakhir untuk menguji kode Anda. Kemudian, ikuti dengan menggunakan task.wait() variabel GameSettings menggunakan 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. Setelah menunggu, panggil prepareGame() dari modul MatchManager. Ketika kode berjalan, ini hanya akan mencetak teks ke jendela keluaran. Tunggu sampai bagian berikutnya untuk menguji kode ini.


    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

Menguji Game Multiplayer

Saat ini, untuk memastikan kode berjalan prepareGame(), perlu keluar dari loop repeat. Tetapi, untuk melakukan itu, perlu ada lebih dari satu pemain. Ini berarti jika Anda menggunakan tombol playtest, fungsi tidak akan pernah berjalan karena Anda adalah satu-satunya pemain dalam game(kecuali jika pemain minimum Anda adalah satu). U

Memulai Server Lokal

Untuk menguji kode yang memerlukan lebih dari satu pemain, buat server lokal. Meskipun game yang diterbitkan biasanya ada di server Roblox, server lokal meniru permainan multiplayer di komputer Anda dengan pemain yang disimulasikan.

  1. Untuk memulai server lokal, di tab Test > Klien dan Server > bagian Dropdown Pemain ke nomor pemain dalam GameSettings's variabel minimumPlayers. Pelajaran ini menggunakan 2 pemain.

  2. Klik Mulai untuk memulai server.

  3. Tunggu beberapa detik agar server dapat diatur. Beberapa jendela akan terbuka di samping jendela Studio asli Anda. Anda mungkin perlu mengizinkan akses ke Roblox Studio dari firewall atau perangkat lunak keamanan online lainnya.

Tips Troubleshoot

Pada titik ini, Anda tidak dapat melihat server pengujian, coba salah satu dari berikut.

  • Jika Anda memiliki masalah dengan server memulai, periksa dua kali artikel Masalah Firewall dan Router.
  • Tetapkan jumlah pemain ke jumlah kecil, seperti 2 atau 3.
  • Jika masalah ini tidak terpecahkan, coba restart Studio atau restarting komputer Anda.

Menguji di Server Lokal

Anda akan melihat beberapa jendela saat server dimulai. Masing-masing mewakili bagian yang berbeda dari hubungan server/klien.

  • Server (batas hijau) menjalankan game.
  • Klien (batas biru) meniru pengalaman pemain.
Server dengan batas hijau
Klien dengan batas biru

Dengan server up, Anda dapat memeriksa apakah kode bekerja.

  1. Temukan jendela Server dengan batas hijau. Periksa pernyataan cetak yang dibuat dari script MatchManager. Karena ada pernyataan cetak yang berulang, Anda akan melihat pernyataan cetak yang sama yang diulang.

  2. Setelah Anda selesai menguji, di jendela mana pun, tutup server dengan tombol Bersihkan. Ini menutup semua jendela Server dan Klien dan membawa Anda kembali ke jendela Studio normal Anda.

Tips Troubleshoot

Pada titik ini, jika pernyataan cetak yang diinginkan tidak muncul, coba salah satu dari berikut.

  • Periksa bahwa fungsi seperti prepareGame() berada dalam scope of while true do loop.
  • Jika cetakan dari MatchManager tidak berfungsi, periksa beberapa solusi umum dengan naskah modul, seperti memastikan bahwa script MatchManager diperlukan di GameManager atau bahwa prepareGame() ditambahkan ke tabel modul tersebut.

Skrip yang Diselesaikan

Di bawah ini adalah script yang selesai untuk memeriksa kembali pekerjaan Anda.

Skrip GameManager


-- Layanan
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Skrip Modul
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Lingkaran permainan utama
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

Skrip MatchManager


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

Skrip GameSettings


local GameSettings = {}
-- Variabel Game
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings