def game(): screen.fill(black) running = True keyboard = Keyboard() world = World(32, 32) off = ((WIDTH - world.get_render_width()) / 2, (HEIGHT - world.get_render_height()) / 2) world.offX = off[0] world.offY = off[1] ply = Player(0, 0, world) ply.x = random.randint(0, WIDTH - ply.w) ply.y = random.randint(0, HEIGHT - ply.h) while world.entity_hitpos(ply): ply.x = random.randint(0, WIDTH - ply.w) ply.y = random.randint(0, HEIGHT - ply.h) physics = Physics(world, (WIDTH, HEIGHT)) physics.watch(ply) clock = pygame.time.Clock() last = pygame.time.get_ticks() ticks = 0 plydeathtimer = 0 lastrect = pygame.Rect(0, 0, 0, 0) while running: ticks += 1 clock.tick(0) for ev in pygame.event.get(): if ev.type == QUIT: running = False break elif ev.type == FRAMECOUNTER: print clock.get_fps() elif ev.type == WORLDREGEN: world.regen_once() elif ev.type == ENTITYGEN: x = random.randint(0, WIDTH) y = random.randint(0, HEIGHT) physics.watch(Enemy(x, y, world, physics)) elif ev.type == MOUSEBUTTONDOWN: if ev.button == 0 and plydeathtimer == 0: mpos = ev.pos center = ply.get_center() a = mpos[0] - center[0] b = mpos[1] - center[1] # tan(ang) = b / a ang = math.atan2(b, a) # Calculate bullet pos pos = [math.cos(ang) * ply.w + center[0], math.sin(ang) * ply.h + center[1]] bull = Bullet(pos[0], pos[1], world) speed = 2 bull.vx = speed * math.cos(ang) bull.vy = speed * math.sin(ang) physics.watch(bull) shootsound.play() elif ev.type == KEYDOWN: keyboard.keydown(ev.key) elif ev.type == KEYUP: keyboard.keyup(ev.key) # Handle movement if plydeathtimer == 0: if keyboard.is_down(K_w): ply.vy = -1 elif keyboard.is_down(K_s): ply.vy = 1 else: ply.vy = 0 if keyboard.is_down(K_a): ply.vx = -1 elif keyboard.is_down(K_d): ply.vx = 1 else: ply.vx = 0 # Shooting repeat if ticks % 10 == 0 and pygame.mouse.get_pressed()[0]: mpos = pygame.mouse.get_pos() center = ply.get_center() a = mpos[0] - center[0] b = mpos[1] - center[1] # tan(ang) = b / a ang = math.atan2(b, a) # Calculate bullet pos pos = [math.cos(ang) * ply.w + center[0], math.sin(ang) * ply.h + center[1]] bull = Bullet(pos[0], pos[1], world) speed = 2 bull.vx = speed * math.cos(ang) bull.vy = speed * math.sin(ang) physics.watch(bull) shootsound.play() for ent in physics.entities: if isinstance(ent, Enemy): ent.think(ply) if world.win(): win() running = False if ply.lives == 0: lose() running = False elif ply.removeme: ply.removeme = False plydeathtimer = 180 if plydeathtimer > 0: if plydeathtimer == 1: ply.x = random.randint(0, WIDTH - ply.w) ply.y = random.randint(0, HEIGHT - ply.h) while world.entity_hitpos(ply): ply.x = random.randint(0, WIDTH - ply.w) ply.y = random.randint(0, HEIGHT - ply.h) physics.watch(ply) plydeathtimer -= 1 # Clear previous font screen.fill(black, lastrect) # Render physics.renderclear(screen) world.render(screen) physics.tick() physics.render(screen) # Display health msg = "Lives: %d | Health: %d" % (ply.lives, ply.health) text = bigfont.render(msg, 1, white) lastrect = pygame.Rect(0, 0, text.get_width(), text.get_height()) screen.blit(text, (0, 0)) pygame.display.flip() dt = pygame.time.get_ticks() - last if dt < (1000 / 60): pygame.time.delay((1000 / 60) - dt) last = pygame.time.get_ticks()