Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ectrimble20/6aab3a1e733447f50c6ff27bc3bedf1a to your computer and use it in GitHub Desktop.
Save ectrimble20/6aab3a1e733447f50c6ff27bc3bedf1a to your computer and use it in GitHub Desktop.
pygame event manager
import pygame
from pygame.locals import *
class EventSubscriber(object):
def process_event(self, event: pygame.event.EventType):
pass
# Static version of the Proto 1 version of the GEM
class GameEventManager(object):
_verbose = False
_events = {}
_subscribers = {
QUIT: set(),
ACTIVEEVENT: set(),
KEYDOWN: set(),
KEYUP: set(),
MOUSEMOTION: set(),
MOUSEBUTTONUP: set(),
MOUSEBUTTONDOWN: set(),
JOYAXISMOTION: set(),
JOYBALLMOTION: set(),
JOYHATMOTION: set(),
JOYBUTTONUP: set(),
JOYBUTTONDOWN: set(),
VIDEORESIZE: set(),
VIDEOEXPOSE: set(),
USEREVENT: set()
}
_paused = {}
@staticmethod
def process():
for event in pygame.event.get():
for subscriber in GameEventManager._subscribers[event.type]:
if event.type in GameEventManager._paused.keys() and subscriber in GameEventManager._paused[event.type]:
continue # paused event
subscriber.process_event(event)
GameEventManager._log("Event {} pushed to subscriber {}".format(event, subscriber))
@staticmethod
def subscribe(event_type: int, subscriber: EventSubscriber):
if event_type not in GameEventManager._subscribers.keys():
raise IndexError("Unrecognized event type {}".format(event_type))
GameEventManager._log("Subscribed {} to event {}".format(subscriber, event_type))
GameEventManager._subscribers[event_type].add(subscriber)
@staticmethod
def unsubscribe(event_type: int, subscriber: EventSubscriber):
if event_type in GameEventManager._subscribers.keys() and \
subscriber in GameEventManager._subscribers[event_type]:
GameEventManager._subscribers[event_type].remove(subscriber)
GameEventManager._log("Unsubscribed {} from event {}".format(subscriber, event_type))
@staticmethod
def pause_event_subscription(event_type, subscriber: EventSubscriber):
if event_type not in GameEventManager._subscribers.keys():
raise IndexError("Unrecognized event type {}".format(event_type))
if event_type not in GameEventManager._paused.keys():
GameEventManager._paused[event_type] = set()
GameEventManager._paused[event_type].add(subscriber)
GameEventManager._log("Paused subscription to event {} for sub {}".format(event_type, subscriber))
@staticmethod
def resume_event_subscription(event_type, subscriber: EventSubscriber):
if event_type not in GameEventManager._paused.keys():
raise IndexError("Unrecognized event type {}".format(event_type))
if subscriber in GameEventManager._paused[event_type]:
GameEventManager._paused[event_type].remove(subscriber)
GameEventManager._log("Resumed subscription to event {} for sub {}".format(event_type, subscriber))
@staticmethod
def toggle_verbose():
GameEventManager._verbose = not GameEventManager._verbose
@staticmethod
def _log(msg):
if GameEventManager._verbose:
print("GEM: {}".format(msg))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment