Với bản đồ được tạo, đã đến lúc bắt đầu xây dựng các kịch bản.Phần còn lại của khóa học này sẽ tập trung nhiều vào việc lập trình tất cả các yếu tố khác nhau của vòng lặp trò chơi.
Thiết lập các kịch bản
Cuộc chiến royale sẽ sử dụng một sự kết hợp của các kịch bản module và các kịch bản bình thường. Dưới đây là các kịch bản và chức năng của chúng.
Quản lý trò chơi | Script. Chạy chức năng từ Quản lý trận đấu bằng cách sử dụng biến từ Cài đặt trò chơi |
Quản lý trận đấu | Tập lệnh module. Chạy các chức năng như gửi người chơi vào một đấu trường hoặc theo dõi thời gian trong một tương thích. |
Cài đặt trò chơi | Module Script. Lưu các biến thông thường được sử dụng bởi các kịch bản khác. |
Tập lệnh GameSettings
Tạo một kịch bản module có tên GameSettings để lưu các biến được sử dụng bởi các kịch bản khác, như thời gian trận đấu và thời gian gián đoạn.Các biến này sẽ được sử dụng bởi kịch bản GameManager sau này.
Trong ServerStorage , tạo một thư mục có tên ModuleScripts. Trong thư mục đó, tạo một kịch bản mới có tên GameSettings.
Mở GameSettings và đổi tên bảng module phù hợp với tên của kịch bản.
local GameSettings = {}return GameSettingsTrong bảng module, thêm biến cho các trường hợp sử dụng sau. Lấy dự đoán tốt nhất cho mỗi giá trị, bạn luôn có thể thay đổi sau khi kiểm tra.
- Thời lượng gián đoạn - Giây người chơi chờ trước khi một tương thíchbắt đầu.
- Thời lượng trận đấu - Thời lượng của một trận đấu trong giây.
- Người chơi tối thiểu - Số người chơi nhỏ nhất cần để bắt đầu.
- Thời gian chuyển đổi - Thời gian trước và sau một trận đấu trong giây lát. Làm cho việc chuyển đổi giữa các phần của vòng lặp trò chơi ít đột ngột hơn.
local GameSettings = {}-- Biến trò chơiGameSettings.intermissionDuration = 5GameSettings.matchDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings
Tập lệnh MatchManager
Tập lệnh thứ hai kết nối với GameManager là MatchManager.Tập lệnh này quản lý các nhiệm vụ như khởi động bộ đếm thời gian hoặc đặt lại người chơi một khi trận đấu kết thúc.
Trong MatchManager là một chức năng có tên prepareGame() bắt đầu trò chơi bằng cách chuyển người chơi vào trận tương thích.
Trong ServerStorage > ModuleScripts > thêm một kịch bản module có tên MatchManager. Thay đổi tên bảng module.
local MatchManager = {}return MatchManagerThêm chức năng mô-đun mới vào MatchManager có tên prepareGame(). Bao gồm một tuyên bố in để kiểm tra kịch bản sau này.
local MatchManager = {}function MatchManager.prepareGame()print("Game starting!")endreturn MatchManager
Mã hóa vòng lặp trò chơi
Vòng lặp chính của trò chơi sẽ được mã hóa trong kịch bản GameManager bằng cách sử dụng các biến vừa tạo.Hãy nhớ, có ba giai đoạn trong vòng lặp trò chơi: khởi động lại, cạnh tranh và làm trả về mặc định& đặt lại.
Tập lệnh GameManager
Tập lệnh này là một tập lệnh máy chủ bình thường, vì vậy hãy đặt nó vào ServerScriptService, thay vì thư mục tập lệnh mô-đun.Vòng lặp trò chơi thực sẽ ở trong vòng lặp while true.
Trong ServerScriptService, tạo một kịch bản mới có tên GameManager.
Thêm một biến cho dịch vụ "ServerStorage", nơi Modulescripts nằm.Sau đó thêm một biến cho dịch vụ "Người chơi", sẽ cần thiết để kiểm tra số lượng người chơi trong lúc nghỉ giải lao.
-- Dịch vụlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")Để sử dụng các mô-đun đã tạo trước:
- Đặt một biến có tên là moduleScripts vào vị trí của thư mục ModuleScripts.
- Thêm các biến có tên là matchManager và gameSettings. Đặt mỗi biến cần có tương ứng với tương ứng của chúng.
-- Dịch vụlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Tập lệnh mô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))Sau các biến, thêm một vòng lặp while true do. Tất cả các giai đoạn của vòng lặp trò chơi sẽ đi vào bên trong để lặp lại vô cực.
-- Tập lệnh mô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Vòng lặp chính trò chơiwhile true doend
Mã hóa khoảng dừng
Trong khi vòng lặp trò chơi chạy vô cực, khoảng dừng nên tạm dừng vòng lặp và chỉ tiếp tục khi có đủ người chơi cho một tương thích.Để mã hóa thời gian tạm dừng này, bao gồm một vòng lặp lặp lại lồng nhau cho khoảng trống trong vòng lặp while.Vòng lặp lồng nhau đó sẽ lặp lại cho đến khi có đủ người chơi, tạm dừng vòng lặp chính.Khi có đủ người chơi, nó sẽ thoát và chuyển người chơi sang một tương thích.
Với một vòng lặp lặp lại **** , mã trong vòng lặp sẽ chạy ít nhất một lần.Không giống như vòng lặp while, nó không kiểm tra điều kiện cho đến khi vòng lặp kết thúc.Điều này đảm bảo người chơi luôn đi vào sảnh trước khi một tương thíchbắt đầu.
Trong vòng lặp while true do, nhập repeat và nhấn Enter để hoàn thành tự động với từ khóa until .
while true dorepeatuntilendKiểm tra xem số người chơi hiện tại (#Players:GetPlayers()) có lớn hơn hoặc bằng số biến minimumPlayers được tạo trước đó trong mô-đun GameSettings.
while true dorepeatuntil #Players:GetPlayers() >= gameSettings.minimumPlayersendTrong vòng lặp lặp lại, thêm một tuyên bố in nói rằng kỳ nghỉ ngơi đang bắt đầu.Sử dụng task.wait() để tạm dừng trong khoảng thời gian dùng intermissionDuration từ GameSettings.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersendThử nghiệm và kiểm tra rằng tuyên bố in được hiển thị ít nhất hai lần "Starting intermission"Xem tin nhắn hai lần chứng minh vòng lặp lặp lại không tìm thấy đủ người chơi và chạy lại.Bạn sẽ phải chờ thời gian ngắt giữa trước khi nhìn thấy tin nhắn lần thứ hai.
Mẹo khắc phục sự cố
Tại thời điểm này, nếu bạn không sinh sản như dự định, hãy thử một trong những điều sau.
- task.wait() nên nằm bên trong vòng lặp lặp lại.Không có thời gian chờ, kịch bản sẽ chạy quá nhiều lần trong một giây, làm quá tải Roblox Studio và gây ra lỗi.
- Trong mô-đun Cài đặt trò chơi, biến intermissionDuration nên lớn hơn 1. Nếu thấp hơn, thì kịch bản có thể lặp lại quá thường xuyên, gây ra vấn đề chậm lại.
Kết thúc khoảng nghỉ
Khi có đủ người chơi, hãy để họ chờ một thời gian chuyển tiếp ngắn.Sau đó, gửi chúng vào trận bằng cách gọi chức năng prepareGame() trong MatchManager.Hãy nhớ rằng chức năng chỉ in một dòng, nhưng bạn sẽ thêm thêm mã sau này.
Tại cuối vòng lặp lặp lại, thêm một tuyên bố in nói rằng khoảng dừng đã kết thúc để kiểm tra mã của bạn.Sau đó, theo dõi nó bằng một task.wait() sử dụng biến transitionTime của GameSetting.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)endSau khi chờ đợi, gọi prepareGame() từ mô-đun MatchManager.Khi mã chạy, nó sẽ chỉ in văn bản vào cửa sổ Thành phẩm.Chờ đến phần tiếp theo để kiểm tra mã này.
while true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Thử nghiệm các trò chơi nhiều người chơi
Hiện tại, để có mã chạy prepareGame(), nó cần phải thoát khỏi vòng lặp lặp lại.Nhưng, để làm điều đó, cần phải có nhiều hơn một người chơi.Điều này có nghĩa là nếu bạn sử dụng nút playtest, chức năng sẽ không bao giờ chạy vì bạn là người chơi duy nhất trong trò chơi (trừ khi số người chơi tối thiểu của bạn là một).Để kiểm tra điều này, bạn sẽ cần phải mô phỏng một trò chơi nhiều người chơi.
Bắt đầu một máy chủ địa phương
Để kiểm tra mã yêu cầu nhiều hơn một người chơi, tạo một máy chủ địa phương.Trong khi các trò chơi được xuất bản thường ở các máy chủ Roblox, một máy chủ địa phương mô phỏng một trò chơi nhiều người chơi trên máy tính của bạn với những người chơi được mô phỏng.
Để khởi động một máy chủ địa phương, trong tab Thử nghiệm > Khách hàng và Máy chủ > phần > đặt menu thả xuống của người chơi lên số người chơi tối thiểu trong biến GameSetting's của người chơi.Bài học này sử dụng 2 người chơi.
Bấm Bắt đầu để bắt đầu máy chủ.
Chờ vài giây để máy chủ thiết lập.Nhiều cửa sổ sẽ mở bên cạnh cửa sổ Studio ban đầu của bạn.Bạn có thể cần phải cho phép truy cập vào Roblox Studio từ các bộ lửa hoặc phần mềm bảo mật trực tuyến khác.
Mẹo khắc phục sự cố
Tại thời điểm này, bạn không thể xem các máy chủ thử nghiệm, hãy thử một trong những điều sau.
- Nếu bạn có bất kỳ vấn đề nào với máy chủ bắt đầu, hãy kiểm tra lại bài viết Vấn đề Firewall và Router.
- Chỉnh số người chơi thành một số nhỏ, như 2 hoặc 3.
- Nếu vấn đề không được giải quyết, hãy thử khởi động lại Studio hoặc khởi động lại máy tính của bạn.
Thử nghiệm trên máy chủ địa phương
Bạn sẽ thấy nhiều cửa sổ khi máy chủ bắt đầu. Mỗi cửa sổ đại diện cho một phần khác nhau trong mối quan hệ máy chủ/khách hàng.
- Máy chủ (biên giới xanh) chạy trò chơi.
- Khách hàng (biên giới xanh) mô phỏng trải nghiệm của người chơi.


Với máy chủ hoạt động, bạn có thể kiểm tra xem mã có hoạt động không.
Tìm cửa sổ Máy chủ với biên giới xanh.Kiểm tra các tuyên bố in được gọi từ kịch bản MatchManager.Bởi vì có một vòng lặp lặp lại, bạn sẽ thấy các tuyên bố in tương tự lặp lại.
Khi bạn đã hoàn thành kiểm tra, ở bất kỳ cửa sổ nào, hãy đóng máy chủ bằng nút Xóa.Điều này đóng tất cả các cửa sổ Server và Client và đưa bạn trở lại cửa sổ Studio bình thường của bạn.
Mẹo khắc phục sự cố
Tại thời điểm này, nếu các tuyên bố in dự định không xuất hiện, hãy thử một trong những điều sau.
- Kiểm tra xem các chức năng như prepareGame() có nằm trong phạm vi của vòng lặp while true không.
- Nếu in từ MatchManager không hoạt động, hãy kiểm tra một số giải quyết vấn đề thông thường với các kịch bản mô-đun, chẳng hạn như đảm bảo rằng kịch bản MatchManager được yêu cầu trong GameManager hoặc rằng prepareGame() được thêm vào bảng của mô-đun đó.
Hoàn thành các kịch bản
Dưới đây là các kịch bản hoàn thành để kiểm tra lại công việc của bạn.
Tập lệnh GameManager
-- Dịch vụlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Tập lệnh mô-đunlocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))-- Vòng lặp chính trò chơiwhile true dorepeatprint("Starting intermission")task.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()end
Tập lệnh MatchManager
local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager
Tập lệnh GameSettings
local GameSettings = {}-- Biến trò chơiGameSettings.intermissionDuration = 5GameSettings.roundDuration = 10GameSettings.minimumPlayers = 2GameSettings.transitionTime = 5return GameSettings