Прикреплённый файл «2013-11-22-bowling.py»
Загрузка 1 #!/usr/bin/env python
2 # coding: utf
3 '''
4 Добавить в пример из документации «ракетку», изменяющую направление полёта мяча при соударении с курсором
5
6 … как-нибудь
7 … с использованием своей картинки для ракетки и учётом размеров мяча и ракетки
8
9 … {*} с учётом того, что и мяч, и ракетка не прямоугольные, следовательно. соприкосновение прозрачными местами не в счёт (с использованием маски)
10
11 … <!> с учётом, что мяч и ракетка круглые (что влияет на угол отражения)
12 '''
13
14
15 import sys, pygame
16 pygame.init()
17
18 size = width, height = 1000,800
19 speed = [1,1]
20 black = 0, 0, 0
21
22 screen = pygame.display.set_mode(size)
23
24 ball = pygame.image.load("ball.gif")
25 ballrect = ball.get_rect()
26 ballmask = pygame.mask.from_surface(ball)
27 # Ракетку сделаем уменьшенной и повёрнутой копией мяча
28 beat = pygame.transform.rotozoom(ball, 90, 0.5)
29 beatrect = beat.get_rect()
30 beatmask = pygame.mask.from_surface(beat)
31
32 # Разница ±speedtresh пикселей не влияет на соударение
33 speedtresh = ballrect.width/3
34
35 ballrect.center=screen.get_rect().center
36 while True:
37 for event in pygame.event.get():
38 if event.type == pygame.QUIT: sys.exit()
39 elif event.type == pygame.MOUSEMOTION:
40 beatrect.center = event.pos
41
42 ballrect.move_ip(speed[0],speed[1])
43
44 if ballrect.colliderect(beatrect):
45 if ballmask.overlap(beatmask, (beatrect.left-ballrect.left, beatrect.top-ballrect.top)):
46 # overlap возвращает первую попавшуюся точку, этого недостаточно
47 hit = ballmask.overlap_mask(beatmask, (beatrect.left-ballrect.left, beatrect.top-ballrect.top))
48 center = hit.centroid()
49 # в текущих условиях (без таймера и с целочисленной скоростью) мало что можно сделать
50 if speed[0]*((center[0]-ballrect.width/2)/speedtresh) > 0: speed[0] = -speed[0]
51 if speed[1]*((center[1]-ballrect.height/2)/speedtresh) > 0: speed[1] = -speed[1]
52 if ballrect.left < 0 or ballrect.right > width:
53 speed[0] = -speed[0]
54 if ballrect.top < 0 or ballrect.bottom > height:
55 speed[1] = -speed[1]
56
57 screen.fill(black)
58 screen.blit(ball, ballrect)
59 screen.blit(beat, beatrect)
60 pygame.display.flip()
Прикреплённые файлы
Для ссылки на прикреплённый файл в тексте страницы напишите attachment:имяфайла, как показано ниже в списке файлов. Не используйте URL из ссылки «[получить]», так как он чисто внутренний и может измениться.- [получить | показать] (2013-11-29 09:52:42, 2.6 KB) [[attachment:2013-11-22-bowling.py]]
- [получить | показать] (2013-11-29 09:52:31, 3.5 KB) [[attachment:2013-11-22-graph.py]]
- [получить | показать] (2013-11-29 09:53:29, 4.9 KB) [[attachment:ball.gif]]
Вам нельзя прикреплять файлы к этой странице.