Moar vehicles!
[koperkapel.git] / koperkapel / vehicles / base.py
index 47588a59c5450aaaabd5f74ac120302c65037f50..551826f5053dee9d56c8fd489af54db8abd218f3 100644 (file)
@@ -1,10 +1,12 @@
 """ 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:
@@ -48,6 +50,9 @@ class Vehicle:
             return None
         return roach_seating[seat_pos]
 
+    def changed(self):
+        return False  # TODO: remove this
+
     _vehicle_types = {}
 
     @classmethod
@@ -65,10 +70,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 +134,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()