1 # -*- coding: utf-8 -*-
3 Décorateur, métaclasse et classe mixin pour faciliter
4 l'implémentation des gestionnaires d'événements pygame.
7 - hériter de EventHandlerMixin
8 - décorer les méthodes gestionnaires d'événements avec le décorateur 'event_handler'
9 en passant en paramètre le code d'événement pygame
11 Il n'existe aucune contrainte sur le nommage de la méthode décorée.
12 La méthode gestionnaire d'événement reçoit l'événement pygame comme unique paramètre.
17 class Machin(pygame.sprite.Sprite, EventHandlerMixin) :
21 @event_handler(pygame.KEYDOWN)
22 def handleKeyDown(self, event) :
32 class _EventDispatcher
:
36 def addEventListener(self
, eventType
, listener
) :
37 if self
.registry
.has_key(eventType
) :
38 self
.registry
[eventType
].append(listener
)
40 self
.registry
[eventType
] = [listener
]
42 def dispatchEvents(self
) :
43 events
= pygame
.event
.get()
45 listeners
= self
.registry
.get(event
.type, [])
46 for listener
in listeners
:
49 EventDispatcher
= _EventDispatcher()
51 def event_handler(eventType
) :
52 def markFunctionAsListener(m
) :
53 m
.__islistener
__ = True
54 m
.__eventtype
__ = eventType
56 return markFunctionAsListener
59 class EventInitializer(type):
61 def __init__(cls
, name
, bases
, dict) :
62 def init_listeners(self
) :
63 for k
, v
in dict.items() :
64 if isinstance(v
, types
.FunctionType
) and hasattr(v
, '__islistener__') :
65 listener
= getattr(self
, k
)
66 EventDispatcher
.addEventListener(v
.__eventtype
__, listener
)
70 def ctor(self
, *args
, **kw
) :
72 default_ctor
= dict.get('__init__')
74 super(cls
, self
).__init
__(*args
, **kw
)
76 default_ctor(self
, *args
, **kw
)
81 class EventHandlerMixin(object) :
82 __metaclass__
= EventInitializer
85 # event = pygame.event.wait()
86 # handler = getattr(self, 'eventHandler%s' % event.type, lambda e:None)