Mercurial > pyntnclick
diff gamelib/state.py @ 94:ce23fad8ecb3
More complex shaped interactables
author | Neil Muller <neil@dip.sun.ac.za> |
---|---|
date | Tue, 24 Aug 2010 00:56:31 +0200 |
parents | 350ce4ebe122 |
children | 19d784fd3918 |
line wrap: on
line diff
--- a/gamelib/state.py Tue Aug 24 00:43:32 2010 +0200 +++ b/gamelib/state.py Tue Aug 24 00:56:31 2010 +0200 @@ -178,7 +178,7 @@ Returns a Result object to provide feedback to the player. """ for thing in self.things.itervalues(): - if thing.rect.collidepoint(pos): + if thing.contains(pos): result = thing.interact(item) if result: if self._current_thing: @@ -193,14 +193,14 @@ Item may be an item in the list of items or None for the hand. """ if self._current_thing is not None: - if self._current_thing.rect.collidepoint(pos): + if self._current_thing.contains(pos): return else: self._current_thing.leave() self._current_thing = None self._current_description = None for thing in self.things.itervalues(): - if thing.rect.collidepoint(pos): + if thing.contains(pos): thing.enter(item) self._current_thing = thing self._current_description = self._make_description( @@ -228,6 +228,18 @@ def __init__(self, x, y, w, h): super(InteractNoImage, self).__init__(None, None, Rect(x, y, w, h)) +class InteractRectUnion(Interact): + + def __init__(self, rect_list): + # pygame.rect.Rect.unionall should do this, but is broken + # in some pygame versions (including 1.8, it appears) + rect_list = [Rect(x) for x in rect_list] + union_rect = rect_list[0] + for rect in rect_list[1:]: + union_rect = union_rect.union(rect) + super(InteractRectUnion, self).__init__(None, None, union_rect) + self.interact_rect = rect_list + class InteractImage(Interact): @@ -294,6 +306,16 @@ self.rect = self.current_interact.interact_rect assert self.rect is not None, name + def contains(self, pos): + if hasattr(self.rect, 'collidepoint'): + return self.rect.collidepoint(pos) + else: + # FIXME: add sanity check + for rect in list(self.rect): + if rect.collidepoint(pos): + return True + return False + def get_description(self): return None @@ -329,8 +351,13 @@ def draw(self, surface): self.current_interact.draw(surface) if self._interact_hilight_color is not None: - frame_rect(surface, self._interact_hilight_color, - self.rect.inflate(1, 1), 1) + if hasattr(self.rect, 'collidepoint'): + frame_rect(surface, self._interact_hilight_color, + self.rect.inflate(1, 1), 1) + else: + for rect in self.rect: + frame_rect(surface, self._interact_hilight_color, + rect.inflate(1, 1), 1) class Item(object):