Thời gian và sự kiện

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Trong khoản trong suốt của một vòng, các script sẽ cần phải theo dõi thời gian và gửi tín hiệu giữa các script khác nhau. Thời gian sẽ được quản lý bằng cách sử dụng một script thời gian, trong khi các sự kiện, một khái niệm trong Roblox công bố, sẽ gửi tín hiệu thay đổi như kết thúc của một tương thích.

Gửi tín hiệu với sự kiện

Với các người chơi đã ở trong đấu trường, các sự kiện có thể được sử dụng để tín hiệu khởi động trận và mã cho thời gian thông báo có thể bắt đầu. Sau đó, một sự kiện cũng có thể được sử dụng để tín hiệu kết thúc tương thíchvà thời gian cho người chơi chuyển về sảnh.

Các sự kiện này không được xây dựng trước, vì vậy các đối tượng sự kiện tùy chỉnh gọi là bộ độ dánh sẽ cần phải được tạo. Bộ độ dánh thường được sử dụng cho các hành động của người chơi và giống như các sự kiện như

Nhiều script có thể lắng nghe cùng một sự kiện có thể liên kết. Điều này giữ cho mã của bạn được tổ chức và dễ dàng hơn để thêm mã bổ sung cho khu bắt đầu hoặc kết thúc của trận đấu sau đó nếu cần thiết.

Tạo Sự Kiện Bindable

Bắt đầu bằng cách tạo các đối tượng sự kiện có thể liên kết cho khu vực bắt đầu và kết thúc của trận tương thích. Vì các đối tượng sự kiện có thể không tương tác với khách hàng, chúng có thể được lưu trong Lưu trữ Server.

  1. Trong ServerStorage, tạo một thư mục mới có tên là Events. Trong thư mục đó, tạo hai BindableEvents có tên là MatchStart và MatchEnd.

Sử dụng sự kiện

Hiện tại, khi người chơi bước vào đấu trường, hành trình bắt đầu sẽ không bắt đầu mà thay vào đó là khởi động lại hành trình. Loop chính của trò chơi cần phải được nói để dừng lại và chờ đợi sự kiện Kết thúc trận đấu trước khi chuyển sang phần tiếp theo của mã.

Các sự kiện có hai chức năng được tích hợp: Connect()Wait() . Thay vì sử dụng Connect() như trước, hãy gọi 1> Wait()1> trên MatchEnd để tạm dừng script quản lý trò chơi cho đến khi MatchEnd đư

  1. Trong GameManager , tạo biến cho thư mục Events và sự kiện MatchEnd.


    -- Script Mô-đun
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Sự kiện
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
  2. Để script chờ đợi sự kiện kết thúc trận đấu để bắt đầu tiếp theo. Trong vòng lặp , ở cuối , hãy đánh máy: 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()
    -- Đợi để đếm độ dài của trò chơi.
    matchEnd.Event:Wait()
    end
  3. Thử nghiệm trò chơi. Xác nhận rằng một khi người chơi ở trong đấu trường, lượt tiếp theo của hành lang không tiếp tục. Script bây giờ đang chờ đợi tín hiệu matchEnd để bắt lửa.

Mẹo dịch vụ

Tại thời điểm này, mã không hoạt động như mong đợi, hãy thử một trong những lựa chọn dưới đây.

  • Xem lại việc sử dụng của các hàm đoạn dấu hoặc dấu chấm câu trong matchEnd.Event:Wait() .
  • Đảm bạn rằng MatchEnd là một BindableEvent, và không phải là một đánh máykhác, ví dụ như một sự kiệnRemote.

Sử dụng một Timer

Một trong những điều kiện gây ra sự kết thúc của trận đấu là một timer chạy ra, which will be handled through the script.

Cài đặt thời gian

Để thêm một timer vào trò chơi, hãy sử dụng script modul trước đó trong các bước dưới đây. Nó bao gồm các chức năng để khởi chạy và kết thúc một timer, cũng như trả lại số thời gian còn lại.

  1. Trong ServerStorage >ModuleScripts, tạo một mô-đun mới có tên là Timer.

    Thay thế mã bằng mã dưới đây.


    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. Trong MatchManager, yêu cầu các module GameSettings và Timer.


    local MatchManager = {}
    -- Dịch Vụ
    local ServerStorage = game:GetService("ServerStorage")
    -- Script Mô-đun
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
  3. Dưới các biến, tạo một thể hiện mới của timer bằng cách đặt biến tên là myTimer bằng timer.new() . Đối tượng này sẽ được sử dụng để gọi các hàm bắt đầu và dừng timer.


    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Tạo một thời gian mới để được sử dụng để theo dõi thời gian trận đấu.
    local myTimer = timer.new()

Bắt đầu và Dừng lại

Bây giờ một thời gian đã được tạo, hãy sử dụng các chức năng bên trên start()stop() trong một tương thích. Dưới đây là một mô tả của mỗi chức năng và tham số mà nó chấp nhận.

  • start(time) - Bắt đầu thời gian, với thời gian trong giây như một biến.
  • finished:Connect(functionName) - Khi thời gian kết thúc, thì chạy chức năng đã được gọi là một biến.
  1. Trong MatchManager , tạo một chức năng mới có tên timeUp() để chạy khi thời gian hết. Bao gồm một tuyên bố in thử nghiệm.


    local myTimer = timer.new()
    -- Hàm chức năng địa phương
    local function timeUp()
    print("Time is up!")
    end
    -- Hàm chức năng
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Dưới timeUp() , thêm chức năng tên là startTimer() với một câu chữ in. Bạn sẽ hiển thị thời gian trong trò chơi sau đó.


    -- Hàm chức năng địa phương
    local function timeUp()
    print("Time is up!")
    end
    local function startTimer()
    print("Timer started")
    end
  3. Để bắt đầu và dừng chặn thời gian, trong startTimer() :

    • Gọi myTimer.start() . Đi qua trong gameSettings.matchDuration .
    • Gọi myTimer.finished:Connect() . Đi qua trong timeUp() .

    -- Hàm chức năng địa phương
    local function startTimer()
    print("Timer started")
    myTimer:start(gameSettings.matchDuration)
    myTimer.finished:Connect(timeUp)
    end

Bắt đầu đồng hồ bấm giờ

Thời gian có thể được kích hoạt ở đầu một trận đấu bằng cách sử dụng sự kiện Bắt đầu trận đấu.

  1. Trong MatchManager, dưới các biến module, tạo các biến để lưu thư mục Sự kiện, MatchStart và MatchEnd (được sử dụng trong một bài học tương lai).


    -- Script Mô-đun
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Sự kiện
    local events = ServerStorage:WaitForChild("Events")
    local matchStart = events:WaitForChild("MatchStart")
    local matchEnd = events:WaitForChild("MatchEnd")
    --Tạo thời gian
    local myTimer = timer.new()
  2. Trên return MatchManager, kết nối sự kiện khởi động trận đấu đến startTimer() .


    -- Hàm chức năng
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Để khởi động sự kiện bắt đầu trận, trong prepareGame() , hãy nhập matchStart:Fire() .


    -- Hàm chức năng
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    matchStart:Fire()
    end
  4. Thử nghiệm trò chơi. Ở Cửa sổ Ra kết quả, xác nhận rằng bạn có thể xem các tuyên bố in cho các chức năng khởi động và dừng của thời gian.

Các Kịch Bản Đã Hoàn Thành

Dưới đây là các script đã hoàn thành để kiểm tra lại công việc của bạn.

Tập lệnh MatchManager


local MatchManager = {}
-- Dịch Vụ
local ServerStorage = game:GetService("ServerStorage")
-- Script Mô-đun
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Sự kiện
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Tạo một thời gian mới để được sử dụng để theo dõi thời gian trận đấu.
local myTimer = timer.new()
-- Hàm chức năng địa phương
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
end
-- Hàm chức năng
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager

Script GameManager


-- Dịch Vụ
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- Script Mô-đun
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Sự kiện
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()
-- Đợi để đếm độ dài của trò chơi.
matchEnd.Event:Wait()
end