def test_should_add_sprite_to_two_groups_on_creation(self): # given when group1 = Group() group2 = Group() sprite = XPGESprite(None, group1, group2) # then self.assertTrue(group1.has(sprite)) self.assertTrue(group2.has(sprite)) self.assertEqual(0, sprite.groups().index(group1)) self.assertEqual(1, sprite.groups().index(group2))
def test_should_add_sprite_to_group_on_creation(self): # given when group = Group() sprite = XPGESprite(None, group) # then self.assertTrue(group.has(sprite)) self.assertEqual(0, sprite.groups().index(group))
def test_find_collisions(): group = Group() animal1 = Animal() animal2 = Animal() animal1.put(30, 30) animal2.put(50, 50) group.add(animal1, animal2) collisions = find_collisions(group) assert not collisions assert group animal1.put(50, 50) animal2.put(50, 50) collisions = find_collisions(group) assert len(collisions) == 1 collision = collisions[0] np.testing.assert_array_equal((collision.animal1, collision.animal2), (animal1, animal2)) assert group.has(animal1, animal2) and len(group) == 2
class EventLoop(object): def __init__(self): self.objs = {} self.events = [] self.render = RenderUpdates() self.projectiles = Group() self.enemies = Group() self.you = None self.bg_sprite = BGSprite(pygame.display.get_surface()) # Since we don't care about MOST EVENTS pygame.event.set_allowed(None) pygame.event.set_allowed([ MOUSEBUTTONDOWN, KEYDOWN, QUIT, UPDATEEVENT, SPAWNEVENT ]) def add_object(self, obj, type=""): if isinstance(obj, HandlesEvents): if obj.events == ALL: try: self.objs[ALL].append(obj) except KeyError: self.objs[ALL] = [ obj ] else: for event in obj.events: try: self.objs[event].append(obj) except KeyError: self.objs[event] = [ obj ] if isinstance(obj, Sprite): self.render.add(obj) if type == "enemy": self.enemies.add(obj) if type == "projectile": self.projectiles.add(obj) if type == "you": self.you = obj def rm_object(self, obj): for key in self.objs.keys(): self.render.remove(obj) if obj in self.objs[key]: self.objs[key].remove(obj) if self.projectiles.has(obj): self.projectiles.remove(obj) if self.enemies.has(obj): self.enemies.remove(obj) print "Removed {0}".format(obj) def enqueue(self, event): if isinstance(event, Event): return self.events.append(event) elif isinstance(event, list): return [ self.enqueue(ev) for ev in event ] def tick(self): try: event = self.events.pop() except IndexError: event = None if event is not None: if isinstance(event, TargettedEvent): event.get_target().handle_event(event) for obj in self.objs[ALL]: obj.handle_event(event) else: for obj in self.objs[type(event)] + self.objs[ALL]: if obj.handles_event(event): obj.handle_event(event) if random.randint(0, 10000000) == 26: return win() if random.randint(0, 10000000) == 26: return lose() py_events = map(lambda event: PygameEvent(event), pygame.event.get()) for py_event in py_events: for obj in reduce(lambda obj_list, obj: obj_list + obj, map(lambda key: self.objs[key], filter(lambda handler_type: issubclass(handler_type, PygameEvent) if handler_type != ALL else False, self.objs.keys())), []): if obj.handles_event(py_event): obj.handle_event(py_event)