--- /dev/null
+#!/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:])