[ create a new paste ] login | about

Link: http://codepad.org/xfkDuYO4    [ raw code | fork ]

Python, pasted on Jun 3:
#! /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()


Create a new paste based on this one


Comments: