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.
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() và 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 đư
Trong GameManager , tạo biến cho thư mục Events và sự kiện MatchEnd.
-- Script Mô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Sự kiệnlocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")Để 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 dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Đợi để đếm độ dài của trò chơi.matchEnd.Event:Wait()endThử 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.
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 = 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 TimerTrong MatchManager, yêu cầu các module GameSettings và Timer.
local MatchManager = {}-- Dịch Vụlocal ServerStorage = game:GetService("ServerStorage")-- Script Mô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))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() và 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.
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ươnglocal function timeUp()print("Time is up!")end-- Hàm chức năngfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerDướ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ươnglocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endĐể 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ươnglocal 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.
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ô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local timer = require(moduleScripts:WaitForChild("Timer"))-- Sự kiệnlocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")local matchEnd = events:WaitForChild("MatchEnd")--Tạo thời gianlocal myTimer = timer.new()Trên return MatchManager, kết nối sự kiện khởi động trận đấu đến startTimer() .
-- Hàm chức năngfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerĐể khởi động sự kiện bắt đầu trận, trong prepareGame() , hãy nhập matchStart:Fire() .
-- Hàm chức năngfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endThử 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ô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Sự kiệnlocal 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()-- Đợi để đếm độ dài của trò chơi.matchEnd.Event:Wait()end