Pengatur waktu dan acara

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

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.

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

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


    -- Skrip Modul
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Peristiwa
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
  2. Memiliki skrip menunggu akhir acara pertandingan untuk menembak sebelum bergerak. Di 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()
    -- Penanda tunggu untuk panjang game.
    matchEnd.Event:Wait()
    end
  3. Tes 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.

  1. Di ServerStorage > ModuleScripts, buat skrip 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, diperlukan 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 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.
  1. Di MatchManager , buat fungsi baru bernama timeUp() untuk dijalankan setiap kali timer selesai. Sertakan pernyataan cetak tes.


    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 waktu di 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() . Berikan di gameSettings.matchDuration .
    • Panggil myTimer.finished:Connect() . Berikan di timeUp() .

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

  1. Di MatchManager, di bawah variabel modul, buat variabel untuk menyimpan folder Acara, MatchStart, dan MatchEnd (yang digunakan dalam pelajaran 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"))
    -- Peristiwa
    local events = ServerStorage:WaitForChild("Events")
    local matchStart = events:WaitForChild("MatchStart")
    local matchEnd = events:WaitForChild("MatchEnd")
    --Membuat pengatur waktu
    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 menembakkan acara mulai pertandingan, di prepareGame() , ketik matchStart:Fire() .


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


-- 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"))
-- Peristiwa
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()
-- Penanda tunggu untuk panjang game.
matchEnd.Event:Wait()
end