Systèmes d’événements en Lua
Créez un répartiteur d’événements léger avec des fonctions de rappel stockées dans des tables.
Systèmes d’événements en Lua est une leçon Lua Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Lua Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Lua Academy comprend 4 leçons au total.
Pourquoi des systèmes d’événements ?
Un système d’événements découple les producteurs (éléments qui déclenchent les événements) des consommateurs (éléments qui y réagissent). En Lua, il se construit facilement avec des tables de fonctions de rappel.
Répartiteur d’événements simple
Un répartiteur stocke des listes d’écouteurs indexées par nom d’événement.
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
endUtiliser le répartiteur
Abonnez-vous aux événements avec :on et déclenchez-les avec :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)Écouteurs ponctuels
Une méthode :once enveloppe la fonction de rappel afin de la désinscrire après le premier appel.
function EventEmitter:once(event, fn)
local wrapper
wrapper = function(...)
self:off(event, wrapper)
fn(...)
end
self:on(event, wrapper)
endSupprimer des écouteurs
Une méthode :off supprime un écouteur précis à partir de sa référence.
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
endFiles de priorité pour les événements
Ajoutez un champ de priorité à chaque écouteur. Triez la liste lors de l'inscription afin que les gestionnaires prioritaires s'exécutent en premier.
File d'événements asynchrones
Au lieu d'appeler immédiatement les écouteurs, placez les événements dans une file et traitez-les à chaque image ou cycle.
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
endEmpêcher les modifications pendant l'émission
Lors de l'émission, parcourez une copie de la liste des écouteurs afin que les ajouts ou suppressions pendant l'émission ne provoquent pas de bogues.
Événements avec espaces de noms
Utilisez des noms d'événements séparés par des points ("player.damaged", "player.healed") pour organiser les événements par système.
Tables d'écouteurs faibles
Utilisez des tables d'écouteurs à valeurs faibles afin que, si un objet abonné est récupéré par le ramasse-miettes, son écouteur soit automatiquement supprimé, ce qui évite les fuites dans les jeux exécutés longtemps.
Intégration à la boucle de jeu
Intégrez le système d'événements à la boucle de jeu : événements d'entrée → événements de logique → événements de rendu, traités dans cet ordre à chaque image.
Question sur le système d'événements
Quel est le principal avantage d'un système d'événements ?
Récapitulatif : systèmes d'événements
Les systèmes d'événements Lua utilisent une table de listes d'écouteurs nommées. Implémentez on, emit, off et once pour créer un répartiteur complet. Utilisez des files asynchrones et des tables faibles dans les jeux en production.
Questions Fréquemment Posées
La leçon « Systèmes d’événements en Lua » est-elle gratuite ?
Oui — le texte complet de « Systèmes d’événements en Lua » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Lua Academy, passe à CoddyKit PRO. Le cours Lua Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Systèmes d’événements en Lua » ?
Créez un répartiteur d’événements léger avec des fonctions de rappel stockées dans des tables. Tu pratiques Lua Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Lua Academy ?
Aucune expérience préalable n'est requise. Lua Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Systèmes d’événements en Lua » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Lua Academy ?
Oui. Chaque leçon Lua Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Systèmes d’événements en Lua
- Scripts fondés sur des composants
- Comportement de l’IA avec les machines à états
- Configuration pilotée par les données et rechargement à chaud