Mercurial > boomslang
diff pyntnclick/scenewidgets.py @ 854:79b5c1be9a5e default tip
Remove pyntnclick, it's its own library, now
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Sat, 21 Jun 2014 22:06:09 +0200 |
parents | f95830b58336 |
children |
line wrap: on
line diff
--- a/pyntnclick/scenewidgets.py Sat Jun 21 22:04:35 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,223 +0,0 @@ -"""Interactive elements within a Scene.""" - - -from pygame import Rect -from pygame.color import Color -from pygame.colordict import THECOLORS -from pygame.surface import Surface - -from pyntnclick.state import Thing -from pyntnclick.utils import convert_color, render_text -from pyntnclick.widgets.text import LabelWidget - - -class Interact(object): - - def __init__(self, image, rect, interact_rect): - self.image = image - self.rect = rect - self.interact_rect = interact_rect - - def set_thing(self, thing): - pass - - def draw(self, surface): - if self.image is not None: - surface.blit(self.image, self.rect, None) - - def animate(self): - return False - - -class InteractNoImage(Interact): - - def __init__(self, x, y, w, h): - super(InteractNoImage, self).__init__(None, None, Rect(x, y, w, h)) - - -class InteractDebugText(Interact): - """Display box with text to interact with -- mostly for debugging.""" - - def __init__(self, x, y, text, bg_color=None): - if bg_color is None: - bg_color = (127, 127, 127) - label = LabelWidget((0, 0), text) - # label.set_margin(5) - # label.border_width = 1 - # label.border_color = (0, 0, 0) - # label.bg_color = bg_color - # label.fg_color = (0, 0, 0) - image = Surface(label.size) - rect = Rect((x, y), label.size) - label.draw_all(image) - super(InteractDebugText, self).__init__(image, rect, rect) - - -class InteractText(Interact): - """Display a text string on a transparent background. - - Used so we can easily include translatable strings in the scenes""" - - def __init__(self, x, y, w, h, text, color, max_font_size, font=None, - centre=True): - self._text = text - self._color = convert_color(color) - self._max_font_size = max_font_size - self._font = font - self._centre = centre - rect = Rect((x, y), (w, h)) - super(InteractText, self).__init__(None, rect, rect) - - def set_thing(self, thing): - font_size = self._max_font_size - if not self._font: - # Pull the default font out of constants - self._font = thing.gd.constants.font - bg_color = Color(0, 0, 0, 0) # transparent background - self.image = render_text(self._text, self._font, font_size, - self._color, bg_color, thing.resource, self.rect.size, - self._centre) - - -class InteractRectUnion(Interact): - - def __init__(self, rect_list): - super(InteractRectUnion, self).__init__(None, None, None) - rect_list = [Rect(x) for x in rect_list] - self.interact_rect = rect_list - - -class InteractUnion(Interact): - """An interact made out of other interacts""" - - def __init__(self, interact_list): - super(InteractUnion, self).__init__(None, None, None) - self._interact_list = interact_list - - def set_thing(self, thing): - interact_list = [] - for sub_interact in self._interact_list: - sub_interact.set_thing(thing) - sub_rect = sub_interact.interact_rect - if hasattr(sub_rect, 'collidepoint'): - interact_list.append(sub_interact.interact_rect) - else: - interact_list.extend(sub_interact.interact_rect) - self.interact_rect = interact_list - - def draw(self, surface): - for sub_interact in self._interact_list: - sub_interact.draw(surface) - - def animate(self): - for sub_interact in self._interact_list: - sub_interact.animate() - - -class InteractImage(Interact): - - def __init__(self, x, y, image_name): - super(InteractImage, self).__init__(None, None, None) - self._pos = (x, y) - self._image_name = image_name - - def set_thing(self, thing): - self.image = thing.resource.get_image(thing.folder, self._image_name) - self.rect = Rect(self._pos, self.image.get_size()) - self.interact_rect = self.rect - - def __repr__(self): - return '<InteractImage: %s>' % self._image_name - - -class InteractImageRect(InteractImage): - def __init__(self, x, y, image_name, r_x, r_y, r_w, r_h): - super(InteractImageRect, self).__init__(x, y, image_name) - self._r_pos = (r_x, r_y) - self._r_size = (r_w, r_h) - - def set_thing(self, thing): - super(InteractImageRect, self).set_thing(thing) - self.interact_rect = Rect(self._r_pos, self._r_size) - - -class InteractAnimated(Interact): - """Interactive with an animation rather than an image""" - - # anim_seq - sequence of image names - # delay - number of frames to wait between changing images - - def __init__(self, x, y, anim_seq, delay): - self._pos = (x, y) - self._anim_pos = 0 - self._names = anim_seq - self._frame_count = 0 - self._anim_seq = None - self._delay = delay - - def set_thing(self, thing): - self._anim_seq = [thing.resource.get_image(thing.folder, x) - for x in self._names] - self.image = self._anim_seq[0] - self.rect = Rect(self._pos, self.image.get_size()) - for image in self._anim_seq: - assert image.get_size() == self.rect.size - self.interact_rect = self.rect - - def animate(self): - if self._anim_seq: - self._frame_count += 1 - if self._frame_count > self._delay: - self._frame_count = 0 - self._anim_pos += 1 - if self._anim_pos >= len(self._anim_seq): - self._anim_pos = 0 - self.image = self._anim_seq[self._anim_pos] - # queue redraw - return True - return False - - -class TakeableThing(Thing): - "Thing that can be taken." - - INITIAL_DATA = { - 'taken': False, - } - - ITEM = None - - def __init__(self): - # In case a subclass replaces INITIAL_DATA and breaks 'taken'. - assert self.INITIAL_DATA['taken'] in (True, False) - super(TakeableThing, self).__init__() - - def should_add(self): - return not self.get_data('taken') - - def take(self): - self.set_data('taken', True) - self.game.add_inventory_item(self.ITEM) - self.scene.remove_thing(self) - - -class GenericDescThing(Thing): - "Thing with an InteractiveUnionRect and a description" - - INITIAL = "description" - - def __init__(self, prefix, number, description, areas): - super(GenericDescThing, self).__init__() - self.description = description - self.name = '%s.%s' % (prefix, number) - self.interacts = { - 'description': InteractRectUnion(areas) - } - # Individual colors to make debugging easier - self._interact_hilight_color = Color(THECOLORS.keys()[number]) - - def get_description(self): - return self.description - - def is_interactive(self, tool=None): - return False