import pygame

pygame.init();
pygame.mixer.init()

def gameWindow(width,height,fps):
  """
  Generator function
  will open a window of give width,height
  will loop at given FPS
  yield (drawable surface, 
         [key pressed list], 
         ((mouse positon),
         if mouse button pressed))
  """
  screen = pygame.display.set_mode((width, height),pygame.DOUBLEBUF)
  clock = pygame.time.Clock()

  continu = True;
  while(continu):
    key = [];
    mouseButton = False;
    for event in pygame.event.get():
      if event.type==pygame.QUIT:
        continu = False;
      elif event.type == pygame.KEYDOWN:
        key.append(event.key)
      elif event.type == pygame.MOUSEBUTTONDOWN:
        mouseButton = True;
    mouse = (pygame.mouse.get_pos(), mouseButton);

    pygame.display.flip();
    clock.tick(fps);
    screen.fill((255,255,255))

    yield (screen, key, mouse);

  pygame.quit();

def spriteSheet(filename,(spriteW, spriteH)):
  """
  Closure function
  will load a sprite sheet and separate it in several tile of given (spriteW, spriteH)
  return stamp function list that take (surface, (destX,destY)) and blit it to the surface
  """
  sheet = pygame.image.load(filename);
  sheet.set_colorkey(sheet.get_at((0,0)));
  sheetRect = sheet.get_rect();
  stamps = [];

  def stampBuild(srcX,srcY):
    def stamp(destSurface,(destX,destY)):
      srcRect = pygame.Rect(srcX,srcY,spriteW,spriteH);
      srcSurface = sheet.subsurface(srcRect);
      destRect = pygame.Rect(destX,destY,spriteW,spriteH);
      destSurface.blit(srcSurface, destRect);
    return stamp;

  for srcX in range(0,sheetRect.w-spriteW,spriteW):
    for srcY in range(0,sheetRect.h-spriteH,spriteH):
      stamps.append(stampBuild(srcX,srcY));
  return stamps;

def spriteSquare(color,(spriteW,spriteH)):
  """
  """
  def stamp(destSurface,(destX,destY)):
    destRect = pygame.Rect(destX,destY,spriteW,spriteH);
    pygame.draw.rect(destSurface, color, destRect);
  return stamp;
  
def soundSample(filename):
  """
  """
  sound = pygame.mixer.Sound(filename);
  def player():
    sound.play();
  return player;

def playMusic(filename):
  """
  """
  pygame.mixer.music.stop();
  pygame.mixer.music.load(filename):
  pygame.mixer.music.play();

if __name__ == "__main__":
  #stamps = spriteSheet("./spritelib_gpl/platform/arc1.png",(34,44));
  stamp2 = spriteSquare((255,0,0),(16,16));
  #bark = soundSample("./sound/bark.ogg");
  print len(stamps);
  print stamps;
  for pig in gameWindow(256,256,1):
    print pig;
    #stamps[10](pig[0],(10,0))
    stamp2(pig[0],(40,40))
    #bark();
