#!/usr/bin/env python
# coding: utf
'''
Модифицировать исходный код примера так, чтобы:

    он заработал :)
    в нём использовался таймер вместо максимальной скорости работы цикла;
    можно было переставлять мяч кликом мышки;
        что делать, если мяч переставили близко к границе? 

    скорость и координаты мяча были бы вещественными числами ( /!\ все операции PyGame с координатами — целочисленные);
    можно было бы изменять скорость мяча с клавиатуры стрелками;

    ощущалась бы гравитация ( /!\ это просто постоянное приращение скорости по вертикали).
'''

import sys
from pygame import *
from math import *

init()
screen = display.set_mode((800,600))
screenrect = screen.get_rect()
background = Color("midnightblue")

ball = image.load("ball.gif")
ballrect = ball.get_rect()

def intn(l):
    return [int(s) for s in l]

def sumn(args, funct=sum):
    return [funct(a) for a in zip(*args)]

def correctball(pos):
    newpos, newspeed = list(pos), list(speed)
    if newpos[0]<ballrect.width/2:
        newpos[0] = ballrect.width/2
        newspeed[0] = -speed[0]
    elif newpos[0]>screenrect.width-ballrect.width/2:
        newpos[0] = screenrect.width-ballrect.width/2
        newspeed[0] = -speed[0]
    if newpos[1]<ballrect.height/2:
        newpos[1] = ballrect.height/2
        newspeed[1] = -speed[1]
    elif newpos[1]>screenrect.height-ballrect.height/2:
        newpos[1] = screenrect.height-ballrect.height/2
        newspeed[1] = -speed[1]
    return newpos, newspeed

speed, pos = [1.,1.], screenrect.center
normal, turn, gravity = pi/2, pi/180, [0.,1.]
ballrect.center = intn(pos)
newrect = ballrect.copy()
clock = time.set_timer(USEREVENT,50)
done, drag = False,False
while not done:
    ev = event.wait()
    if ev.type == QUIT:
        done = True
        continue
    if ev.type == USEREVENT:
        speed = sumn((speed,gravity))
        pos, speed = correctball(sumn((pos,speed)))
    elif ev.type == MOUSEBUTTONDOWN:
        if ballrect.collidepoint(ev.pos):
            pos = correctball(ev.pos)[0]
            drag = True
    elif ev.type == MOUSEMOTION:
        if ev.buttons[0] and drag:
            pos = correctball(ev.pos)[0]
            speed = ev.rel
    elif ev.type == MOUSEBUTTONUP:
        drag = False
    elif ev.type == KEYDOWN:
        if ev.key == K_UP:
            speed[1]*=2.
        elif ev.key == K_DOWN:
            speed[1]/=2.
        elif ev.key == K_LEFT:
            normal+=turn
            gravity = [cos(normal),sin(normal)]
        elif ev.key == K_RIGHT:
            normal-=turn
            gravity = [cos(normal),sin(normal)]
        else:
            speed = [0, 0]
    else:
        print ev

    screen.fill(background)
    ballrect.center = intn(pos)
    screen.blit(ball, ballrect)

    display.flip()


            
            
