X-Git-Url: https://git.yukkurigames.com/?p=python-bulletml.git;a=blobdiff_plain;f=bulletml-runner;h=d2d9ce00ed3e410a766d4e798ba897ea79dfe423;hp=fc57bcedd82f92929ed28c09b54602d1e668b73c;hb=3639cbf64fb5d54061d20b9b072bfcee8a26436d;hpb=b246fe5b1c35b4d0a189e7c28597927e6e5241e8 diff --git a/bulletml-runner b/bulletml-runner index fc57bce..d2d9ce0 100755 --- a/bulletml-runner +++ b/bulletml-runner @@ -1,23 +1,50 @@ #!/usr/bin/env python +import os import sys +import time import pygame import bulletml +import bulletml.bulletyaml +from bulletml.collision import collides_all + +try: + import yaml +except ImportError: + yaml = None + +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")) + red = pygame.Surface([3, 3]) + red.fill([255, 0, 0]) + green = pygame.Surface([3, 3]) + green.fill([0, 255, 0]) + blue = pygame.Surface([3, 3]) + blue.fill([0, 0, 255]) clock = pygame.time.Clock() target = bulletml.Bullet() + bullets = dict(red=red, green=green, blue=blue) + + file_idx = 0 + while True: - source = bulletml.Bullet.FromDoc( + filename = argv[file_idx % len(argv)] + doc = bulletml.BulletML.FromDocument(open(filename, "rU")) + source = bulletml.Bullet.FromDocument( doc, x=150, y=150, target=target, rank=0.5) active = set([source]) @@ -27,8 +54,11 @@ def main(argv): frames = 0 total = 0 paused = False + newfile = False - while active: + pygame.display.set_caption(os.path.basename(filename)) + + while active and not newfile: go = False for event in pygame.event.get(): @@ -39,12 +69,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: + source = bulletml.Bullet.FromDocument( + doc, x=150, y=150, target=target, 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 + target.y = 300 - target.y if not paused or go: - for obj in list(active): + lactive = list(active) + start = time.time() + count = len(active) + for obj in lactive: new = obj.step() total += len(new) active.update(new) @@ -52,11 +99,19 @@ def main(argv): or not (-50 < obj.x < 350) or not (-50 < obj.y < 350)): active.remove(obj) + if lactive: + collides_all(lactive[0], lactive) + 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 +125,10 @@ def main(argv): y *= 2 x -= 1 y -= 1 - screen.blit(bullet, [x, screen.get_height() - y]) - pygame.display.flip() - + bullet = bullets.get(obj.appearance, red) + screen.blit(bullet, [x, 600 - y]) clock.tick(60) + pygame.display.flip() print " Finished: %04d: %d bullets." % (frames, total)