#! /usr/bin/python
import os, math, copy, sys, pygame, random
from pygame import time
from vec2d import vec2d
SCREEN_WIDTH = 400
SCREEN_HEIGHT = 400
SCREEN_FILL_COLOR = (150,150,80)
N_CREEPS = 20
class Creep:
def __init__(self, sprite, x, y, vector, velocity):
self.sprite = sprite
self.x = x
self.y = y
self.vector = vec2d(vector)
self.velocity = velocity
def blitme(self, screen):
if self.sprite:
w,h = self.sprite.get_size()
draw_pos = self.sprite.get_rect().move(
self.x - w / 2,
self.y - h / 2 )
screen.blit(self.sprite, draw_pos)
def update(self, time_passed, bounds):
oldvec = copy.deepcopy(self.vector)
self.x += (self.vector[0] * self.velocity) * time_passed
self.y += (self.vector[1] * self.velocity) * time_passed
# Determine if our creep has touched the edge of a screen, and if it has
# change it's direction vector appropriately.
if self.x <= bounds[0] or self.x >= bounds[2]:
self.vector[0] = self.vector[0] * -1
if self.y <= bounds[1] or self.y >= bounds[3]:
self.vector[1] = self.vector[1] * -1
# Random opportunity for mid-route direction changes.
if random.choice(range(0,50)) == 7:
v = random.choice([0,1])
self.vector[v] = random.choice([-1,0,1])
self.vector = vec2d(self.vector)
# If our direction vector has changed, rotate our sprite.
if not oldvec[0] == self.vector[0] or \
not oldvec[1] == self.vector[1]:
self.sprite = pygame.transform.rotate(self.sprite, -self.vector.angle)
@staticmethod
def spawn_random_creeps(n, bounds):
creeps = []
sprites = [ pygame.image.load( os.path.abspath('bluecreep.png') ),
pygame.image.load( os.path.abspath('pinkcreep.png') ),
pygame.image.load( os.path.abspath('graycreep.png') )
]
for creep in range(n):
creeps.append( Creep(random.choice(sprites),
random.choice(range(bounds[0], bounds[2] )),
random.choice(range(bounds[1], bounds[3])),
[random.choice([-1,0,1]), random.choice([-1,0,1])],
0.1
)
)
return creeps
def main():
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
bounds = (0,0,SCREEN_WIDTH,SCREEN_HEIGHT)
clock = pygame.time.Clock()
creeps = Creep.spawn_random_creeps(N_CREEPS, bounds)
while True:
time_passed = clock.tick(50)
screen.fill(SCREEN_FILL_COLOR)
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
for creep in creeps:
creep.update(time_passed, bounds)
creep.blitme(screen)
pygame.display.flip()
if __name__ == "__main__":
main()