Psyco-enable the test runner. Fix a copy/paste error.
[python-bulletml.git] / bulletml-runner
index fc57bce..62e9fdf 100755 (executable)
@@ -1,34 +1,52 @@
 #!/usr/bin/env python
 
+import os
 import sys
+import time
 
 import pygame
 
 import bulletml
 
+try:
+    import psyco
+except ImportError:
+    pass
+else:
+    psyco.full()
+
 def main(argv):
+    if not argv:
+        raise SystemExit("Usage: %s filename ..." % sys.argv[0])
+
     pygame.display.init()
     screen = pygame.display.set_mode([600, 600], pygame.DOUBLEBUF)
     bullet = pygame.Surface([3, 3])
     bullet.fill([255, 0, 0])
-    filename = argv[0]
-    doc = bulletml.BulletML(open(filename, "rU"))
     clock = pygame.time.Clock()
     target = bulletml.Bullet()
 
+    file_idx = 0
+
     while True:
-        source = bulletml.Bullet.FromDoc(
-            doc, x=150, y=150, target=target, rank=0.5)
+        filename = argv[file_idx % len(argv)]
+        doc = bulletml.BulletML.FromDocument(open(filename, "rU"))
+        actions = [act([], 0.5) for act in doc.top]
+        source = bulletml.Bullet(
+            x=150, y=150, target=target, actions=actions, rank=0.5)
                                          
         active = set([source])
         source.vanished = True
         print filename
-        print "  Loaded %d top-level actions." % len(source.actions)
+        print "  Loaded %d top-level actions." % len(source._actions)
         frames = 0
         total = 0
         paused = False
+        newfile = False
+
+        pygame.display.set_caption(os.path.basename(filename))
 
-        while active:
+        while active and not newfile:
             go = False
 
             for event in pygame.event.get():
@@ -39,11 +57,29 @@ def main(argv):
                         paused ^= True
                     elif event.key == pygame.K_RIGHT:
                         go = True
+                    elif event.key == pygame.K_PAGEUP:
+                        file_idx -= 1
+                        newfile = True
+                    elif event.key == pygame.K_PAGEDOWN:
+                        file_idx += 1
+                        newfile = True
+                    elif event.key == pygame.K_RETURN:
+                        newfile = True
+                    elif event.key == pygame.K_s:
+                        actions = [act([], 0.5) for act in doc.top]
+                        source = bulletml.Bullet(
+                            x=150, y=150, target=target,
+                            actions=actions, rank=0.5)
+                        source.vanished = True
+                        active.add(source)
             target.x, target.y = pygame.mouse.get_pos()
             target.x /= 2
-            target.y = (screen.get_height() - target.y) / 2
+            target.y /= 2
 
             if not paused or go:
+
+                start = time.time()
+                count = len(active)
                 for obj in list(active):
                     new = obj.step()
                     total += len(new)
@@ -52,11 +88,17 @@ def main(argv):
                         or not (-50 < obj.x < 350)
                         or not (-50 < obj.y < 350)):
                         active.remove(obj)
+                elapsed = time.time() - start
 
                 frames += 1
                 if frames % 100 == 0:
                     print "  Processing: %04d: %d bullets, %d active." % (
-                        frames, total, len(active))
+                        frames, total, count)
+                    if elapsed:
+                        seconds_per_bullet = elapsed / count
+                        bullets_per_second = count / elapsed
+                        print "  %g seconds per bullet (60Hz max: %g)." % (
+                            seconds_per_bullet, bullets_per_second / 60)
 
             screen.fill([0, 0, 0])
             for obj in active:
@@ -70,10 +112,9 @@ def main(argv):
                         y *= 2
                         x -= 1
                         y -= 1
-                        screen.blit(bullet, [x, screen.get_height() - y])
-            pygame.display.flip()
-
+                        screen.blit(bullet, [x, y])
             clock.tick(60)
+            pygame.display.flip()
 
         print "  Finished: %04d: %d bullets." % (frames, total)