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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
38fb04728ac5 Rearrange import.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
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
42742a62f9c3 More pep8 cleanups
Neil Muller <neil@dip.sun.ac.za>
parents: 525
diff changeset
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