Прикреплённый файл «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 из ссылки «[получить]», так как он чисто внутренний и может измениться.

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