Kodekan loop permainan

*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 besar pada menulis semua elemen berbeda dari loop permainan.

Menyiapkan skrip

Pertempuran royale akan menggunakan kombinasi skrip modul dan skrip normal. Di bawah ini adalah skrip dan fungsinya.

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

Skrip Pengaturan Game

Buat skrip modul bernama GameSettings untuk menyimpan variabel yang digunakan oleh skrip lain, seperti durasi pertandingan dan jeda.Variabel ini akan digunakan oleh skrip GameManager nanti.

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

  2. Buka GameSettings dan ganti tabel modul untuk sesuai dengan nama skrip.


    local GameSettings = {}
    return GameSettings
  3. Di tabel modul, tambahkan variabel untuk penggunaan berikut. Ambil kiraan terbaik untuk setiap nilai, Anda selalu dapat mengubahnya nanti saat Anda menguji.

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

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

Skrip Manajer Pertandingan

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

Di dalam MatchManager ada fungsi bernama prepareGame() yang memulai permainan dengan mengalihkan pemain ke mencocokkan.

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


    local MatchManager = {}
    return MatchManager
  2. Tambahkan fungsi modul baru ke MatchManager bernama prepareGame(). Sertakan pernyataan cetak untuk menguji skrip nanti.


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

Kodekan loop permainan

Lingkaran permainan utama akan dikodekan dalam skrip GameManager menggunakan variabel yang baru saja dibuat.Ingat, ada tiga fase dalam lingkaran permainan: jeda, kompetisi, dan pembersihan & resetulang.

Skrip Manajer Game

Skrip ini adalah skrip server normal, jadi letakkan di ServerScriptService, bukan di folder skrip modul.Lingkaran permainan yang sebenarnya akan berada di dalam sementara true do loop.

  1. Di ServerScriptService, buat skrip baru dengan nama GameManager.

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


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

    • Tetapkan variabel bernama moduleScripts ke lokasi folder ModuleScripts.
    • Tambahkan variabel bernama matchManager dan gameSettings . Setiap variabel harus memerlukan skrip masing-masing.

    -- 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 loop while true do . Semua fase dari loop permainan 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

Kode jeda

Sementara loop permainan berjalan tanpa batas, jeda harus menghentikan loop dan hanya melanjutkan ketika ada cukup banyak pemain untuk mencocokkan.Untuk mengkode jeda ini, termasuk loop berulang terkait untuk istirahat dalam loop while.Lingkaran terpisah itu akan diulang sampai ada cukup pemain, membekukan loop utama.Setelah ada cukup pemain, itu akan keluar dan beralih pemain ke mencocokkan.

Dengan loop berulang **** , kode di loop akan dijalankan setidaknya sekali.Tidak seperti loop while, ia tidak memeriksa kondisinya sampai loop berakhir.Ini memastikan pemain selalu pergi ke lobi sebelum mencocokkan.

  1. Di dalam loop while true do , ketik repeat dan tekan Enter untuk menyelesaikan secara otomatis dengan kata kunci until .


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


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


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Tes uji dan periksa bahwa pernyataan cetak "Starting intermission" ditampilkan setidaknya dua kali.Melihat pesan dua kali membuktikan bahwa loop berulang tidak menemukan cukup pemain dan berjalan lagi.Anda harus menunggu lama jeda sebelum melihat pesan untuk kedua kalinya.

Tip pemecahan masalah

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

  • task.wait() harus berada di dalam loop ulang.Tanpa menunggu, skrip akan menjalankan terlalu banyak kali dalam satu detik, membebani Roblox Studio dan menyebabkan kesalahan.
  • Di modul Pengaturan Permainan, variabel intermissionDuration harus lebih besar dari 1. Jika lebih rendah, skrip dapat diulang terlalu sering, menyebabkan masalah penurunan kecepatan.

Akhiri jeda

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

  1. Di akhir loop berulang, tambahkan pernyataan cetak yang mengatakan istirahat sudah berakhir untuk menguji kode Anda.Kemudian, ikuti dengan task.wait() menggunakan variabel GameSetting'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. Setelah menunggu, hubungi prepareGame() dari modul MatchManager.Ketika kode dijalankan, ini hanya akan mencetak teks ke jendela Output.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

Uji permainan multiplayer

Saat ini, untuk memiliki kode dijalankan prepareGame() , perlu keluar dari loop ulang.Tetapi, untuk melakukan itu, harus ada lebih dari satu pemain.Ini berarti jika Anda menggunakan tombol playtest, fungsi tidak akan pernah dijalankan karena Anda adalah satu-satunya pemain dalam permainan (kecuali jika pemain minimum Anda adalah satu).Untuk menguji ini, Anda perlu menyimulasikan gamemultiplayer.

Memulai server lokal

Untuk menguji kode yang membutuhkan lebih dari satu pemain, buat server lokal.Sementara game yang dipublikasikan biasanya ada di server Roblox, server lokal simulasikan permainan multiplayer di komputer Anda dengan pemain simulasi.

  1. Untuk memulai server lokal, di tab Tes > Klien dan Server bagian > atur dropdown pemain ke nomor pemain minimum dalam variabel GameSetting's minimumPlayers.Pelajaran ini menggunakan 2 pemain.

  2. Klik Mulai untuk memulai server.

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

Tip pemecahan masalah

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

  • Jika Anda memiliki masalah dengan server mulai, periksa ulang artikel Masalah Firewall dan Router.
  • Atur jumlah pemain menjadi jumlah kecil, seperti 2 atau 3.
  • Jika masalah tidak diselesaikan, coba restart Studio atau memulai ulang komputer Anda.

Menguji di server lokal

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

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

Server dengan border hijau
>

Klien dengan border biru
>

Dengan server menyala, Anda dapat memeriksa apakah kode berfungsi.

  1. Temukan jendela Server dengan border hijau.Periksa pernyataan cetak yang dipanggil dari skrip MatchManager.Karena ada loop ulang, Anda akan melihat pernyataan cetak yang sama 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.

Tip pemecahan masalah

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

  • Periksa bahwa fungsi seperti prepareGame() berada dalam cakupan loop while true.
  • Jika cetakan dari MatchManager tidak berfungsi, periksa beberapa solusi umum dengan skrip modul, seperti memastikan bahwa skrip MatchManager diperlukan di GameManager atau bahwa prepareGame() ditambahkan ke tabel modul itu.

Skrip selesai

Di bawah ini adalah skrip yang selesai untuk memeriksa ulang pekerjaan Anda.

Skrip Manajer Game


-- 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 Manajer Pertandingan


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

Skrip Pengaturan Game


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