Mercurial > boomslang
annotate gamelib/state.py @ 36:31a431f795e1
Add a hand button placeholder
author | Neil Muller <neil@dip.sun.ac.za> |
---|---|
date | Sun, 22 Aug 2010 20:25:13 +0200 |
parents | ebc76bc0c067 |
children | 088a101f5b94 |
rev | line source |
---|---|
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
1 """Utilities and base classes for dealing with scenes.""" |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
2 |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
3 from albow.resource import get_image, get_sound |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
4 from pygame.locals import BLEND_ADD |
11 | 5 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
6 |
9
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
7 def initial_state(): |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
8 """Load the initial state.""" |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
9 state = State() |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
10 state.load_scenes("cryo") |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
11 state.set_current_scene("cryo") |
9
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
12 return state |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
13 |
6db58d31dd4c
Function for loading initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
7
diff
changeset
|
14 |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
15 class State(object): |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
16 """Complete game state. |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
17 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
18 Game state consists of: |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
19 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
20 * items |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
21 * scenes |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
22 """ |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
23 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
24 def __init__(self): |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
25 # map of scene name -> Scene object |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
26 self.scenes = {} |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
27 # map of item name -> Item object |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
28 self.items = {} |
33
f8e02d02c782
Convert inventory to list of item objects.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
32
diff
changeset
|
29 # list of item objects in inventory |
f8e02d02c782
Convert inventory to list of item objects.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
32
diff
changeset
|
30 self.inventory = [] |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
31 # current scene |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
32 self.current_scene = None |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
33 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
34 def add_scene(self, scene): |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
35 self.scenes[scene.name] = scene |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
36 |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
37 def add_item(self, item): |
35 | 38 self.items[item.name] = item |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
39 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
40 def load_scenes(self, modname): |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
41 mod = __import__("gamelib.scenes.%s" % (modname,), fromlist=[modname]) |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
42 for scene_cls in mod.SCENES: |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
43 self.add_scene(scene_cls(self)) |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
44 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
45 def set_current_scene(self, name): |
29
6322d92dc8f0
Add state widget for rendering state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
28
diff
changeset
|
46 self.current_scene = self.scenes[name] |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
47 |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
48 def add_inventory_item(self, name): |
33
f8e02d02c782
Convert inventory to list of item objects.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
32
diff
changeset
|
49 self.inventory.append(self.items[name]) |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
50 |
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
51 def remove_inventory_item(self, name): |
34
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
52 self.inventory.remove(self.items[name]) |
30
daf9eecb670f
Add inventory manipulation methods.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
29
diff
changeset
|
53 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
54 def draw(self, surface): |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
55 self.current_scene.draw(surface) |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
56 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
57 |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
58 class Scene(object): |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
59 """Base class for scenes.""" |
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
60 |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
61 # sub-folder to look for resources in |
22 | 62 FOLDER = None |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
63 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
64 # name of background image resource |
22 | 65 BACKGROUND = None |
66 | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
67 # name of scene (optional, defaults to folder) |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
68 NAME = None |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
69 |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
70 def __init__(self, state): |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
71 # scene name |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
72 self.name = self.NAME if self.NAME is not None else self.FOLDER |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
73 # link back to state object |
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
74 self.state = state |
22 | 75 # map of thing names -> Thing objects |
76 self.things = {} | |
28
0f25f7b9b37a
Add loading of initial state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
23
diff
changeset
|
77 self._background = get_image(self.FOLDER, self.BACKGROUND) |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
78 |
35 | 79 def add_item(self, item): |
80 self.state.add_item(item) | |
81 | |
22 | 82 def draw_background(self, surface): |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
83 surface.blit(self._background, (0, 0), None, BLEND_ADD) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
84 |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
85 def draw_things(self, surface): |
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
86 for thing in self.things.itervalues(): |
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
87 thing.draw(surface) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
88 |
22 | 89 def draw(self, surface): |
90 self.draw_background(surface) | |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
91 self.draw_things(surface) |
18
c9b124c2f5c6
Start of scene drawing framework.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
11
diff
changeset
|
92 |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
93 |
22 | 94 class Thing(object): |
95 """Base class for things in a scene that you can interact with.""" | |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
96 |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
97 def __init__(self, rect): |
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
98 self.rect = rect |
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
99 # TODO: add masks |
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
100 # TODO: add images |
7
d7c9d8273d7f
Start of base classes for game state.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
diff
changeset
|
101 |
22 | 102 def interact(self, item): |
103 pass | |
104 | |
23
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
105 def draw(self, surface): |
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
106 pass |
1e90a3e4618e
Add code for blitting Scene.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
22
diff
changeset
|
107 |
22 | 108 |
109 class Item(object): | |
110 """Base class for inventory items.""" | |
111 | |
35 | 112 # image for inventory |
113 INVENTORY_IMAGE = None | |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
114 |
35 | 115 def __init__(self, name): |
116 self.name = name | |
117 self.inventory_image = get_image('items', self.INVENTORY_IMAGE) | |
32
18cb1af411ef
Add helper for adding items. Give items names. Make things take a rectangle.
Simon Cross <hodgestar+bzr@gmail.com>
parents:
30
diff
changeset
|
118 # TODO: needs cursor |
22 | 119 |
34
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
120 def get_inventory_image(self): |
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
121 return self.inventory_image |
e5c043aeed65
Inventory and items. And stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
33
diff
changeset
|
122 |