+ def __init__(
+ self, body, position, ray_filter, radius_limits, direction,
+ spread):
+ self._body = body # light's body
+ self._position = pymunk.Vec2d(position) # light's position
+ self._ray_filter = ray_filter # light filter
+ self._rays = [] # list of RayPolys
+ self._direction = None # normal vector for direction
+ self._start = None # normal vector in direction of start angle limit
+ self._end = None # normal vector in direction of end angle limit
+ self._set_angle_limits(direction, spread)
+ if direction:
+ self.direction = direction # Update direction
+ self._max_radius = None # maximum radius in pixels
+ self._min_radius = None # minimum radius in pixels
+ self._set_radius_limits(radius_limits)
+ self._old_poly_cache = None # last polys added to the space
+ self._poly_cache = None # list of pymunk.Polys for rays
+ self._space = None # space the rays form part of
+
+ def set_space(self, space):
+ self._space = space
+ self._rays = calculate_ray_polys(
+ self._space, self._position, self._ray_filter)
+ self._poly_cache = None
+
+ def update_shapes(self):
+ if self._old_poly_cache:
+ self._space.remove(*self._old_poly_cache)
+ new_polys = self._old_poly_cache = self.polys()
+ self._space.add(*new_polys)
+
+ @property
+ def position(self):
+ return self._position
+
+ @property
+ def max_radius(self):
+ return self._max_radius
+
+ @max_radius.setter
+ def max_radius(self, value):
+ self._max_radius = value or 0.0
+
+ @property
+ def min_radius(self):
+ return self._min_radius
+
+ @min_radius.setter
+ def min_radius(self, value):
+ self._min_radius = value or 0.0
+
+ def reaches(self, position):
+ distance = self.position.get_distance(position)
+ return (self._min_radius <= distance <= self._max_radius)