Прикреплённый файл «bball.py»

Загрузка

   1 #!/usr/bin/env python
   2 # coding: utf
   3 '''
   4 Модифицировать исходный код примера так, чтобы:
   5 
   6     он заработал :)
   7     в нём использовался таймер вместо максимальной скорости работы цикла;
   8     можно было переставлять мяч кликом мышки;
   9         что делать, если мяч переставили близко к границе? 
  10 
  11     скорость и координаты мяча были бы вещественными числами ( /!\ все операции PyGame с координатами — целочисленные);
  12     можно было бы изменять скорость мяча с клавиатуры стрелками;
  13 
  14     ощущалась бы гравитация ( /!\ это просто постоянное приращение скорости по вертикали).
  15 '''
  16 
  17 import sys
  18 from pygame import *
  19 from math import *
  20 
  21 init()
  22 screen = display.set_mode((800,600))
  23 screenrect = screen.get_rect()
  24 background = Color("midnightblue")
  25 
  26 ball = image.load("ball.gif")
  27 ballrect = ball.get_rect()
  28 
  29 def intn(l):
  30     return [int(s) for s in l]
  31 
  32 def sumn(args, funct=sum):
  33     return [funct(a) for a in zip(*args)]
  34 
  35 def correctball(pos):
  36     newpos, newspeed = list(pos), list(speed)
  37     if newpos[0]<ballrect.width/2:
  38         newpos[0] = ballrect.width/2
  39         newspeed[0] = -speed[0]
  40     elif newpos[0]>screenrect.width-ballrect.width/2:
  41         newpos[0] = screenrect.width-ballrect.width/2
  42         newspeed[0] = -speed[0]
  43     if newpos[1]<ballrect.height/2:
  44         newpos[1] = ballrect.height/2
  45         newspeed[1] = -speed[1]
  46     elif newpos[1]>screenrect.height-ballrect.height/2:
  47         newpos[1] = screenrect.height-ballrect.height/2
  48         newspeed[1] = -speed[1]
  49     return newpos, newspeed
  50 
  51 speed, pos = [1.,1.], screenrect.center
  52 normal, turn, gravity = pi/2, pi/180, [0.,1.]
  53 ballrect.center = intn(pos)
  54 newrect = ballrect.copy()
  55 clock = time.set_timer(USEREVENT,50)
  56 done, drag = False,False
  57 while not done:
  58     ev = event.wait()
  59     if ev.type == QUIT:
  60         done = True
  61         continue
  62     if ev.type == USEREVENT:
  63         speed = sumn((speed,gravity))
  64         pos, speed = correctball(sumn((pos,speed)))
  65     elif ev.type == MOUSEBUTTONDOWN:
  66         if ballrect.collidepoint(ev.pos):
  67             pos = correctball(ev.pos)[0]
  68             drag = True
  69     elif ev.type == MOUSEMOTION:
  70         if ev.buttons[0] and drag:
  71             pos = correctball(ev.pos)[0]
  72             speed = ev.rel
  73     elif ev.type == MOUSEBUTTONUP:
  74         drag = False
  75     elif ev.type == KEYDOWN:
  76         if ev.key == K_UP:
  77             speed[1]*=2.
  78         elif ev.key == K_DOWN:
  79             speed[1]/=2.
  80         elif ev.key == K_LEFT:
  81             normal+=turn
  82             gravity = [cos(normal),sin(normal)]
  83         elif ev.key == K_RIGHT:
  84             normal-=turn
  85             gravity = [cos(normal),sin(normal)]
  86         else:
  87             speed = [0, 0]
  88     else:
  89         print ev
  90 
  91     screen.fill(background)
  92     ballrect.center = intn(pos)
  93     screen.blit(ball, ballrect)
  94 
  95     display.flip()
  96 
  97 
  98             
  99             

Прикреплённые файлы

Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.

Вам нельзя прикреплять файлы к этой странице.