0Pricing
Lua Academy · บทเรียน

ระบบเหตุการณ์ใน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ระบบเหตุการณ์ใน Lua
  2. การเขียนสคริปต์แบบใช้คอมโพเนนต์
  3. พฤติกรรมของปัญญาประดิษฐ์ด้วยเครื่องจักรสถานะ
  4. การกำหนดค่าและโหลดใหม่แบบขับเคลื่อนด้วยข้อมูล
← กลับไปที่ Lua Academy