ระบบเหตุการณ์ใน Lua
สร้างตัวกระจายเหตุการณ์ขนาดเล็ก โดยจัดเก็บฟังก์ชันเรียกกลับไว้ในตาราง
ระบบเหตุการณ์ใน Lua เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงใช้ระบบเหตุการณ์
ระบบเหตุการณ์ช่วยแยกผู้ผลิต (สิ่งที่ส่งเหตุการณ์) ออกจากผู้บริโภค (สิ่งที่ตอบสนองต่อเหตุการณ์) ใน Lua สามารถสร้างระบบนี้ได้ง่ายด้วยตารางฟังก์ชันเรียกกลับ
ตัวกระจายเหตุการณ์อย่างง่าย
ตัวกระจายจะเก็บรายการตัวรับฟังโดยใช้ชื่อเหตุการณ์เป็นคีย์
local EventEmitter = {}
EventEmitter.__index = EventEmitter
function EventEmitter.new()
return setmetatable({_listeners = {}}, EventEmitter)
end
function EventEmitter:on(event, fn)
self._listeners[event] = self._listeners[event] or {}
table.insert(self._listeners[event], fn)
end
function EventEmitter:emit(event, ...)
for _, fn in ipairs(self._listeners[event] or {}) do
fn(...)
end
endการใช้ตัวกระจาย
สมัครรับเหตุการณ์ด้วย :on และส่งเหตุการณ์ด้วย :emit
local bus = EventEmitter.new()
bus:on("playerHit", function(player, damage)
player.hp = player.hp - damage
print(player.name, "took", damage, "damage")
end)
bus:emit("playerHit", {name="Alice", hp=100}, 15)ตัวรับฟังแบบเรียกใช้ครั้งเดียว
เมธอด :once จะห่อหุ้ม callback เพื่อยกเลิกการลงทะเบียนตัวเองหลังจากถูกเรียกครั้งแรก
function EventEmitter:once(event, fn)
local wrapper
wrapper = function(...)
self:off(event, wrapper)
fn(...)
end
self:on(event, wrapper)
endการนำตัวรับฟังออก
เมธอด :off จะนำตัวรับฟังที่ระบุออกโดยอ้างอิงจากตัวรับฟังนั้น
function EventEmitter:off(event, fn)
local list = self._listeners[event]
if not list then return end
for i, f in ipairs(list) do
if f == fn then table.remove(list, i); return end
end
endคิวลำดับความสำคัญสำหรับเหตุการณ์
เพิ่มฟิลด์ลำดับความสำคัญให้ตัวรับฟังแต่ละตัว จัดเรียงรายการขณะลงทะเบียน เพื่อให้ตัวจัดการที่มีลำดับความสำคัญสูงทำงานก่อน
คิวเหตุการณ์แบบอะซิงโครนัส
แทนที่จะเรียกตัวรับฟังทันที ให้เพิ่มเหตุการณ์ลงในคิว แล้วประมวลผลคิวในแต่ละเฟรมหรือจังหวะการทำงาน
local queue = {}
local function postEvent(event, data)
queue[#queue+1] = {event=event, data=data}
end
local function processEvents()
local current = queue
queue = {}
for _, e in ipairs(current) do
bus:emit(e.event, e.data)
end
endป้องกันการแก้ไขระหว่างการส่งเหตุการณ์
ขณะส่งเหตุการณ์ ให้ทำซ้ำรายการตัวรับฟังจากสำเนา เพื่อไม่ให้การเพิ่มหรือนำตัวรับฟังออกระหว่างการส่งทำให้เกิดข้อผิดพลาด
เหตุการณ์แบบมีเนมสเปซ
ใช้ชื่อเหตุการณ์ที่คั่นด้วยจุด ("player.damaged", "player.healed") เพื่อจัดกลุ่มเหตุการณ์ตามระบบ
ตารางตัวรับฟังแบบอ่อน
ใช้ตารางตัวรับฟังที่มีค่าอ้างอิงแบบอ่อน เพื่อให้เมื่อออบเจกต์ผู้สมัครรับเหตุการณ์ถูกตัวเก็บขยะ (GC) เก็บไป ตัวรับฟังของออบเจกต์นั้นถูกนำออกโดยอัตโนมัติ ซึ่งช่วยป้องกันหน่วยความจำรั่วในเกมที่ทำงานเป็นเวลานาน
การผสานเข้ากับลูปเกม
ผสานระบบเหตุการณ์เข้ากับลูปเกม: เหตุการณ์อินพุต → เหตุการณ์ตรรกะ → เหตุการณ์การเรนเดอร์ โดยประมวลผลตามลำดับในแต่ละเฟรม
คำถามเกี่ยวกับระบบเหตุการณ์
ประโยชน์หลักของระบบเหตุการณ์คืออะไร
ทบทวน: ระบบเหตุการณ์
ระบบเหตุการณ์ของ Lua ใช้ตารางรายการตัวรับฟังที่มีชื่อกำกับ ให้ใช้งาน on, emit, off และ once เพื่อสร้างตัวกระจายเหตุการณ์ที่สมบูรณ์ ในเกมที่ใช้งานจริง ให้ใช้คิวแบบอะซิงโครนัสและตารางแบบอ่อน
คำถามที่พบบ่อย
บทเรียน “ระบบเหตุการณ์ใน Lua” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ระบบเหตุการณ์ใน Lua” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ระบบเหตุการณ์ใน Lua”
สร้างตัวกระจายเหตุการณ์ขนาดเล็ก โดยจัดเก็บฟังก์ชันเรียกกลับไว้ในตาราง คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ระบบเหตุการณ์ใน Lua” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ระบบเหตุการณ์ใน Lua
- การเขียนสคริปต์แบบใช้คอมโพเนนต์
- พฤติกรรมของปัญญาประดิษฐ์ด้วยเครื่องจักรสถานะ
- การกำหนดค่าและโหลดใหม่แบบขับเคลื่อนด้วยข้อมูล