Pygame-based runner.
authorJoe Wreschnig <joe.wreschnig@gmail.com>
Tue, 16 Mar 2010 07:04:45 +0000 (00:04 -0700)
committerJoe Wreschnig <joe.wreschnig@gmail.com>
Tue, 16 Mar 2010 07:04:45 +0000 (00:04 -0700)
bulletml-runner [new file with mode: 0755]

diff --git a/bulletml-runner b/bulletml-runner
new file mode 100755 (executable)
index 0000000..fc57bce
--- /dev/null
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+
+import sys
+
+import pygame
+
+import bulletml
+
+def main(argv):
+    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()
+
+    while True:
+        source = bulletml.Bullet.FromDoc(
+            doc, x=150, y=150, target=target, rank=0.5)
+                                         
+        active = set([source])
+        source.vanished = True
+        print filename
+        print "  Loaded %d top-level actions." % len(source.actions)
+        frames = 0
+        total = 0
+        paused = False
+
+        while active:
+            go = False
+
+            for event in pygame.event.get():
+                if event.type == pygame.QUIT:
+                    raise SystemExit
+                elif event.type == pygame.KEYDOWN:
+                    if event.key == pygame.K_SPACE:
+                        paused ^= True
+                    elif event.key == pygame.K_RIGHT:
+                        go = True
+            target.x, target.y = pygame.mouse.get_pos()
+            target.x /= 2
+            target.y = (screen.get_height() - target.y) / 2
+
+            if not paused or go:
+                for obj in list(active):
+                    new = obj.step()
+                    total += len(new)
+                    active.update(new)
+                    if (obj.finished
+                        or not (-50 < obj.x < 350)
+                        or not (-50 < obj.y < 350)):
+                        active.remove(obj)
+
+                frames += 1
+                if frames % 100 == 0:
+                    print "  Processing: %04d: %d bullets, %d active." % (
+                        frames, total, len(active))
+
+            screen.fill([0, 0, 0])
+            for obj in active:
+                try:
+                    x, y = obj.x, obj.y
+                except AttributeError:
+                    pass
+                else:
+                    if not obj.vanished:
+                        x *= 2
+                        y *= 2
+                        x -= 1
+                        y -= 1
+                        screen.blit(bullet, [x, screen.get_height() - y])
+            pygame.display.flip()
+
+            clock.tick(60)
+
+        print "  Finished: %04d: %d bullets." % (frames, total)
+
+if __name__ == "__main__":
+    main(sys.argv[1:])