Mercurial > parpg-core
annotate src/parpg/bGrease/world.py @ 129:7583965ddcd6
If Items in containers or being equipped have no type the game will now try to get the object using the ID.
author | KarstenBock@gmx.net |
---|---|
date | Wed, 28 Sep 2011 12:58:18 +0200 |
parents | 0f659c7675f6 |
children |
rev | line source |
---|---|
92
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
1 ############################################################################# |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
2 # |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
3 # Copyright (c) 2010 by Casey Duncan and contributors |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
4 # All Rights Reserved. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
5 # |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
6 # This software is subject to the provisions of the MIT License |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
7 # A copy of the license should accompany this distribution. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
8 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
9 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
10 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
11 # |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
12 ############################################################################# |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
13 """Worlds are environments described by a configuration of components, systems and |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
14 renderers. These parts describe the data, behavioral and presentation aspects |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
15 of the world respectively. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
16 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
17 The world environment is the context within which entities exist. A typical |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
18 application consists of one or more worlds containing entities that evolve |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
19 over time and react to internal and external interaction. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
20 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
21 See :ref:`an example of world configuration in the tutorial <tut-world-example>`. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
22 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
23 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
24 __version__ = '$Id$' |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
25 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
26 import itertools |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
27 from parpg.bGrease import mode |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
28 from parpg.bGrease.component import ComponentError |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
29 from parpg.bGrease.entity import Entity, ComponentEntitySet |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
30 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
31 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
32 class BaseWorld(object): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
33 """A coordinated collection of components, systems and entities |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
34 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
35 A world is also a mode that may be pushed onto a |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
36 :class:`grease.mode.Manager` |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
37 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
38 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
39 components = None |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
40 """:class:`ComponentParts` object containing all world components. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
41 :class:`grease.component.Component` objects define and contain all entity data |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
42 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
43 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
44 systems = None |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
45 """:class:`Parts` object containing all world systems. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
46 :class:`grease.System` objects define world and entity behavior |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
47 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
48 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
49 renderers = None |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
50 """:class:`Parts` object containing all world renderers. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
51 :class:`grease.Renderer` objects define world presentation |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
52 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
53 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
54 entities = None |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
55 """Set of all entities that exist in the world""" |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
56 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
57 def __init__(self): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
58 self.components = ComponentParts(self) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
59 self.systems = Parts(self) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
60 self.renderers = Parts(self) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
61 self.new_entity_id = itertools.count().next |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
62 self.new_entity_id() # skip id 0 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
63 self.entities = WorldEntitySet(self) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
64 self._full_extent = EntityExtent(self, self.entities) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
65 self._extents = {} |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
66 self.configure() |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
67 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
68 def configure(self): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
69 """Hook to configure the world after construction. This method |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
70 is called immediately after the world is initialized. Override |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
71 in a subclass to configure the world's components, systems, |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
72 and renderers. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
73 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
74 The default implementation does nothing. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
75 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
76 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
77 def __getitem__(self, entity_class): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
78 """Return an :class:`EntityExtent` for the given entity class. This extent |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
79 can be used to access the set of entities of that class in the world |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
80 or to query these entities via their components. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
81 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
82 Examples:: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
83 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
84 world[MyEntity] |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
85 world[...] |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
86 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
87 :param entity_class: The entity class for the extent. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
88 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
89 May also be a tuple of entity classes, in which case |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
90 the extent returned contains union of all entities of the classes |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
91 in the world. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
92 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
93 May also be the special value ellipsis (``...``), which |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
94 returns an extent containing all entities in the world. This allows |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
95 you to conveniently query all entities using ``world[...]``. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
96 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
97 if isinstance(entity_class, tuple): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
98 entities = set() |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
99 for cls in entity_class: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
100 if cls in self._extents: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
101 entities |= self._extents[cls].entities |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
102 return EntityExtent(self, entities) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
103 elif entity_class is Ellipsis: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
104 return self._full_extent |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
105 try: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
106 return self._extents[entity_class] |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
107 except KeyError: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
108 extent = self._extents[entity_class] = EntityExtent(self, set()) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
109 return extent |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
110 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
111 def draw_renderers(self): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
112 """Draw all renderers""" |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
113 for renderer in self.renderers: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
114 renderer.draw() |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
115 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
116 class WorldEntitySet(set): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
117 """Entity set for a :class:`World`""" |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
118 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
119 def __init__(self, world): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
120 self.world = world |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
121 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
122 def add(self, entity): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
123 """Add the entity to the set and all necessary class sets |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
124 Return the unique entity id for the entity, creating one |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
125 as needed. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
126 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
127 super(WorldEntitySet, self).add(entity) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
128 for cls in entity.__class__.__mro__: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
129 if issubclass(cls, Entity): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
130 self.world[cls].entities.add(entity) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
131 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
132 def remove(self, entity): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
133 """Remove the entity from the set and, world components, |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
134 and all necessary class sets |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
135 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
136 super(WorldEntitySet, self).remove(entity) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
137 for component in self.world.components: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
138 try: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
139 del component[entity] |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
140 except KeyError: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
141 pass |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
142 for cls in entity.__class__.__mro__: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
143 if issubclass(cls, Entity): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
144 self.world[cls].entities.discard(entity) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
145 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
146 def discard(self, entity): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
147 """Remove the entity from the set if it exists, if not, |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
148 do nothing |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
149 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
150 try: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
151 self.remove(entity) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
152 except KeyError: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
153 pass |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
154 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
155 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
156 class EntityExtent(object): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
157 """Encapsulates a set of entities queriable by component. Extents |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
158 are accessed by using an entity class as a key on the :class:`World`:: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
159 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
160 extent = world[MyEntity] |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
161 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
162 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
163 entities = None |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
164 """The full set of entities in the extent""" |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
165 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
166 def __init__(self, world, entities): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
167 self.__world = world |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
168 self.entities = entities |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
169 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
170 def __getattr__(self, name): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
171 """Return a queriable :class:`ComponentEntitySet` for the named component |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
172 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
173 Example:: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
174 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
175 world[MyEntity].movement.velocity > (0, 0) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
176 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
177 Returns a set of entities where the value of the :attr:`velocity` field |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
178 of the :attr:`movement` component is greater than ``(0, 0)``. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
179 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
180 component = getattr(self.__world.components, name) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
181 return ComponentEntitySet(component, self.entities & component.entities) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
182 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
183 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
184 class Parts(object): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
185 """Maps world parts to attributes. The parts are kept in the |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
186 order they are set. Parts may also be inserted out of order. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
187 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
188 Used for: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
189 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
190 - :attr:`World.systems` |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
191 - :attr:`World.renderers` |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
192 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
193 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
194 _world = None |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
195 _parts = None |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
196 _reserved_names = ('entities', 'entity_id', 'world') |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
197 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
198 def __init__(self, world): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
199 self._world = world |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
200 self._parts = [] |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
201 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
202 def _validate_name(self, name): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
203 if (name in self._reserved_names or name.startswith('_') |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
204 or hasattr(self.__class__, name)): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
205 raise ComponentError('illegal part name: %s' % name) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
206 return name |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
207 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
208 def __setattr__(self, name, part): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
209 if not hasattr(self.__class__, name): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
210 self._validate_name(name) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
211 if not hasattr(self, name): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
212 self._parts.append(part) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
213 else: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
214 old_part = getattr(self, name) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
215 self._parts[self._parts.index(old_part)] = part |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
216 super(Parts, self).__setattr__(name, part) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
217 if hasattr(part, 'set_world'): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
218 part.set_world(self._world) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
219 elif name.startswith("_"): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
220 super(Parts, self).__setattr__(name, part) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
221 else: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
222 raise AttributeError("%s attribute is read only" % name) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
223 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
224 def __delattr__(self, name): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
225 self._validate_name(name) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
226 part = getattr(self, name) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
227 self._parts.remove(part) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
228 super(Parts, self).__delattr__(name) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
229 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
230 def insert(self, name, part, before=None, index=None): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
231 """Add a part with a particular name at a particular index. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
232 If a part by that name already exists, it is replaced. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
233 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
234 :arg name: The name of the part. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
235 :type name: str |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
236 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
237 :arg part: The component, system, or renderer part to insert |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
238 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
239 :arg before: A part object or name. If specified, the part is |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
240 inserted before the specified part in order. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
241 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
242 :arg index: If specified, the part is inserted in the position |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
243 specified. You cannot specify both before and index. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
244 :type index: int |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
245 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
246 assert before is not None or index is not None, ( |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
247 "Must specify a value for 'before' or 'index'") |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
248 assert before is None or index is None, ( |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
249 "Cannot specify both 'before' and 'index' arguments when inserting") |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
250 self._validate_name(name) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
251 if before is not None: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
252 if isinstance(before, str): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
253 before = getattr(self, before) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
254 index = self._parts.index(before) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
255 if hasattr(self, name): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
256 old_part = getattr(self, name) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
257 self._parts.remove(old_part) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
258 self._parts.insert(index, part) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
259 super(Parts, self).__setattr__(name, part) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
260 if hasattr(part, 'set_world'): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
261 part.set_world(self._world) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
262 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
263 def __iter__(self): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
264 """Iterate the parts in order""" |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
265 return iter(tuple(self._parts)) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
266 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
267 def __len__(self): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
268 return len(self._parts) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
269 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
270 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
271 class ComponentParts(Parts): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
272 """Maps world components to attributes. The components are kept in the |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
273 order they are set. Components may also be inserted out of order. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
274 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
275 Used for: :attr:`World.components` |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
276 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
277 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
278 def join(self, *component_names): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
279 """Join and iterate entity data from multiple components together. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
280 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
281 For each entity in all of the components named, yield a tuple containing |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
282 the entity data from each component specified. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
283 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
284 This is useful in systems that pull data from multiple components. |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
285 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
286 Typical Usage:: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
287 |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
288 for position, movement in world.components.join("position", "movement"): |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
289 # Do something with each entity's position and movement data |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
290 """ |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
291 if component_names: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
292 components = [getattr(self, self._validate_name(name)) |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
293 for name in component_names] |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
294 if len(components) > 1: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
295 entities = components[0].entities & components[1].entities |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
296 for comp in components[2:]: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
297 entities &= comp.entities |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
298 else: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
299 entities = components[0].entities |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
300 for entity in entities: |
0f659c7675f6
Changed "import bGrease" to "import parpg.bGrease".
KarstenBock@gmx.net
parents:
66
diff
changeset
|
301 yield tuple(comp[entity] for comp in components) |