Прикреплённый файл «2013-12-06-balls-simple.py»
Загрузка 1 #!/usr/bin/env python
2 # coding: utf
3 '''
4 Прыгающие шарики. В прямоугольной комнате прыгают два шарика.
5 шарики можно ловить мышью (тогда пойманный шарик не движется) и перетаскивать
6 с заданием класса balls, содержащего параметры мяча (получится аналог структуры в Си/Си++ или записи в Паскале). Шары должны быть объектами этого класса.
7 … + с гравитацией и соударением шаров (гравитация — это всего лишь приращение скорости, а про соударение написано здесь, это «абсолютно упругое соударение частиц разной массы»)
8 … + с порождением небольшого произвольного числа шаров (получится список объектов)
9 … + <!> с созданием производного класса для вращающихся по ходу дела шаров. Одни вращаются, другие — нет (видимо, придётся вводить метод, который будет каждый такт игрового времени изменять вид шара, для одних шаров он будет пустой, для других — вращать
10 '''
11
12 # вариант без столкновений и производных классов
13
14 import pygame, random
15 from math import *
16
17 class Ball():
18 '''Прыгающий объект'''
19
20 def __init__(self, img_file, rot=0., zoom=1.):
21 '''Создание «шара» из файла с указанием поворота и размера'''
22 self.img = pygame.transform.rotozoom(pygame.image.load(img_file),rot,zoom)
23 self.mask = pygame.mask.from_surface(self.img)
24 self.rect = self.img.get_rect()
25 self.speed = [0,0]
26 self.pos = None
27
28 def __repr__(self):
29 return "Ball: {0}, spped {1}".format(self.rect, self.speed)
30
31
32 def MoveBall(ball, pos, dspeed=None):
33 '''Переместить шар (и слегка бросить его, если задан dspeed)'''
34 # TODO не вылезать за границы экрана
35 ball.pos=pos
36 if dspeed:
37 ball.speed=list(dspeed)
38
39 def Move(ball):
40 '''Подвинуть объект с учётом границ и силы тяжести'''
41 ball.speed[1]+=G
42 x,y = ball.pos[0]+ball.speed[0], ball.pos[1]+ball.speed[1]
43 if not ball.rect.width/2<x<width-ball.rect.width/2:
44 ball.speed[0]=-ball.speed[0]
45 if not ball.rect.height/2<y<height-ball.rect.height/2:
46 ball.speed[1]=-ball.speed[1]
47 MoveBall(ball, (x+ball.speed[0], y+ball.speed[1]))
48
49 def int2(f):
50 '''Преобразование вещественных координат в целочисленные'''
51 return int(f[0]),int(f[1])
52
53 def Recalc():
54 '''Пересчёт игрового пространства'''
55 for ball in balls:
56 if ball.pos and not (ball is moved):
57 Move(ball)
58
59 def Redraw():
60 '''Отображение игрового пространства'''
61 screen.fill(back)
62 for ball in balls:
63 if ball.pos:
64 ball.rect.center = int2(ball.pos)
65 screen.blit(ball.img, ball.rect)
66
67 def CatchBall(pos):
68 for ball in balls:
69 if ball.pos and ball.rect.collidepoint(pos):
70 return ball
71
72 def GenBall():
73 '''Довольно случайный объект :)'''
74 return Ball("ball.gif", random.randrange(360), 0.3+random.random())
75
76 G=0.2
77 size = width, height = 960,700
78 pygame.init()
79 screen = pygame.display.set_mode(size)
80 back = pygame.Color("midnightblue")
81
82 balls = []
83 again, recalc, moved = True, True, None
84 pygame.time.set_timer(pygame.USEREVENT, 50)
85 while again:
86 for event in [pygame.event.wait()]+pygame.event.get():
87 if event.type == pygame.QUIT:
88 again = False
89 elif event.type == pygame.USEREVENT:
90 recalc = True
91 elif event.type == pygame.MOUSEBUTTONDOWN:
92 if event.button == 1:
93 moved = CatchBall(event.pos)
94 print moved
95 elif event.button == 3:
96 balls.append(GenBall())
97 balls[-1].pos=event.pos
98 redraw = True
99 elif event.type == pygame.MOUSEMOTION:
100 if event.buttons[0] and moved:
101 MoveBall(moved,event.pos,event.rel)
102 elif event.type == pygame.MOUSEBUTTONUP:
103 moved = None
104 # Взаимодействие объектов
105 if recalc:
106 Recalc()
107 redraw, recalc = True, False
108 # Обновление картинки
109 if redraw:
110 Redraw()
111 redraw = False
112 pygame.display.flip()
113 pygame.quit()
Прикреплённые файлы
Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.Вам нельзя прикреплять файлы к этой странице.