Selama ronde, skrip perlu melacak waktu dan mengirim sinyal di antara skrip yang berbeda.Waktu akan dikelola menggunakan skrip waktu, sementara peristiwa, konsep dalam pemrograman Roblox, akan memberi sinyal perubahan seperti akhir mencocokkan.
Kirim sinyal dengan peristiwa
Dengan pemain sekarang di arena, acara dapat digunakan untuk menandai awal pertandingan dan kode untuk timer dapat dimulai.Kemudian, sebuah acara juga dapat digunakan untuk menandai akhir mencocokkan, dan saatnya untuk beralih pemain kembali ke lobi.
Peristiwa ini tidak dibangun sebelumnya, jadi objek peristiwa khusus yang disebut bindable events perlu dibuat.Acara yang dapat diikat sering digunakan untuk tindakan yang ditembak oleh pemain dan mirip dengan acara seperti Touched atau Changed .
Beberapa skrip dapat mendengarkan peristiwa yang sama terikat.Ini membuat kode Anda terorganisasi dan memudahkan untuk menambahkan kode tambahan untuk awal atau akhir pertandingan nanti jika diperlukan.
Buat acara yang dapat diikat
Mulai dengan membuat objek acara yang dapat diikat untuk awal dan akhir mencocokkan.Karena acara yang dapat diikat tidak berinteraksi dengan klien, mereka dapat disimpan di Penyimpanan Server.
Di ServerStorage, buat folder baru bernama Peristiwa. Di folder itu, buat dua BindableEvents bernama MatchStart dan MatchEnd.
Gunakan acara
Saat ini, ketika pemain memasuki arena, jeda terus dimulai ulang daripada memulai timer.Lingkaran permainan utama perlu diberitahu untuk berhenti dan menunggu sampai acara MatchEnd terbakar sebelum melanjutkan ke bagian berikutnya dari kode.
Peristiwa memiliki dua fungsi bawaan: Connect() dan Wait().Alih-alih menggunakan Connect() seperti sebelumnya, hubungi Wait() di MatchEnd untuk menghentikan skrip manajer permainan sampai MatchEnd ditembak.Dalam kasus ini, fungsi tunggu membekukan kode sampai manajer game menerima sinyal bahwa pertandingan berakhir.
Di GameManager , buat variabel untuk folder Events dan MatchEnd acara.
-- Skrip Modullocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Peristiwalocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")Memiliki skrip menunggu akhir acara pertandingan untuk menembak sebelum bergerak. Di 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()-- Penanda tunggu untuk panjang game.matchEnd.Event:Wait()endTes game.Konfirmasikan bahwa setelah pemain berada di arena, loop jeda tidak dilanjutkan.Skrip sekarang menunggu sinyal matchEnd untuk menembak.
Tip pemecahan masalah
Pada titik ini, kode tidak berfungsi seperti yang diharapkan, coba salah satu dari berikut ini.
- Periksa ganda penggunaan operator dot atau kolon di matchEnd.Event:Wait() .
- Pastikan MatchEnd adalah BindableEvent, dan bukan ketiklain, seperti RemoteEvent.
Gunakan timer
Salah satu kondisi yang akan menyebabkan akhir pertandingan adalah waktu habis, yang akan ditangani melalui skrip.
Atur jam waktu
Untuk menambahkan timer ke dalam game, gunakan skrip modul premade di langkah di bawah ini.Ini termasuk fungsi untuk memulai dan mengakhiri timer, serta mengembalikan jumlah waktu yang tersisa.
Di ServerStorage > ModuleScripts, buat skrip 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, diperlukan 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 penghitung waktu baru dengan mengatur 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 penghitung waktu baru untuk digunakan untuk melacak waktu pertandingan.local myTimer = timer.new()
Mulai dan berhenti
Sekarang timer dibuat, gunakan fungsi yang disertakan start() dan stop() selama mencocokkan.Di bawah ini adalah deskripsi setiap fungsi dan parameter yang diterimanya.
- start(time) - Memulai timer, dengan waktu dalam detik sebagai parameter.
- finished:Connect(functionName) - Ketika waktu habis, jalankan fungsi yang disampaikan sebagai parameter.
Di MatchManager , buat fungsi baru bernama timeUp() untuk dijalankan setiap kali timer selesai. Sertakan pernyataan cetak tes.
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 waktu di 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() . Berikan di gameSettings.matchDuration .
- Panggil myTimer.finished:Connect() . Berikan di timeUp() .
-- Fungsi Lokallocal function startTimer()print("Timer started")myTimer:start(gameSettings.matchDuration)myTimer.finished:Connect(timeUp)end
Mulai timer
Pengatur waktu dapat diaktifkan di awal pertandingan menggunakan acara Mulai Pertandingan.
Di MatchManager, di bawah variabel modul, buat variabel untuk menyimpan folder Acara, MatchStart, dan MatchEnd (yang digunakan dalam pelajaran 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"))-- Peristiwalocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")local matchEnd = events:WaitForChild("MatchEnd")--Membuat pengatur waktulocal 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 menembakkan acara mulai pertandingan, di prepareGame() , ketik matchStart:Fire() .
-- Fungsi Modulfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endUji game. Di jendela Output, konfirmasikan bahwa Anda dapat melihat pernyataan cetak untuk fungsi mulai dan berhenti timer.
Skrip selesai
Di bawah ini adalah skrip yang selesai untuk memeriksa ulang pekerjaan Anda.
Skrip Manajer Pertandingan
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"))
-- Peristiwa
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Membuat objek penghitung waktu 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 Manajer Game
-- 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"))-- Peristiwalocal 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()-- Penanda tunggu untuk panjang game.matchEnd.Event:Wait()end