# HG changeset patch # User Thibaut Girka # Date 1325448770 -3600 # Node ID 901489c21d190f83401adf845a65039a07d560c0 # Parent 0e1762b1ab9f9b04cd033fa8906341095672ffcc Fix a few crashes in the anmrunner, disable fullscreen switch, change alt+Fx to shift+Fx diff --git a/pytouhou/formats/anm0.py b/pytouhou/formats/anm0.py --- a/pytouhou/formats/anm0.py +++ b/pytouhou/formats/anm0.py @@ -137,7 +137,7 @@ class Animations(object): time, opcode, args = instr if opcode == 5: args = (instruction_offsets.index(args[0]),) - if opcode == 22: + elif opcode == 22: interrupt = args[0] anm.scripts[i].interrupts[interrupt] = j + 1 anm.scripts[i][j] = time, opcode, args diff --git a/pytouhou/ui/anmrenderer.py b/pytouhou/ui/anmrenderer.py --- a/pytouhou/ui/anmrenderer.py +++ b/pytouhou/ui/anmrenderer.py @@ -22,7 +22,7 @@ from pyglet.gl import (glMatrixMode, glL GL_TEXTURE_2D, GL_BLEND, GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST, GL_COLOR_ARRAY, GL_VERTEX_ARRAY, GL_TEXTURE_COORD_ARRAY, - glClear, GL_COLOR_BUFFER_BIT) + glClearColor, glClear, GL_COLOR_BUFFER_BIT) from pytouhou.game.sprite import Sprite from pytouhou.vm.anmrunner import ANMRunner @@ -46,6 +46,7 @@ class ANMRenderer(pyglet.window.Window, self._anm_wrapper = anm_wrapper self.anm = anm_wrapper.anm_files[0] self.sprites = sprites + self.clear_color = (0., 0., 0., 1.) if sprites: self.items = self.anm.sprites else: @@ -102,9 +103,6 @@ class ANMRenderer(pyglet.window.Window, def on_key_press(self, symbol, modifiers): if symbol == pyglet.window.key.ESCAPE: self.has_exit = True - # XXX: Fullscreen will be enabled the day pyglet stops sucking - elif symbol == pyglet.window.key.F11: - self.set_fullscreen(not self.fullscreen) elif symbol == pyglet.window.key.W: self.load() elif symbol == pyglet.window.key.X: @@ -115,32 +113,33 @@ class ANMRenderer(pyglet.window.Window, self.change(+1) elif symbol == pyglet.window.key.TAB: self.toggle_sprites() + elif symbol == pyglet.window.key.SPACE: + self.toggle_clear_color() elif symbol >= pyglet.window.key.F1 and symbol <= pyglet.window.key.F12: interrupt = symbol - pyglet.window.key.F1 + 1 - if modifiers == pyglet.window.key.MOD_CTRL: + if modifiers & pyglet.window.key.MOD_SHIFT: interrupt += 12 - self._anmrunner.interrupt(interrupt) + if not self.sprites: + self._anmrunner.interrupt(interrupt) def load(self, index=None): if index is None: index = self.num self._sprite = Sprite() - print index if self.sprites: self._sprite.anm, self._sprite.texcoords = self._anm_wrapper.get_sprite(index) + print('Loaded sprite %d' % index) else: self._anmrunner = ANMRunner(self._anm_wrapper, index, self._sprite) - self._anmrunner.run_frame() + print('Loading anim %d, handled events: %r' % (index, self._anmrunner.script.interrupts.keys())) self.num = index def change(self, diff): keys = self.items.keys() keys.sort() - index = keys.index(self.num) + diff - if index < 0 or index >= len(keys): - return + index = (keys.index(self.num) + diff) % len(keys) item = keys[index] self.load(item) @@ -151,13 +150,22 @@ class ANMRenderer(pyglet.window.Window, self.items = self.anm.sprites else: self.items = self.anm.scripts - self.load() + self.load(0) + + + def toggle_clear_color(self): + if self.clear_color[0] == 0.: + self.clear_color = (1., 1., 1., 1.) + else: + self.clear_color = (0., 0., 0., 1.) def update(self): if not self.sprites: - self._anmrunner.run_frame() + self._anmrunner.run_frame() + glClearColor(*self.clear_color) glClear(GL_COLOR_BUFFER_BIT) - self.render_elements([self]) + if not self._sprite._removed: + self.render_elements([self]) diff --git a/pytouhou/vm/anmrunner.py b/pytouhou/vm/anmrunner.py --- a/pytouhou/vm/anmrunner.py +++ b/pytouhou/vm/anmrunner.py @@ -48,11 +48,10 @@ class ANMRunner(object): new_ip = self.script.interrupts.get(-1, None) if new_ip is None: return False - else: - self.instruction_pointer = new_ip - self.frame, opcode, args = self.script[self.instruction_pointer] - self.waiting = False - return True + self.instruction_pointer = new_ip + self.frame, opcode, args = self.script[self.instruction_pointer] + self.waiting = False + return True def run_frame(self):