#!/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) 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 print " Finished: %04d: %d bullets." % (frames, total) if __name__ == "__main__": main(sys.argv[1:])