import json
import os
+import pygame.image
+import pygame.font
+import pygame.display
+import pygame.mixer
+
+from .constants import DEBUG
+from .transforms import NullTransform
+
class Loader(object):
""" Load data files from beneath a prefix. """
+ NULL_TRANSFORM = NullTransform()
+
def __init__(self, prefix):
self._prefix = prefix
+ self._cache = {}
def full_path(self, *parts):
path = "/".join(parts)
rel_path = os.path.join(*path.split("/"))
abs_path = os.path.join(self._prefix, rel_path)
- print abs_path
+ if DEBUG:
+ print abs_path
return abs_path
def open_file(self, *parts):
with self.open_file("stations", *parts) as f:
return json.load(f)
+ def load_image(self, *parts, **kwargs):
+ """Return a pygame surface of the requested image."""
+ fn = self.full_path("images", *parts)
+ transform = kwargs.pop("transform", self.NULL_TRANSFORM)
+ img = self._cache.get((fn, transform), None)
+ if img is None:
+ img = pygame.image.load(fn)
+ # We assume pygame.display has been initialised
+ # Fix this if that changes
+ img.convert_alpha(pygame.display.get_surface())
+ img = transform.apply(img)
+ self._cache[(fn, transform)] = img
+ return img
+
+ def load_font(self, *parts, **kwargs):
+ """Return a pygame font of the given size"""
+ size = kwargs.get('size', 12)
+ fn = self.full_path("fonts", *parts)
+ font = pygame.font.Font(fn, size)
+ # Do we need to cache this?
+ return font
+
+ def load_sound(self, *parts):
+ """Return a pygame sound"""
+ fn = self.full_path("sounds", *parts)
+ sound = self._cache.get(fn, None)
+ if not sound:
+ sound = pygame.mixer.Sound(fn)
+ self._cache[fn] = sound
+ return sound
+
_DATA_PREFIX = os.path.abspath(
os.path.join(os.path.dirname(__file__), "..", "data"))