เขียนลูปเกม

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

เมื่อสร้างแผนที่แล้ว ถึงเวลาที่จะเริ่มสร้างสคริปต์ส่วนที่เหลือของหลักสูตรนี้จะมุ่งเน้นไปที่การเขียนสคริปต์ทั้งหมดขององค์ประกอบที่แตกต่างกันของลูปเกม

ตั้งค่าสคริปต์

การต่อสู้รอยัลจะใช้การผสมผสานของสคริปต์โมดูลและสคริปต์ปกติ ด้านล่างนี้เป็นสคริปต์และฟังก์ชันของพวกเขา

ผู้จัดการเกมสคริปต์ ทำงานฟังก์ชันจากผู้จัดการการจับคู่โดยใช้ตัวแปรจากการตั้งค่าเกม
ผู้จัดการการจับคู่สคริปต์โมดูล ตรงกัน
การตั้งค่าเกมสคริปต์โมดูล เก็บตัวแปรทั่วไปที่ใช้โดยสคริปต์อื่น

สคริปต์ GameSettings

สร้างสคริปต์โมดูลชื่อ GameSettings เพื่อเก็บตัวแปรที่ใช้โดยสคริปต์อื่นๆ เช่น ระยะเวลาการแข่งขันและช่วงพักตัวแปรเหล่านี้จะถูกใช้โดยสคริปต์ GameManager ในภายหลัง

  1. ใน ServerStorage สร้างโฟลเดอร์ชื่อ ModuleScripts ในโฟลเดอร์นั้นสร้างสคริปต์โมดูลใหม่ชื่อ GameSettings

  2. เปิดการตั้งค่าเกมและเปลี่ยนชื่อตารางโมดูลให้ตรงกับชื่อสคริปต์


    local GameSettings = {}
    return GameSettings
  3. ในตารางโมดูล เพิ่มตัวแปรสำหรับการใช้งานต่อไปนี้ ใช้ความคิดเห็นที่ดีที่สุดสำหรับแต่ละค่า คุณสามารถเปลี่ยนได้ในภายหลังเมื่อคุณทดสอบ

    • ระยะเวลาช่วงพัก - ตรงกัน
    • ระยะเวลาการจับคู่ - ความยาวของการจับคู่ในวินาที
    • ผู้เล่นขั้นต่ำ - จำนวนผู้เล่นน้อยที่สุดที่จำเป็นต้องเริ่มต้น
    • เวลาเปลี่ยนผ่าน - เวลาก่อนและหลังการแข่งขันในวินาที ทำให้การเปลี่ยนผ่านระหว่างส่วนต่างๆของลูปเกมน้อยลงอย่างกะทันหัน

    local GameSettings = {}
    -- ตัวแปรเกม
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

สคริปต์ MatchManager

สคริปต์ที่สองที่เชื่อมต่อกับ GameManager คือ MatchManagerสคริปต์นี้จัดการงานเช่นเริ่มตัวจับเวลาหรือรีเซ็ตผู้เล่นเมื่อการแข่งขันสิ้นสุด

ภายใน MatchManager มีฟังก์ชันชื่อ prepareGame() ตรงกัน

  1. ใน ServerStorage > ModuleScripts > เพิ่มสคริปต์โมดูลชื่อ MatchManager เปลี่ยนชื่อตารางโมดูล


    local MatchManager = {}
    return MatchManager
  2. เพิ่มฟังก์ชันโมดูลใหม่ให้กับ MatchManager ชื่อ prepareGame() รวมถึงคำสั่งพิมพ์เพื่อทดสอบสคริปต์ในภายหลัง


    local MatchManager = {}
    function MatchManager.prepareGame()
    print("Game starting!")
    end
    return MatchManager

เขียนลูปเกม

ลูปเกมหลักจะถูกเขียนในสคริปต์ GameManager โดยใช้ตัวแปรที่เพิ่งสร้างขึ้นจำไว้ว่ามีสามขั้นตอนในวงจรเกม: ช่วงพักกิจกรรม, การแข่งขัน, และการล้างและรีเซ็ต

สคริปต์ GameManager

สคริปต์นี้เป็นสคริปต์เซิร์ฟเวอร์ปกติดังนั้นใส่ลงใน ServerScriptService แทนที่จะเป็นโฟลเดอร์สคริปต์โมดูลลูปเกมจริงจะอยู่ในลูป while true do ชั่วคราว

  1. ใน ServerScriptService สร้างสคริปต์ใหม่ชื่อ GameManager

  2. เพิ่มตัวแปรสำหรับบริการ "ServerStorage" ซึ่งเป็นที่ที่ Modulescripts อยู่จากนั้นเพิ่มตัวแปรสำหรับบริการ "ผู้เล่น" ซึ่งจะต้องใช้เพื่อตรวจสอบจํานวนผู้เล่นในระหว่างช่วงพัก


    -- บริการ
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. เพื่อใช้โมดูลที่สร้างไว้ล่วงหน้า:

    • ตั้งแปรชื่อ moduleScripts ไปยังตำแหน่งของโฟลเดอร์ ModuleScripts
    • เพิ่มตัวแปรที่ชื่อ matchManager และ gameSettings กำหนดให้แต่ละตัวแปรต้องใช้สคริปต์ตามลำดับ

    -- บริการ
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- สคริปต์โมดูล
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
  4. หลังจากแปรแล้วเพิ่มลูป while true do ลูปทั้งหมดของเกมลูปจะไปภายในเพื่อทำซ้ำอย่างไม่มีกำหนด


    -- สคริปต์โมดูล
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- ลูปเกมหลัก
    while true do
    end

บันทึกช่วงระยะหยุด

ในขณะที่วงล้อเกมทำงานได้ตลอดไป ช่วงระยะหยุดควรหยุดวงล้อและเพียงดำเนินการต่อเมื่อมีผู้เล่นเพียงพอสำหรับการแข่งขันเพื่อโค้ดการหยุดชั่วคราวนี้ รวมลูปซ้ำที่ซ้อนกันสำหรับช่วงพักในลูป whileลูปซ้อนที่จะทำซ้ำจนกว่าจะมีผู้เล่นเพียงพอ หยุดลูปหลักเมื่อมีผู้เล่นเพียงพอแล้ว ตรงกัน

ด้วยลูปซ้ำ **** รหัสในลูปจะทำงานอย่างน้อยหนึ่งครั้งไม่เหมือนกับลูป while ตรงกัน

  1. ในลูป while true do ให้พิมพ์ repeat และกด Enter เพื่อเสร็จสิ้นด้วยคีย์เวิร์ด until


    while true do
    repeat
    until
    end
  2. ตรวจสอบว่าจํานวนผู้เล่นปัจจุบัน (#Players:GetPlayers()) มากกว่าหรือเท่ากับตัวแปร minimumPlayers ที่สร้างไว้ก่อนในโมดูล GameSettings


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. ในลูปซ้ำเพิ่มคำสั่งพิมพ์ที่ระบุว่าช่วงระยะหยุดกำลังเริ่มใช้ task.wait() เพื่อหยุดชั่วคราวระหว่างช่วงพักโดยใช้ intermissionDuration จาก GameSettings


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. ทดสอบและตรวจสอบว่าคำสั่งพิมพ์ "Starting intermission" จะแสดงอย่างน้อยสองครั้งการเห็นข้อความสองครั้งพิสูจน์ว่าลูปซ้ำไม่พบผู้เล่นเพียงพอและทำงานอีกครั้งคุณจะต้องรอระยะเวลาระหว่างการรอก่อนที่จะเห็นข้อความเป็นครั้งที่สอง

เคล็ดลับการแก้ปัญหา

ในจุดนี้ หากคุณไม่ได้เกิดขึ้นตามที่ตั้งใจไว้ ลองหนึ่งในสิ่งต่อไปนี้

  • task.wait() ควรอยู่ภายในลูปซ้ำโดยไม่ต้องรอ สคริปต์จะทำงานหลายครั้งในหนึ่งวินาที ทำให้ Roblox Studio เต็มและทําให้เกิดข้อผิดพลาด
  • ในโมดูลการตั้งค่าเกม ตัวแปร intermissionDuration ควรมากกว่า 1 หากต่ำกว่า สคริปต์จะสามารถทำซ้ำบ่อยเกินไปทำให้เกิดปัญหาช้าลง

สิ้นสุดการหยุดชะงัก

เมื่อมีผู้เล่นเพียงพอแล้ว ให้พวกเขารอเวลาเปลี่ยนผ่านสั้น ๆจากนั้นส่งพวกเขาไปยังการแข่งขันโดยโทรไปที่ฟังก์ชัน prepareGame() ใน MatchManagerจำไว้ว่าฟังก์ชันนี้เพียงแค่พิมพ์บรรทัด แต่คุณจะเพิ่มโค้ดเพิ่มเติมในภายหลัง

  1. เมื่อสิ้นสุดลูปซ้ำให้เพิ่มคำสั่งพิมพ์ที่ระบุว่าช่วงพักสิ้นสุดแล้วเพื่อทดสอบโค้ดของคุณจากนั้นให้ทำตามด้วยตัวแปร task.wait() ของ GameSetting's transitionTime โดยใช้


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. หลังจากรอ โทรไปที่ prepareGame() จากโมดูล MatchManagerเมื่อรหัสทำงานแล้ว จะพิมพ์ข้อความลงในหน้าต่างเอาต์พุตเท่านั้นรอจนถึงส่วนถัดไปเพื่อทดสอบรหัสนี้


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    end

ทดสอบเกมผู้เล่นหลายคน

ตอนนี้, เพื่อให้โค้ดทำงาน prepareGame() , ต้องออกจากลูปซ้ำแต่เพื่อที่จะทำเช่นนั้นจำเป็นต้องมีผู้เล่นมากกว่าหนึ่งคนซึ่งหมายความว่าหากคุณใช้ปุ่มเล่นทดสอบฟังก์ชันจะไม่ทำงานเพราะคุณเป็นผู้เล่นเพียงคนเดียวในเกม (เว้นแต่ผู้เล่นขั้นต่ำของคุณเป็นหนึ่ง)เพื่อทดสอบสิ่งนี้คุณจะต้องจำลองเกมผู้เล่นหลายคน

เริ่มเซิร์ฟเวอร์ท้องถิ่น

เพื่อทดสอบโค้ดที่ต้องการผู้เล่นมากกว่าหนึ่งคน สร้างเซิร์ฟเวอร์ท้องถิ่นในขณะที่เกมที่เผยแพร่มักจะอยู่บนเซิร์ฟเวอร์ Roblox แต่ เซิร์ฟเวอร์ท้องถิ่น จะจำลองเกมผู้เล่นหลายคนบนคอมพิวเตอร์ของคุณด้วยผู้เล่นจำลอง

  1. เพื่อเริ่มต้นเซิร์ฟเวอร์ท้องถิ่นในแท็บ ทดสอบ > ไคลเอนต์และเซิร์ฟเวอร์ ส่วน > ตั้งการดรอปดาวน์ของผู้เล่นให้เป็นจํานวนผู้เล่นที่น้อยที่สุดในแปรของ GameSetting's variable minimumPlayersบทเรียนนี้ใช้ผู้เล่น 2 คน

  2. คลิกเริ่มเพื่อเริ่มต้นเซิร์ฟเวอร์

  3. รอไม่กี่วินาทีให้เซิร์ฟเวอร์ตั้งค่าหน้าต่างหลายบานจะเปิดขึ้นเพิ่มเติมจากหน้าต่าง Studio เดิมคุณอาจต้องอนุญาตการเข้าถึง Roblox Studio จากไฟร์วอลล์หรือซอฟต์แวร์รักษาความปลอดภัยออนไลน์อื่นๆ

เคล็ดลับการแก้ปัญหา

ในจุดนี้คุณไม่สามารถเห็นเซิร์ฟเวอร์ทดสอบได้ ลองหนึ่งในสิ่งต่อไปนี้

  • หากคุณมีปัญหาใดๆ กับการเริ่มต้นของเซิร์ฟเวอร์ให้ตรวจสอบบทความ ปัญหาเกี่ยวกับไฟร์วอลล์และเราเตอร์ อีกครั้ง
  • ตั้งจำนวนผู้เล่นเป็นจำนวนเล็กน้อย เช่น 2 หรือ 3
  • หากปัญหายังไม่ได้รับการแก้ไข ลองรีสตาร์ท Studio หรือรีสตาร์ทคอมพิวเตอร์ของคุณ

ทดสอบในเซิร์ฟเวอร์ท้องถิ่น

คุณจะเห็นหน้าต่างหลายบานเมื่อเซิร์ฟเวอร์เริ่มต้น แต่ละหน้าต่างแทนที่ตัวแทนส่วนต่างๆ ของเซิร์ฟเวอร์/คลายเซิร์ฟเวอร์

  • เซิร์ฟเวอร์ (ขอบสีเขียว) เรียกเกม
  • ไคลเอนต์ (ขอบสีฟ้า) จำลองประสบการณ์ของผู้เล่น
เซิร์ฟเวอร์ที่มีขอบสีเขียว
ไคลเอนต์ที่มีขอบสีฟ้า

เมื่อเซิร์ฟเวอร์ทำงานแล้ว คุณสามารถตรวจสอบได้ว่าโค้ดทำงานได้หรือไม่

  1. ค้นหาหน้าต่าง เซิร์ฟเวอร์ ที่มีขอบสีเขียวตรวจสอบสำหรับคำสั่งพิมพ์ที่เรียกจากสคริปต์ MatchManagerเนื่องจากมีลูปซ้ำ คุณจะเห็นคำสั่งพิมพ์เดียวกันซ้ำ

  2. เมื่อคุณทดสอบเสร็จแล้ว ในหน้าต่างใดก็ได้ ปิดเซิร์ฟเวอร์โดยใช้ปุ่มล้างการดำเนินการนี้จะปิดหน้าต่างเซิร์ฟเวอร์และไคลเอนต์ทั้งหมดและนำคุณกลับไปที่หน้าต่างสตูดิโอปกติ

เคล็ดลับการแก้ปัญหา

ในจุดนี้หากคำสั่งพิมพ์ที่ตั้งใจไว้ไม่ปรากฏขึ้น ลองหนึ่งในสิ่งต่อไปนี้

  • ตรวจสอบว่าฟังก์ชันเช่น prepareGame() อยู่ในขอบเขตของลูป while true
  • หากการพิมพ์จาก MatchManager ไม่ทำงาน ตรวจสอบปัญหาทั่วไปในการแก้ไขด้วยสคริปต์โมดูล เช่น ตรวจสอบให้แน่ใจว่าสคริปต์ MatchManager จำเป็นใน GameManager หรือว่า prepareGame() ถูกเพิ่มลงในตารางของโมดูลนั้น

สคริปต์สําเร็จ

ด้านล่างเป็นสคริปต์ที่เสร็จสมบูรณ์เพื่อตรวจสอบงานของคุณอีกครั้ง

สคริปต์ GameManager


-- บริการ
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- สคริปต์โมดูล
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- ลูปเกมหลัก
while true do
repeat
print("Starting intermission")
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
end

สคริปต์ MatchManager


local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager

สคริปต์ GameSettings


local GameSettings = {}
-- ตัวแปรเกม
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings