Selama kursus sebuah putaran, skrip akan perlu melacak waktu dan mengirim sinyal antara berbagai skrip. Waktu akan diperbarui menggunakan script waktu, sementara acara, konsep dalam kode Roblox, akan mengirim perubahan seperti akhir dari mencocokkan.
Mengirim Sinyal dengan Acara
Dengan pemain sekarang di arena, acara dapat digunakan untuk menandai awal pertandingan dan kode untuk timer dapat dimulai. Kemudian, acara juga dapat digunakan untuk menandai akhir mencocokkan, dan bahwa saatnya untuk mengirim pemain kembali ke lobi.
Acara-acara ini tidak dibangun sebelumnya, jadi objek acara khusus yang disebut objek acara yang dapat disesuaikan akan perlu dibuat. Objek acara yang dapat disesuaikan biasanya digunakan untuk tindakan pemain dan mirip dengan acara seperti Touched atau Changed.
Beberapa script dapat mendengarkan acara yang sama. Ini menjaga kode Anda terorganisir dan memudahkan untuk menambahkan kode tambahan untuk awal atau akhir pertandingan jika perlu.
Membuat Acara yang Dapat Dibindakan
Mulai dengan menciptakan objek acara yang dapat dipasang untuk awal dan akhir mencocokkan. Karena acara yang dapat dipasang tidak berinteraksi dengan klien, mereka dapat disimpan di Server Storage.
Di ServerStorage, buatlah folder baru bernama Events. Di folder itu, buat dua BindableEvents bernama MatchStart dan MatchEnd.
Menggunakan Acara
Saat ini, ketika pemain memasuki arena, antrianya terus dimulai daripada memulai timer. Loop permainan utama perlu diberitahu untuk berhenti dan menunggu sampai acara PertandinganEnd berakhir sebelum pindah ke bagian selanjutnya dari kode.
Acara memiliki dua fungsi bawaan: Connect() dan Wait(). Alih-alih menggunakan Connect() seperti sebelumnya, panggil 2>Wait2> di MatchEnd untuk menghentikan script manajer game sampai MatchEnd diaktifkan. Dalam kasus ini, fungsi tunggu menunda kode sampai game manager menerima sinyal bahwa pertandingan
Dalam GameManager , buat variabel untuk Events folder dan MatchEnd acara.
-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Acaralocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")Minta script menunggu acara akhir pertandingan untuk berakhir sebelum pindah. Di dalam loop , di akhir, ketik: matchEnd.Event:Wait()
while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Tempat penunggu menunggu panjang game.matchEnd.Event:Wait()endUji game. Konfirmasi bahwa setelah pemain berada di arena, maka loop istirahat tidak berlanjut. Skrip sekarang menunggu sinyal matchEnd untuk diaktifkan.
Tips Troubleshoot
Pada titik ini, kode tidak berfungsi seperti yang diharapkan, coba salah satu dari berikut.
- Periksa kembali penggunaan operator dot atau kolon di matchEnd.Event:Wait() .
- Pastikan bahwa MatchEnd adalah acara yang dapat dipasang, bukan ketiklain, seperti acara Remote.
Menggunakan Timer
Salah satu kondisi yang akan menyebabkan akhir dari pertandingan adalah timer yang berjalan keluar, yang akan diperlakukan melalui script.
Mengatur Waktu
Untuk menambahkan timer ke dalam game, gunakan script modul prasetel di langkah-langkah di bawah ini. Ini mencakup fungsi untuk memulai dan mengakhiri timer, serta mengembalikan jumlah waktu yang tersisa.
Di ServerStorage > ModuleScripts, buat script modul baru bernama Timer.
Ganti kode dengan kode di bawah ini.
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 TimerDi MatchManager, butuhkan modul GameSettings dan Timer.
local MatchManager = {}-- Layananlocal ServerStorage = game:GetService("ServerStorage")-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))Di bawah variabel, buat objek timer baru dengan menetapkan variabel bernama myTimer yang sama dengan timer.new() . Objek ini akan digunakan untuk memanggil fungsi yang memulai dan menghentikan timer.
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Membuat objek timer baru untuk digunakan untuk melacak waktu pertandingan.local myTimer = timer.new()
Memulai dan Berhenti
Sekarang setelah penghitung waktu dibuat, gunakan fungsi yang disertakan start() dan stop() selama mencocokkan. Di bawah ini adalah deskripsi dari setiap fungsi dan parameter yang diterima.
- start(time) - Memulai timer, dengan waktu dalam detik sebagai parameter.
- finished:Connect(functionName) - Saat waktu habis, eksekusi fungsi dikonfigurasi sebagai parameter.
Dalam MatchManager , buat fungsi baru bernama timeUp() untuk dijalankan setiap kali timer telah selesai. Masukkan pernyataan cetak ulang pengujian.
local myTimer = timer.new()-- Fungsi Lokallocal function timeUp()print("Time is up!")end-- Fungsi Modulfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerDi bawah timeUp(), tambahkan fungsi bernama startTimer() dengan pernyataan cetak. Anda akan menampilkan timer dalam game nanti.
-- Fungsi Lokallocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endUntuk memulai dan menghentikan timer, di startTimer() :
- Panggil myTimer.start() . Berakhir dalam gameSettings.matchDuration .
- Panggil myTimer.finished:Connect() . Pass dalam timeUp() .
-- Fungsi Lokallocal function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)end
Memulai Timer
Waktu dapat diaktifkan di awal pertandingan menggunakan acara Pertandingan Mulai.
Di MatchManager, di bawah variabel modul, buat variabel untuk menyimpan slot acara, MatchStart, dan MatchEnd (yang digunakan dalam sebuah kursus masa depan).
-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Acaralocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")local matchEnd = events:WaitForChild("MatchEnd")--Menciptakan timerlocal myTimer = timer.new()Di atas return MatchManager, hubungkan acara awal pertandingan ke startTimer() .
-- Fungsi Modulfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerUntuk mengeksekusi acara pertandingan, di prepareGame() , jenis matchStart:Fire() .
-- Fungsi Modulfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endUji game. Di Jendela Keluar, konfirmasi bahwa Anda dapat melihat pernyataan cetak untuk fungsi start dan stop timer.
Skrip yang Diselesaikan
Di bawah ini adalah script yang selesai untuk memeriksa kembali pekerjaan Anda.
Skrip MatchManager
local MatchManager = {}
-- Layanan
local ServerStorage = game:GetService("ServerStorage")
-- Skrip Modul
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Acara
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Membuat objek timer baru untuk digunakan untuk melacak waktu pertandingan.
local myTimer = timer.new()
-- Fungsi Lokal
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
end
-- Fungsi Modul
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager
Skrip GameManager
-- Layananlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Acaralocal 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()-- Tempat penunggu menunggu panjang game.matchEnd.Event:Wait()end