Pengukur Waktu dan Acara

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

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.

  1. 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

  1. Dalam GameManager , buat variabel untuk Events folder dan MatchEnd acara.


    -- Skrip Modul
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Acara
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
  2. Minta script menunggu acara akhir pertandingan untuk berakhir sebelum pindah. Di dalam loop , di akhir, ketik: matchEnd.Event:Wait()


    while true do
    repeat
    task.wait(gameSettings.intermissionDuration)
    print("Restarting intermission")
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    -- Tempat penunggu menunggu panjang game.
    matchEnd.Event:Wait()
    end
  3. Uji 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.

  1. Di ServerStorage > ModuleScripts, buat script modul baru bernama Timer.

    Ganti kode dengan kode di bawah ini.


    local Timer = {}
    Timer.__index = Timer
    function Timer.new()
    local self = setmetatable({}, Timer)
    self._finishedEvent = Instance.new("BindableEvent")
    self.finished = self._finishedEvent.Event
    self._running = false
    self._startTime = nil
    self._duration = nil
    return self
    end
    function Timer:start(duration)
    if not self._running then
    task.spawn(function()
    self._running = true
    self._duration = duration
    self._startTime = tick()
    while self._running and tick() - self._startTime < duration do
    task.wait()
    end
    local completed = self._running
    self._running = false
    self._startTime = nil
    self._duration = nil
    self._finishedEvent:Fire(completed)
    end)
    else
    warn("Warning: timer could not start again as it is already running.")
    end
    end
    function Timer:getTimeLeft()
    if self._running then
    local now = tick()
    local timeLeft = self._startTime + self._duration - now
    if timeLeft < 0 then
    timeLeft = 0
    end
    return timeLeft
    else
    warn("Warning: could not get remaining time, timer is not running.")
    end
    end
    function Timer:isRunning()
    return self._running
    end
    function Timer:stop()
    self._running = false
    end
    return Timer
  2. Di MatchManager, butuhkan modul GameSettings dan Timer.


    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"))
  3. 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.
  1. Dalam MatchManager , buat fungsi baru bernama timeUp() untuk dijalankan setiap kali timer telah selesai. Masukkan pernyataan cetak ulang pengujian.


    local myTimer = timer.new()
    -- Fungsi Lokal
    local function timeUp()
    print("Time is up!")
    end
    -- Fungsi Modul
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Di bawah timeUp(), tambahkan fungsi bernama startTimer() dengan pernyataan cetak. Anda akan menampilkan timer dalam game nanti.


    -- Fungsi Lokal
    local function timeUp()
    print("Time is up!")
    end
    local function startTimer()
    print("Timer started")
    end
  3. Untuk memulai dan menghentikan timer, di startTimer() :

    • Panggil myTimer.start() . Berakhir dalam gameSettings.matchDuration .
    • Panggil myTimer.finished:Connect() . Pass dalam timeUp() .

    -- Fungsi Lokal
    local 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.

  1. Di MatchManager, di bawah variabel modul, buat variabel untuk menyimpan slot acara, MatchStart, dan MatchEnd (yang digunakan dalam sebuah kursus masa depan).


    -- 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")
    --Menciptakan timer
    local myTimer = timer.new()
  2. Di atas return MatchManager, hubungkan acara awal pertandingan ke startTimer() .


    -- Fungsi Modul
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Untuk mengeksekusi acara pertandingan, di prepareGame() , jenis matchStart:Fire() .


    -- Fungsi Modul
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    matchStart:Fire()
    end
  4. Uji 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


-- 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"))
-- Acara
local events = ServerStorage:WaitForChild("Events")
local matchEnd = events:WaitForChild("MatchEnd")
while true do
repeat
task.wait(gameSettings.intermissionDuration)
print("Restarting intermission")
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
-- Tempat penunggu menunggu panjang game.
matchEnd.Event:Wait()
end