Remove some fiddling with pygzero internals.
[koperkapel.git] / koperkapel / vehicles / base.py
index 47588a59c5450aaaabd5f74ac120302c65037f50..dec2aca44e3d2ea2b87c17a5d594ad1a171944a5 100644 (file)
@@ -1,10 +1,11 @@
 """ Base class for vehicles.  """
 
+import math
 from itertools import chain, islice, repeat
 from pygame.constants import BLEND_RGBA_MULT
-from pgzero.actor import Actor
 from pgzero.loaders import images
 from ..actors.orientatedsurf import OrientatedSurfActor
+from ..actors.animsurf import AnimatedSurfActor
 
 
 class Vehicle:
@@ -19,7 +20,7 @@ class Vehicle:
         self.game_pos = (0, 0)
 
     def roach_management_overlay(self):
-        return Actor("vehicles/%s/background" % (self.vehicle_type,))
+        return images.load("vehicles/%s/background" % (self.vehicle_type,))
 
     def init_seats(self):
         raise NotImplementedError("Vehicles should specify a list of seats")
@@ -48,6 +49,9 @@ class Vehicle:
             return None
         return roach_seating[seat_pos]
 
+    def changed(self):
+        return False  # TODO: remove this
+
     _vehicle_types = {}
 
     @classmethod
@@ -65,10 +69,23 @@ class Vehicle:
     @classmethod
     def register_all(cls):
         from .walking import Walking
+        from .quadcopter import Quadcopter
+        from .robot import Robot
+        from .roomba import Roomba
         cls.register(Walking)
+        cls.register(Quadcopter)
+        cls.register(Robot)
+        cls.register(Roomba)
+
+    def _avatar_frame(self, i, suffix="_tiles"):
+        vehicle = images.load("vehicle%s/%s_%d" % (
+            suffix, self.vehicle_type, i + 1))
+        frame = vehicle.copy()
+        return frame
 
     def get_avatar(self, world):
-        raise NotImplementedError("Vehicles should know how to create their own avatars.")
+        frames = [self._avatar_frame(i) for i in range(4)]
+        return AnimatedSurfActor(frames)
 
 
 class Seat:
@@ -116,4 +133,11 @@ class SeatActor(OrientatedSurfActor):
         self.surf = self._selected_seat if value else self._seat
 
 
+def circle_of_seats(n_seats, **kw):
+    d_theta = 2 * math.pi / n_seats
+    return [
+        Seat(pos=(math.sin(i * d_theta), math.cos(i * d_theta)), **kw)
+        for i in range(n_seats)]
+
+
 Vehicle.register_all()