أنظمة الأحداث في Lua
أنشئ موزّع أحداث خفيفًا باستخدام دوال الاستدعاء المخزنة في الجداول
أنظمة الأحداث في Lua درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
لماذا أنظمة الأحداث؟
يفصل نظام الأحداث بين المنتجين (الأشياء التي تطلق الأحداث) والمستهلكين (الأشياء التي تستجيب لها). وفي Lua، يمكن بناؤه بسهولة باستخدام جداول من دوال callback.
موزّع أحداث بسيط
يخزّن الموزّع قوائم المستمعين المفهرسة باسم الحدث.
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 دالة الاستدعاء بحيث تلغي تسجيل نفسها بعد الاستدعاء الأول.
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» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «أنظمة الأحداث في Lua»؟
أنشئ موزّع أحداث خفيفًا باستخدام دوال الاستدعاء المخزنة في الجداول تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «أنظمة الأحداث في Lua»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أنظمة الأحداث في Lua
- البرمجة النصية المعتمدة على المكوّنات
- سلوك الذكاء الاصطناعي باستخدام آلات الحالات
- الإعداد المعتمد على البيانات وإعادة التحميل الفوري