# INTIALISATION
import pygame, math, sys
from pygame.locals import *
screen = pygame.display.set_mode((640, 480))

background = pygame.image.load('track.png')
screen.blit(background, (0,0))

clock = pygame.time.Clock()
class CarSprite(pygame.sprite.Sprite):
    MAX_FORWARD_SPEED = 10
    MAX_REVERSE_SPEED = 5
    ACCELERATION = 2
    TURN_SPEED = 5
    def __init__(self, image, position):
        pygame.sprite.Sprite.__init__(self)
        self.src_image = pygame.image.load(image)
        self.position = position
        self.speed = self.direction = 0
        self.k_left = self.k_right = self.k_down = self.k_up = 0
    def update(self, deltat):
        # SIMULATION
        self.speed += (self.k_up - self.k_down)
        if self.speed > self.MAX_FORWARD_SPEED:
            self.speed = self.MAX_FORWARD_SPEED
        if self.speed < self.MAX_REVERSE_SPEED:
            self.speed = self.MAX_REVERSE_SPEED
        self.direction += (self.k_left - self.k_right)
        x, y = self.position
        rad = self.direction * math.pi / 180
        x += self.speed*math.sin(rad)
        y += self.speed*math.cos(rad)
        self.position = (x, y)
        self.image = pygame.transform.rotate(self.src_image, self.direction)
        self.rect = self.image.get_rect()
        self.rect.center = self.position

# CREATE A CAR AND RUN
rect = screen.get_rect()
car = CarSprite('car.png', rect.center)
car_group = pygame.sprite.RenderPlain(car)

class PadSprite(pygame.sprite.Sprite):
    normal = pygame.image.load('pad_normal.png')
    hit = pygame.image.load('pad_hit.png')
    def __init__(self, number, position):
        pygame.sprite.Sprite.__init__(self)
        self.number = number
        self.rect = pygame.Rect(self.normal.get_rect())
        self.rect.center = position
        self.image = self.normal
pads = [
    PadSprite(1, (100, 100)),
    PadSprite(2, (400, 100)),
    PadSprite(3, (400, 300)),
    PadSprite(4, (100, 300)),
]
current_pad_number = 0
pad_group = pygame.sprite.RenderPlain(*pads)

while 1:
    # USER INPUT
    deltat = clock.tick(30)
    for event in pygame.event.get():
        if not hasattr(event, 'key'): continue
        down = event.type == KEYDOWN
        if event.key == K_RIGHT: car.k_right = down * car.TURN_SPEED
        elif event.key == K_LEFT: car.k_left = down * car.TURN_SPEED
        elif event.key == K_UP: car.k_up = down * car.ACCELERATION
        elif event.key == K_DOWN: car.k_down = down * car.ACCELERATION
        elif event.key == K_ESCAPE: sys.exit(0)
    # RENDERING
    #screen.fill((0,0,0))
    pad_group.clear(screen,background)
    car_group.clear(screen,background)

    car_group.update(deltat)
 
    pads = pygame.sprite.spritecollide(car, pad_group, False)
    if pads:
        pad = pads[0]
        if pad.number == current_pad_number + 1:
            pad.image = pad.hit
            current_pad_number += 1
    elif current_pad_number == 4:
        for pad in pad_group.sprites(): 
            pad.image = pad.normal
        current_pad_number = 0

    pad_group.draw(screen)
    car_group.draw(screen)

    pygame.display.flip()

