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

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