import random, os, time
import pygame
from pygame.locals import *

SCREENRECT = Rect(0, 0, 500, 500)
main_dir = os.path.split(os.path.abspath(__file__))[0]


def load_image(file, transparent):
    "loads an image, prepares it for play"
    file = os.path.join(main_dir, file)
    try:
        surface = pygame.image.load(file)
    except pygame.error:
        raise SystemExit('Could not load image "%s" %s' %
                         (file, pygame.get_error()))
    if transparent:
        corner = surface.get_at((0, 0))
        surface.set_colorkey(corner, RLEACCEL)
    return surface.convert()

def crop_image(image, rect):
    result = pygame.Surface((rect.w, rect.h))
    result.blit(image, (0, 0, rect.w, rect.h), rect)
    return result

class Dog(pygame.sprite.Sprite):
    images = []
    down = [0, 1]
    left = [2, 3]
    up = [4, 5]
    right = [6, 7]
    asleep = [12, 13, 14]
    sit = [15]

    def __init__(self):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.image = self.images[0]
        self.rect = self.image.get_rect().inflate(-3, -3)
        self.dirx = 0
        self.diry = 0
        self.cycle = 0
        self.lastmove = time.time()

    def move(self, dirx, diry):
        if time.time() - self.lastmove > 1:
            current = self.cycle / 10 % len(Dog.asleep)
            self.image = self.images[Dog.asleep[current]]
            self.cycle += 1
        if dirx == 0 and diry == 0: return
        self.lastmove = time.time()

        self.rect.move_ip(dirx * 1.5, diry * 1.5)
        # reset the animation cycle if we changed direction
        if self.dirx != dirx or self.diry != diry:
            self.cycle = 0
        # horizontal animation takes precedence over vertical
        if dirx != 0:
            frames = Dog.right if dirx > 0 else Dog.left
        else:
            frames = Dog.down if diry > 0 else Dog.up
        self.image = self.images[frames[self.cycle / 10 % len(frames)]]
        self.cycle = self.cycle + 1
        self.dirx = dirx
        self.diry = diry

def main(winstyle = 0):

    pygame.init()
    bestdepth = pygame.display.mode_ok(SCREENRECT.size, winstyle, 32)
    screen = pygame.display.set_mode(SCREENRECT.size, winstyle, bestdepth)

    dog_sheet = load_image("dog.png", True)
    frames = []
    for i in range(8):
        frames.append(crop_image(dog_sheet, Rect(0 + i * 30, 0, 30, 30)))
        frames.append(crop_image(dog_sheet, Rect(0 + i * 30, 30, 30, 60)))
    Dog.images = frames

    background = pygame.Surface(SCREENRECT.size)
    background.fill(Color('black'))
    screen.blit(background, (0, 0))

    all = pygame.sprite.RenderUpdates()
    Dog.containers = all
    clock = pygame.time.Clock()

    player = Dog()
    player.rect.top, player.rect.left = SCREENRECT.centery, SCREENRECT.centerx

    while player.alive():
        pygame.event.pump()
        keys = pygame.key.get_pressed()

        if keys[K_ESCAPE]: return

        dirx = keys[K_RIGHT] - keys[K_LEFT]
        diry = keys[K_DOWN] - keys[K_UP]

        player.move(dirx, diry)

        all.clear(screen, background)
        all.update()

        dirty = all.draw(screen)
        pygame.display.update(dirty)

        clock.tick(60)

if __name__ == '__main__':
    main()

