I'm having trouble with drawing labels with Pyglet. In order to do loose coupling between the game model and view, I have a system set up where game objects create their own sprite which are later added through an event system to a single batch (the View in MVC). Here's how that happens:
[source lang="python"] class View: _map = ('player', 'player_bullet', 'player_hb', 'enemy', 'item', 'enemy_bullet', 'ui', 'ui_element') def __init__(self): self.batch = pyglet.graphics.Batch() self.groups = dict(zip(self.__class__._map, [OrderedGroup(i) for i in range(len(self.__class__._map))])) def on_draw(self): globals.WINDOW.clear() self.batch.draw() def on_add_sprite(self, sprite, group): if isinstance(sprite, Label): self.add_label(sprite, group) else: self.add_sprite(sprite, group) def add_label(self, label, group): set_label_group(label, self.groups[group]) label.batch = self.batch label._own_batch = False def add_sprite(self, sprite, group): try: sprite.group = self.groups[group] except AttributeError: # sprite already deleted return sprite.batch = self.batch def set_label_group(label, group): label.top_group = TextLayoutGroup(group) label.background_group = OrderedGroup(0, label.top_group) label.foreground_group = TextLayoutForegroundGroup(1, label.top_group) label.foreground_decoration_group = \ TextLayoutForegroundDecorationGroup(2, label.top_group)[/source]
Sprites are added and draw fine in this system, but Labels, not so much. I confirmed that they're being added (add_label is being called), their coordinates and draw order is right (hopefully eliminating stupid mistakes), yet they're simply not drawing.
There actually is one Label which is drawing, an FPS Label whose text is updated every second. This appears only after the first second the game starts running (possibly because its text was updated). However, updating the text on the other others Labels doesn't make them draw.