Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2015-02-13 16:43:41, 4.9 KB) [[attachment:ball.gif]]
- [получить | показать] (2015-02-13 16:43:26, 3.1 KB) [[attachment:bball.py]]
Вам нельзя прикреплять файлы к этой странице.