Mercurial > boomslang
annotate pyntnclick/scenewidgets.py @ 820:e42d19c2237b pyntnclick
Add InteractText and InteractUnion
author | Neil Muller <neil@dip.sun.ac.za> |
---|---|
date | Mon, 28 Jan 2013 18:19:44 +0200 |
parents | 80ff3c9187bc |
children | 9f542ef6e498 |
rev | line source |
---|---|
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
1 """Interactive elements within a Scene.""" |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
2 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
3 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
4 from pygame import Rect |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
5 from pygame.color import Color |
820
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
6 from pygame.locals import SRCALPHA |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
7 from pygame.colordict import THECOLORS |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
8 from pygame.surface import Surface |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
9 |
551 | 10 from pyntnclick.state import Thing |
649
e59b119bb0f9
Evict the last BoomLabel.
Jeremy Thurgood <firxen@gmail.com>
parents:
625
diff
changeset
|
11 from pyntnclick.widgets.text import LabelWidget |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
12 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
13 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
14 class Interact(object): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
15 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
16 def __init__(self, image, rect, interact_rect): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
17 self.image = image |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
18 self.rect = rect |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
19 self.interact_rect = interact_rect |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
20 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
21 def set_thing(self, thing): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
22 pass |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
23 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
24 def draw(self, surface): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
25 if self.image is not None: |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
26 surface.blit(self.image, self.rect, None) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
27 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
28 def animate(self): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
29 return False |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
30 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
31 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
32 class InteractNoImage(Interact): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
33 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
34 def __init__(self, x, y, w, h): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
35 super(InteractNoImage, self).__init__(None, None, Rect(x, y, w, h)) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
36 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
37 |
819
80ff3c9187bc
Rename InteractText to InteractDebugText to better reflect it's aim
Neil Muller <neil@dip.sun.ac.za>
parents:
818
diff
changeset
|
38 class InteractDebugText(Interact): |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
39 """Display box with text to interact with -- mostly for debugging.""" |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
40 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
41 def __init__(self, x, y, text, bg_color=None): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
42 if bg_color is None: |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
43 bg_color = (127, 127, 127) |
649
e59b119bb0f9
Evict the last BoomLabel.
Jeremy Thurgood <firxen@gmail.com>
parents:
625
diff
changeset
|
44 label = LabelWidget((0, 0), text) |
e59b119bb0f9
Evict the last BoomLabel.
Jeremy Thurgood <firxen@gmail.com>
parents:
625
diff
changeset
|
45 # label.set_margin(5) |
e59b119bb0f9
Evict the last BoomLabel.
Jeremy Thurgood <firxen@gmail.com>
parents:
625
diff
changeset
|
46 # label.border_width = 1 |
e59b119bb0f9
Evict the last BoomLabel.
Jeremy Thurgood <firxen@gmail.com>
parents:
625
diff
changeset
|
47 # label.border_color = (0, 0, 0) |
e59b119bb0f9
Evict the last BoomLabel.
Jeremy Thurgood <firxen@gmail.com>
parents:
625
diff
changeset
|
48 # label.bg_color = bg_color |
e59b119bb0f9
Evict the last BoomLabel.
Jeremy Thurgood <firxen@gmail.com>
parents:
625
diff
changeset
|
49 # label.fg_color = (0, 0, 0) |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
50 image = Surface(label.size) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
51 rect = Rect((x, y), label.size) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
52 label.draw_all(image) |
819
80ff3c9187bc
Rename InteractText to InteractDebugText to better reflect it's aim
Neil Muller <neil@dip.sun.ac.za>
parents:
818
diff
changeset
|
53 super(InteractDebugText, self).__init__(image, rect, rect) |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
54 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
55 |
820
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
56 class InteractText(Interact): |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
57 """Display a text string on a transparent background. |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
58 |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
59 Used so we can easily include translatable strings in the scenes""" |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
60 |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
61 def __init__(self, x, y, w, h, text, color, max_font_size, font=None): |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
62 self._text = text |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
63 self._color = Color(color) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
64 self._max_font_size = max_font_size |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
65 self._font = font |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
66 rect = Rect((x, y), (w, h)) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
67 super(InteractText, self).__init__(None, rect, rect) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
68 |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
69 def set_thing(self, thing): |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
70 done = False |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
71 font_size = self._max_font_size |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
72 bg_color = Color(0, 0, 0, 0) # transparent background |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
73 if not self._font: |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
74 # Pull the default font out of constants |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
75 self._font = thing.gd.constants.font |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
76 surface = Surface(self.rect.size, SRCALPHA).convert_alpha() |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
77 while not done and font_size > 0: |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
78 font = thing.resource.get_font(self._font, font_size) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
79 text_surf = font.render(self._text, True, self._color) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
80 if (text_surf.get_width() > self.rect.width or |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
81 text_surf.get_height() > self.rect.height): |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
82 font_size -= 1 |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
83 else: |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
84 done = True |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
85 surface.fill(bg_color) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
86 # Centre the text in the rect |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
87 x = max(0, (self.rect.width - text_surf.get_width()) / 2) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
88 y = max(0, (self.rect.height - text_surf.get_height()) / 2) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
89 surface.blit(text_surf, (x, y)) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
90 self.image = surface |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
91 |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
92 |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
93 class InteractRectUnion(Interact): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
94 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
95 def __init__(self, rect_list): |
818
8b4a0aad8aeb
Remove unneeded rect union code
Neil Muller <neil@dip.sun.ac.za>
parents:
764
diff
changeset
|
96 super(InteractRectUnion, self).__init__(None, None, None) |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
97 rect_list = [Rect(x) for x in rect_list] |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
98 self.interact_rect = rect_list |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
99 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
100 |
820
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
101 class InteractUnion(Interact): |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
102 """An interact made out of other interacts""" |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
103 |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
104 def __init__(self, interact_list): |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
105 super(InteractUnion, self).__init__(None, None, None) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
106 self._interact_list = interact_list |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
107 |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
108 def set_thing(self, thing): |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
109 interact_list = [] |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
110 for sub_interact in self._interact_list: |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
111 sub_interact.set_thing(thing) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
112 sub_rect = sub_interact.interact_rect |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
113 if hasattr(sub_rect, 'collidepoint'): |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
114 interact_list.append(sub_interact.interact_rect) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
115 else: |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
116 interact_list.extend(sub_interact.interact_rect) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
117 self.interact_rect = interact_list |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
118 |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
119 def draw(self, surface): |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
120 for sub_interact in self._interact_list: |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
121 sub_interact.draw(surface) |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
122 |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
123 def animate(self): |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
124 for sub_interact in self._interact_list: |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
125 sub_interact.animate() |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
126 |
e42d19c2237b
Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents:
819
diff
changeset
|
127 |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
128 class InteractImage(Interact): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
129 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
130 def __init__(self, x, y, image_name): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
131 super(InteractImage, self).__init__(None, None, None) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
132 self._pos = (x, y) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
133 self._image_name = image_name |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
134 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
135 def set_thing(self, thing): |
763
afe7b1cb16c0
Interacts should get their images through the game's resource module
Stefano Rivera <stefano@rivera.za.net>
parents:
760
diff
changeset
|
136 self.image = thing.resource.get_image(thing.folder, self._image_name) |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
137 self.rect = Rect(self._pos, self.image.get_size()) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
138 self.interact_rect = self.rect |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
139 |
763
afe7b1cb16c0
Interacts should get their images through the game's resource module
Stefano Rivera <stefano@rivera.za.net>
parents:
760
diff
changeset
|
140 def __repr__(self): |
afe7b1cb16c0
Interacts should get their images through the game's resource module
Stefano Rivera <stefano@rivera.za.net>
parents:
760
diff
changeset
|
141 return '<InteractImage: %s>' % self._image_name |
afe7b1cb16c0
Interacts should get their images through the game's resource module
Stefano Rivera <stefano@rivera.za.net>
parents:
760
diff
changeset
|
142 |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
143 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
144 class InteractImageRect(InteractImage): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
145 def __init__(self, x, y, image_name, r_x, r_y, r_w, r_h): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
146 super(InteractImageRect, self).__init__(x, y, image_name) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
147 self._r_pos = (r_x, r_y) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
148 self._r_size = (r_w, r_h) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
149 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
150 def set_thing(self, thing): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
151 super(InteractImageRect, self).set_thing(thing) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
152 self.interact_rect = Rect(self._r_pos, self._r_size) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
153 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
154 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
155 class InteractAnimated(Interact): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
156 """Interactive with an animation rather than an image""" |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
157 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
158 # anim_seq - sequence of image names |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
159 # delay - number of frames to wait between changing images |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
160 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
161 def __init__(self, x, y, anim_seq, delay): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
162 self._pos = (x, y) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
163 self._anim_pos = 0 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
164 self._names = anim_seq |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
165 self._frame_count = 0 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
166 self._anim_seq = None |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
167 self._delay = delay |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
168 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
169 def set_thing(self, thing): |
763
afe7b1cb16c0
Interacts should get their images through the game's resource module
Stefano Rivera <stefano@rivera.za.net>
parents:
760
diff
changeset
|
170 self._anim_seq = [thing.resource.get_image(thing.folder, x) |
afe7b1cb16c0
Interacts should get their images through the game's resource module
Stefano Rivera <stefano@rivera.za.net>
parents:
760
diff
changeset
|
171 for x in self._names] |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
172 self.image = self._anim_seq[0] |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
173 self.rect = Rect(self._pos, self.image.get_size()) |
760
f288e5ec0a75
Convert FIXME about animation image size equivalence into an assertion
Stefano Rivera <stefano@rivera.za.net>
parents:
739
diff
changeset
|
174 for image in self._anim_seq: |
f288e5ec0a75
Convert FIXME about animation image size equivalence into an assertion
Stefano Rivera <stefano@rivera.za.net>
parents:
739
diff
changeset
|
175 assert image.get_size() == self.rect.size |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
176 self.interact_rect = self.rect |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
177 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
178 def animate(self): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
179 if self._anim_seq: |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
180 self._frame_count += 1 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
181 if self._frame_count > self._delay: |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
182 self._frame_count = 0 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
183 self._anim_pos += 1 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
184 if self._anim_pos >= len(self._anim_seq): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
185 self._anim_pos = 0 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
186 self.image = self._anim_seq[self._anim_pos] |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
187 # queue redraw |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
188 return True |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
189 return False |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
190 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
191 |
764
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
192 class TakeableThing(Thing): |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
193 "Thing that can be taken." |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
194 |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
195 INITIAL_DATA = { |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
196 'taken': False, |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
197 } |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
198 |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
199 ITEM = None |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
200 |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
201 def __init__(self): |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
202 # In case a subclass replaces INITIAL_DATA and breaks 'taken'. |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
203 assert self.INITIAL_DATA['taken'] in (True, False) |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
204 super(TakeableThing, self).__init__() |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
205 |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
206 def should_add(self): |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
207 return not self.get_data('taken') |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
208 |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
209 def take(self): |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
210 self.set_data('taken', True) |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
211 self.game.add_inventory_item(self.ITEM) |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
212 self.scene.remove_thing(self) |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
213 |
a8510f4e2ea1
Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents:
763
diff
changeset
|
214 |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
215 class GenericDescThing(Thing): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
216 "Thing with an InteractiveUnionRect and a description" |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
217 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
218 INITIAL = "description" |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
219 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
220 def __init__(self, prefix, number, description, areas): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
221 super(GenericDescThing, self).__init__() |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
222 self.description = description |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
223 self.name = '%s.%s' % (prefix, number) |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
224 self.interacts = { |
533 | 225 'description': InteractRectUnion(areas) |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
226 } |
578
356795038b87
Remove a couple of uses os DEBUG.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
576
diff
changeset
|
227 # Individual colors to make debugging easier |
356795038b87
Remove a couple of uses os DEBUG.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
576
diff
changeset
|
228 self._interact_hilight_color = Color(THECOLORS.keys()[number]) |
525
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
229 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
230 def get_description(self): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
231 return self.description |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
232 |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
233 def is_interactive(self, tool=None): |
821b322e903b
Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
234 return False |