1 import pygame
2 from pygame.sprite import RenderUpdates
3
4 -class Scene(pygame.sprite.RenderUpdates):
5
20
22
23 lowestX = 9000
24 lowestY = 9000
25
26 for i in range(len(self._spritelist)):
27 if self._spritelist[i][0].getXPos() < lowestX: lowestX = self._spritelist[i][0].getXPos()
28 if self._spritelist[i][0].getYPos() < lowestY: lowestY = self._spritelist[i][0].getYPos()
29
30 self.xPos = lowestX
31 self.yPos = lowestY
32
34
35 highestX = 0
36 highestY = 0
37
38 for i in range(len(self._spritelist)):
39 if (self._spritelist[i][0].getXPos() + self._spritelist[i][0].getXSize()) > highestX: highestX = self._spritelist[i][0].getXPos() + self._spritelist[i][0].getXSize()
40 if (self._spritelist[i][0].getYPos() + self._spritelist[i][0].getYSize()) > highestY: highestY = self._spritelist[i][0].getYPos() + self._spritelist[i][0].getYSize()
41
42 self.xSize = highestX - self.xPos
43 self.ySize = highestY - self.yPos
44
46 RenderUpdates.add_internal(self, newDrawableObject)
47 self._spritelist.insert(len(self._spritelist) - 1, [newDrawableObject, newDrawableObject.getXPos(), newDrawableObject.getYPos()])
48
50 for sprite in newDrawableObjects:
51 RenderUpdates.add_internal(self, sprite)
52 self._spritelist.insert(len(self._spritelist) - 1, [sprite, sprite.getXPos(), sprite.getYPos()])
53
55
56 for i in range(len(self._spritelist)):
57 self._spritelist[i][1] = self._spritelist[i][0].getXPos() - self.xPos
58 self._spritelist[i][2] = self._spritelist[i][0].getYPos() - self.yPos
59
61
62 for i in self._spritelist:
63 if i[0] == sprite:
64 self._spritelist.remove(i)
65 break
66 RenderUpdates.remove_internal(self, sprite)
67
69
70 if index < len(self._spritelist):
71 return self._spritelist[index][0]
72
74
75 return len(self._spritelist)
76
78
79 return list(self._spritelist)
80
89
91
92
93 for i in range(len(self._spritelist)):
94
95 self._spritelist[i][0].nudge(xNudge, yNudge)
96
97
98 self.calcPosition()
99
100 - def setPosition(self, newXPos = None, newYPos = None):
101
102 if newXPos != None: self.xPos = newXPos
103 if newYPos != None: self.yPos = newYPos
104
105 for i in range(len(self._spritelist)):
106
107 self._spritelist[i][0].setPosition(self.xPos + self._spritelist[i][1], self.yPos + self._spritelist[i][2])
108
111
114
117
120
122
123
124 for i in range(len(self._spritelist)):
125 self._spritelist[i][0].scale(newXSize, newYSize)
126
127 - def scaleScene(self, newXSize = None, newYSize = None):
128
129 self.calcPosition()
130 self.calcSize()
131
132 xScale = 1
133 yScale = 1
134
135 if newXSize != None: xScale = (newXSize * 1.0)/self.xSize
136 if newYSize != None: yScale = (newYSize * 1.0)/self.ySize
137
138 for i in range(len(self._spritelist)):
139 self._spritelist[i][0].scale(xScale * self._spritelist[iaw][0].getXSize(), yScale * self._spritelist[i][0].getYSize())
140 self._spritelist[i][1] = xScale * self._spritelist[i][1]
141 self._spritelist[i][2] = yScale * self._spritelist[i][2]
142
143 self.calcPosition()
144 self.calcSize()
145 self.setPosition()
146
148
149 for s in self._spritelist: s[0].update(t);
150
151 - def draw(self, surface):
152 spritedict = self.spritedict
153 surface_blit = surface.blit
154 dirty = self.lostsprites
155 self.lostsprites = []
156 dirty_append = dirty.append
157 for s in self._spritelist:
158 r = spritedict[s[0]]
159 newrect = surface_blit(s[0].image, s[0].rect)
160 if r is 0:
161 dirty_append(newrect)
162 else:
163 if newrect.colliderect(r):
164 dirty_append(newrect.union(r))
165 else:
166 dirty_append(newrect)
167 dirty_append(r)
168 spritedict[s[0]] = newrect
169 return dirty
170
172 spritedict = self.spritedict
173 surface_blit = surface.blit
174 dirty = self.lostsprites
175 self.lostsprites = []
176 dirty_append = dirty.append
177 for s in self._spritelist:
178 dirty_append(spritedict[s[0]])
179 dirty_append(surface_blit(s[0].image, s[0].rect))
180 return dirty
181
183
184 for i in range(len(self._spritelist)):
185
186 self._spritelist[i][0].nextFrame()
187