# HG changeset patch # User Emmanuel Gil Peyrot # Date 1385661343 -3600 # Node ID 2e8ceaa85d5c782febea03d8a05488e5e4c86ed8 # Parent 64a72df88de5cbb73830727466b5a607c5b926de Don’t type the renderer in GameRunner, so that we can switch it without type issues. diff --git a/pytouhou/ui/gamerenderer.pxd b/pytouhou/ui/gamerenderer.pxd --- a/pytouhou/ui/gamerenderer.pxd +++ b/pytouhou/ui/gamerenderer.pxd @@ -10,9 +10,6 @@ cdef class GameRenderer(Renderer): cdef Framebuffer framebuffer cdef BackgroundRenderer background_renderer - cdef void load_background(self, background) except * - cdef void start(self, common) except * - cdef void render(self, Game game) except * cdef void render_game(self, Game game) except * cdef void render_text(self, texts) except * cdef void render_interface(self, interface, game_boss) except * diff --git a/pytouhou/ui/gamerenderer.pyx b/pytouhou/ui/gamerenderer.pyx --- a/pytouhou/ui/gamerenderer.pyx +++ b/pytouhou/ui/gamerenderer.pyx @@ -46,7 +46,17 @@ cdef class GameRenderer(Renderer): self.framebuffer = Framebuffer(0, 0, 640, 480) - cdef void load_background(self, background): + property size: + # We never need to get back the computed size, so size is write-only. + def __set__(self, tuple size): + self.x, self.y, self.width, self.height = size + + + def load_textures(self, dict anms): + self.texture_manager.load(anms) + + + def load_background(self, background): if background is not None: self.background_renderer = BackgroundRenderer(self.use_fixed_pipeline) self.background_renderer.load(background) @@ -54,7 +64,7 @@ cdef class GameRenderer(Renderer): self.background_renderer = None - cdef void start(self, common): + def start(self, common): self.proj = perspective(30, float(common.width) / float(common.height), 101010101./2010101., 101010101./10101.) game_view = setup_camera(0, 0, 1) @@ -63,7 +73,7 @@ cdef class GameRenderer(Renderer): float(common.interface.height), 0.) - cdef void render(self, Game game): + def render(self, Game game): if not self.use_fixed_pipeline: self.framebuffer.bind() diff --git a/pytouhou/ui/gamerunner.pyx b/pytouhou/ui/gamerunner.pyx --- a/pytouhou/ui/gamerunner.pyx +++ b/pytouhou/ui/gamerunner.pyx @@ -17,7 +17,6 @@ cimport cython from pytouhou.lib cimport sdl from .window cimport Window, Runner -from .gamerenderer cimport GameRenderer from .music import MusicPlayer, SFXPlayer, NullPlayer from pytouhou.game.game cimport Game @@ -25,13 +24,16 @@ from pytouhou.game.game cimport Game cdef class GameRunner(Runner): cdef object background, con, resource_loader, keys, replay_level, common cdef Game game - cdef GameRenderer renderer cdef Window window cdef list save_keystates cdef bint skip - def __init__(self, Window window, GameRenderer renderer, common, - resource_loader, bint skip=False, con=None): + # Since we want to support multiple renderers, don’t specify its type. + #TODO: find a way to still specify its interface. + cdef object renderer + + def __init__(self, Window window, renderer, common, resource_loader, + bint skip=False, con=None): self.renderer = renderer self.common = common self.resource_loader = resource_loader @@ -45,12 +47,13 @@ cdef class GameRunner(Runner): self.height = common.interface.height - def load_game(self, Game game, background=None, bgms=None, replay=None, save_keystates=None): + def load_game(self, Game game, background=None, bgms=None, replay=None, + save_keystates=None): self.game = game self.background = background if self.renderer is not None: - self.renderer.texture_manager.load(self.resource_loader.instanced_anms) + self.renderer.load_textures(self.resource_loader.instanced_anms) self.renderer.load_background(background) self.set_input(replay) @@ -63,7 +66,7 @@ cdef class GameRunner(Runner): self.save_keystates = save_keystates null_player = NullPlayer() - if bgms: + if bgms is not None: game.music = MusicPlayer(self.resource_loader, bgms) game.music.play(0) else: @@ -81,7 +84,7 @@ cdef class GameRunner(Runner): @cython.cdivision(True) - cdef void set_renderer_size(self, long width, long height) nogil: + cdef void set_renderer_size(self, long width, long height) except *: if self.renderer is not None: runner_width = float(self.width) runner_height = float(self.height) @@ -89,11 +92,13 @@ cdef class GameRunner(Runner): scale = min(width / runner_width, height / runner_height) - self.renderer.width = int(runner_width * scale) - self.renderer.height = int(runner_height * scale) + new_width = (runner_width * scale) + new_height = (runner_height * scale) - self.renderer.x = (width - self.renderer.width) // 2 - self.renderer.y = (height - self.renderer.height) // 2 + x = (width - new_width) // 2 + y = (height - new_height) // 2 + + self.renderer.size = x, y, new_width, new_height cdef void start(self) except *: diff --git a/pytouhou/ui/texture.pxd b/pytouhou/ui/texture.pxd --- a/pytouhou/ui/texture.pxd +++ b/pytouhou/ui/texture.pxd @@ -3,10 +3,10 @@ from pytouhou.lib.sdl cimport Font cdef class TextureManager: cdef object loader, renderer, texture_class - cdef load(self, dict anms) + cdef void load(self, dict anms) except * cdef class FontManager: cdef Font font cdef object renderer, texture_class - cdef load(self, list labels) + cdef void load(self, list labels) except * diff --git a/pytouhou/ui/texture.pyx b/pytouhou/ui/texture.pyx --- a/pytouhou/ui/texture.pyx +++ b/pytouhou/ui/texture.pyx @@ -32,7 +32,7 @@ cdef class TextureManager: self.texture_class = texture_class - cdef load(self, dict anms): + cdef void load(self, dict anms): for anm in sorted(anms.values(), key=is_ascii): for entry in anm: if not hasattr(entry, 'texture'): @@ -54,7 +54,7 @@ cdef class FontManager: self.texture_class = texture_class - cdef load(self, list labels): + cdef void load(self, list labels): cdef NativeText label for label in labels: