annotate pyntnclick/scenewidgets.py @ 824:9f542ef6e498 pyntnclick

Reorganise code
author Neil Muller <neil@dip.sun.ac.za>
date Tue, 29 Jan 2013 11:41:03 +0200
parents e42d19c2237b
children 3a00c9337731
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
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
6 from pygame.colordict import THECOLORS
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
7 from pygame.surface import Surface
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
8
551
38fb04728ac5 Rearrange import.
Jeremy Thurgood <firxen@gmail.com>
parents: 548
diff changeset
9 from pyntnclick.state import Thing
824
9f542ef6e498 Reorganise code
Neil Muller <neil@dip.sun.ac.za>
parents: 820
diff changeset
10 from pyntnclick.utils import convert_color, render_text
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
824
9f542ef6e498 Reorganise code
Neil Muller <neil@dip.sun.ac.za>
parents: 820
diff changeset
63 self._color = convert_color(color)
820
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 font_size = self._max_font_size
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
71 if not self._font:
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
72 # Pull the default font out of constants
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
73 self._font = thing.gd.constants.font
824
9f542ef6e498 Reorganise code
Neil Muller <neil@dip.sun.ac.za>
parents: 820
diff changeset
74 bg_color = Color(0, 0, 0, 0) # transparent background
9f542ef6e498 Reorganise code
Neil Muller <neil@dip.sun.ac.za>
parents: 820
diff changeset
75 self.image = render_text(self._text, self._font, font_size,
9f542ef6e498 Reorganise code
Neil Muller <neil@dip.sun.ac.za>
parents: 820
diff changeset
76 self._color, bg_color, thing.resource, self.rect.size)
820
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
77
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
78
525
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
79 class InteractRectUnion(Interact):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
80
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
81 def __init__(self, rect_list):
818
8b4a0aad8aeb Remove unneeded rect union code
Neil Muller <neil@dip.sun.ac.za>
parents: 764
diff changeset
82 super(InteractRectUnion, self).__init__(None, None, None)
525
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
83 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
84 self.interact_rect = rect_list
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
85
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
86
820
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
87 class InteractUnion(Interact):
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
88 """An interact made out of other interacts"""
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
89
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
90 def __init__(self, interact_list):
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
91 super(InteractUnion, self).__init__(None, None, None)
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
92 self._interact_list = interact_list
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
93
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
94 def set_thing(self, thing):
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
95 interact_list = []
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
96 for sub_interact in self._interact_list:
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
97 sub_interact.set_thing(thing)
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
98 sub_rect = sub_interact.interact_rect
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
99 if hasattr(sub_rect, 'collidepoint'):
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
100 interact_list.append(sub_interact.interact_rect)
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
101 else:
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
102 interact_list.extend(sub_interact.interact_rect)
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
103 self.interact_rect = interact_list
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
104
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
105 def draw(self, surface):
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
106 for sub_interact in self._interact_list:
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
107 sub_interact.draw(surface)
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
108
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
109 def animate(self):
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.animate()
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
112
e42d19c2237b Add InteractText and InteractUnion
Neil Muller <neil@dip.sun.ac.za>
parents: 819
diff changeset
113
525
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
114 class InteractImage(Interact):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
115
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
116 def __init__(self, x, y, image_name):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
117 super(InteractImage, self).__init__(None, None, None)
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
118 self._pos = (x, y)
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
119 self._image_name = image_name
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
120
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
121 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
122 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
123 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
124 self.interact_rect = self.rect
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
125
763
afe7b1cb16c0 Interacts should get their images through the game's resource module
Stefano Rivera <stefano@rivera.za.net>
parents: 760
diff changeset
126 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
127 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
128
525
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 class InteractImageRect(InteractImage):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
131 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
132 super(InteractImageRect, self).__init__(x, y, image_name)
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
133 self._r_pos = (r_x, r_y)
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
134 self._r_size = (r_w, r_h)
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
135
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
136 def set_thing(self, thing):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
137 super(InteractImageRect, self).set_thing(thing)
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
138 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
139
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
140
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
141 class InteractAnimated(Interact):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
142 """Interactive with an animation rather than an image"""
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 # anim_seq - sequence of image names
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
145 # 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
146
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
147 def __init__(self, x, y, anim_seq, delay):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
148 self._pos = (x, y)
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
149 self._anim_pos = 0
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
150 self._names = anim_seq
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
151 self._frame_count = 0
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
152 self._anim_seq = None
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
153 self._delay = delay
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 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
156 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
157 for x in self._names]
525
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
158 self.image = self._anim_seq[0]
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
159 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
160 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
161 assert image.get_size() == self.rect.size
525
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
162 self.interact_rect = self.rect
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
163
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
164 def animate(self):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
165 if self._anim_seq:
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
166 self._frame_count += 1
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
167 if self._frame_count > self._delay:
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
168 self._frame_count = 0
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
169 self._anim_pos += 1
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
170 if self._anim_pos >= len(self._anim_seq):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
171 self._anim_pos = 0
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
172 self.image = self._anim_seq[self._anim_pos]
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
173 # queue redraw
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
174 return True
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
175 return False
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
176
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
177
764
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
178 class TakeableThing(Thing):
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
179 "Thing that can be taken."
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
180
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
181 INITIAL_DATA = {
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
182 'taken': False,
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
183 }
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
184
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
185 ITEM = None
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
186
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
187 def __init__(self):
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
188 # 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
189 assert self.INITIAL_DATA['taken'] in (True, False)
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
190 super(TakeableThing, self).__init__()
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
191
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
192 def should_add(self):
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
193 return not self.get_data('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 def take(self):
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
196 self.set_data('taken', True)
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
197 self.game.add_inventory_item(self.ITEM)
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
198 self.scene.remove_thing(self)
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
199
a8510f4e2ea1 Conditionally add things based on state.
Jeremy Thurgood <firxen@gmail.com>
parents: 763
diff changeset
200
525
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
201 class GenericDescThing(Thing):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
202 "Thing with an InteractiveUnionRect and a description"
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
203
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
204 INITIAL = "description"
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
205
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
206 def __init__(self, prefix, number, description, areas):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
207 super(GenericDescThing, self).__init__()
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
208 self.description = description
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
209 self.name = '%s.%s' % (prefix, number)
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
210 self.interacts = {
533
42742a62f9c3 More pep8 cleanups
Neil Muller <neil@dip.sun.ac.za>
parents: 525
diff changeset
211 'description': InteractRectUnion(areas)
525
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
212 }
578
356795038b87 Remove a couple of uses os DEBUG.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 576
diff changeset
213 # Individual colors to make debugging easier
356795038b87 Remove a couple of uses os DEBUG.
Simon Cross <hodgestar+bzr@gmail.com>
parents: 576
diff changeset
214 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
215
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
216 def get_description(self):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
217 return self.description
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
218
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
219 def is_interactive(self, tool=None):
821b322e903b Separate "scene widgets" from "game-specific widgets".
Jeremy Thurgood <firxen@gmail.com>
parents:
diff changeset
220 return False