for light in self._lights:
light.render_fitting(surface)
+ def tick(self):
+ for light in self._lights:
+ light.tick()
+
class BaseLight(object):
""" Common light functionality. """
def __init__(
self, colour, position, intensity=1.0,
- radius_limits=(None, None), angle_limits=(None, None)):
+ radius_limits=(None, None), angle_limits=None):
self.colour = colour
self.position = pymunk.Vec2d(position)
self.on = True
if self.body.space is not None:
space.remove(self.body, *self.body.shapes)
self.ray_manager.generate_rays(space, self.position)
+ self.ray_manager.set_angle_limits(self.angle_limits)
ray_shapes = self.ray_manager.polys()
space.add(self.body, self.fitting, *ray_shapes)
white, black = (255, 255, 255), (0, 0, 0)
ray_mask.fill(black)
- for shape in self.body.shapes:
- if shape is self.fitting:
- continue
- pygame_poly = [
- pymunk.pygame_util.to_pygame(v, surface) for v in
- shape.get_vertices()]
+ for pygame_poly in self.ray_manager.pygame_polys(surface):
pygame.draw.polygon(ray_mask, white, pygame_poly, 0)
pygame.draw.aalines(ray_mask, white, True, pygame_poly, 1)
pymunk.pygame_util.to_pygame(self.fitting.offset, surface),
int(self.fitting.radius))
+ def tick(self):
+ pass
+
class SpotLight(BaseLight):
def __init__(self, **kw):
kw.pop("direction", None)
kw.pop("spread", None)
+ self.angular_velocity = kw.pop("angular_velocity", None)
super(SpotLight, self).__init__(**kw)
+
+ def tick(self):
+ if self.angular_velocity:
+ start, end = self.angle_limits
+ start = (start + self.angular_velocity) % 360.0
+ end = (end + self.angular_velocity) % 360.0
+ self.angle_limits = (start, end)
+ self.ray_manager.set_angle_limits(self.angle_limits)