fevzi02

ДемоСцена_Космос

Jan 31st, 2022 (edited)
1,112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.36 KB | None | 0 0
  1. import pygame, sys, random, math #Импорт библиотек
  2.  
  3. class Main:
  4.     def __init__(self, fps=60):
  5.         self.fps = fps
  6.         # Инициализация PyGame
  7.         pygame.init()
  8.         # Окно демосцены: размер, позиция
  9.         self.screen_resolution = (500,500)
  10.         self.screen = pygame.display.set_mode(self.screen_resolution)
  11.  
  12.         self.clock = pygame.time.Clock()
  13.         self.display_width, self.display_height = pygame.display.Info().current_w, pygame.display.Info().current_h
  14.  
  15.         self.crt = [0, 0, 0, 0] #Сдвиг для комет
  16.         self.speed_comet = [10, 15, 10, 4] #Скорость комет
  17.         self.delay_comet = [500, 350, 1000, 1500] #Задержка появления комет
  18.  
  19.         self.vec = True #Направление маленькой окружности
  20.         self.z = False #Если False то маленькая окружность отрисовывается раньше большей
  21.  
  22.         self.radius_red_c = 50 #Радиус маленькой окружности
  23.         #Координаты окружностей
  24.         self.coords_orange_c = (int(self.display_width/2), int(self.display_height/2))
  25.         self.coords_red_c = (int(self.display_width/2 - self.radius_red_c/2), int(self.display_height/2 - self.radius_red_c/2))
  26.  
  27.     #Метод для отрисовки участков фона
  28.     def background_patches(self, color, pos, obl):
  29.         self.screen.fill(color, (pos, obl))
  30.  
  31.     #Метод для нахождения значения b(rgb) у участков фона
  32.     @staticmethod
  33.     def col(i):
  34.         return 255 if i*2>=255 else i*2
  35.  
  36.     #Бесконечный цикл
  37.     def run_while(self):
  38.         while True:
  39.             #Вычисляем сдвиг для комет
  40.             for i in range(len(self.crt)):
  41.                 self.crt[i] += self.speed_comet[i]
  42.  
  43.             #Отрисовка фона
  44.             step = 50
  45.             for i in range(int(self.screen_resolution[0]/step + 1)):
  46.                 self.background_patches((0,0,self.col(i)), (0+i*step , 0), (step,self.screen_resolution[1]))
  47.  
  48.             #Отрисовка звезд
  49.             self.cosMY((77,113,152), (0,self.screen_resolution[1]/2))
  50.             self.cosMY((0,33,55), (100,self.screen_resolution[1]/6))
  51.             self.cosMY((0,33,55), (100,self.screen_resolution[1]/1.6))
  52.             self.cosMY((77,113,152), (0,self.screen_resolution[1]/1.1))
  53.  
  54.             #Отрисовка комет
  55.             self.comet(0);
  56.             self.comet(1, (self.screen_resolution[0], self.screen_resolution[1]/2))
  57.             self.comet(2, (self.screen_resolution[0]/2, 0))
  58.             self.comet(3,( self.screen_resolution[0]/6, 0))
  59.  
  60.             #Отривка большой и маленькой окружностей с учетом их очереди отрисовки (self.z)
  61.             if self.z:
  62.                 pygame.draw.circle(self.screen, "yellow",self.coords_orange_c , 100)
  63.                 pygame.draw.circle(self.screen, "red", self.red_circle("coords"), self.red_circle("radius_red_c"))
  64.             else:
  65.                 pygame.draw.circle(self.screen, "red", self.red_circle("coords"), self.red_circle("radius_red_c"))
  66.                 pygame.draw.circle(self.screen, "yellow",self.coords_orange_c , 100)
  67.  
  68.             #Обработчик событий
  69.             self.event_handler()
  70.  
  71.             #Обновление окна и задержка анимации
  72.             pygame.display.flip()
  73.             self.clock.tick(self.fps)
  74.  
  75.     #Метод для отрисовки окружностей(Звёзд) по Косинусу
  76.     def cosMY(self, color, pos, scale=30):
  77.         #всего 5 окружностей
  78.         vsego = 5
  79.         for xx in range(0, vsego):
  80.             x = xx * 10
  81.             pygame.draw.circle(self.screen, color, (pos[0] + x*scale, pos[1]  - math.cos(x)*scale) , 5)
  82.             pygame.draw.circle(self.screen, color, (pos[0] + x*scale, pos[1]  - math.cos(x)*scale) , 5)
  83.  
  84.     #Метод для отрисовки комет
  85.     def comet(self, num = 0, pos = None): #num - номер кометы, pos - координаты кометы
  86.         #Если координаты не были указаны, тогда примут значение - (self.screen_resolution[0], 0)
  87.         if pos == None:
  88.             pos = (self.screen_resolution[0], 0)
  89.  
  90.         pygame.draw.circle(self.screen, (255,222,173), (pos[0]-self.crt[num], pos[1]+self.crt[num]) , 10)
  91.  
  92.         pygame.draw.polygon(self.screen, (255,222,173), [(-7+pos[0] - self.crt[num], -6+pos[1] + self.crt[num]),
  93.                                                     (4+pos[0] - self.crt[num], 6+pos[1] + self.crt[num]),
  94.                                                     (24+pos[0] - self.crt[num], -13+pos[1] + self.crt[num]),
  95.                                                     (13+pos[0] - self.crt[num], -24+pos[1] + self.crt[num])])
  96.  
  97.         pygame.draw.polygon(self.screen, (255,163,163), [(13+pos[0] - self.crt[num], -24+pos[1] + self.crt[num]),
  98.                                                     (24+pos[0] - self.crt[num], -13+pos[1] + self.crt[num]),
  99.                                                     (44+pos[0] - self.crt[num], -33+pos[1] + self.crt[num]),
  100.                                                     (33+pos[0] - self.crt[num], -41+pos[1] + self.crt[num])])
  101.  
  102.         pygame.draw.polygon(self.screen, (253,123,124), [(33+pos[0] - self.crt[num], -41+pos[1] + self.crt[num]),
  103.                                                     (44+pos[0] - self.crt[num], -33+pos[1] + self.crt[num]),
  104.                                                     (64+pos[0] - self.crt[num], -54+pos[1] + self.crt[num]),
  105.                                                     (53+pos[0] - self.crt[num], -57+pos[1] + self.crt[num])])
  106.  
  107.         pygame.draw.polygon(self.screen, (189,50,53), [(64+pos[0] - self.crt[num], -54+pos[1] + self.crt[num]),
  108.                                                     (53+pos[0] - self.crt[num], -57+pos[1] + self.crt[num]),
  109.                                                     (94+pos[0] - self.crt[num], -87+pos[1] + self.crt[num]),
  110.                                                     (83+pos[0] - self.crt[num], -75+pos[1] + self.crt[num])])
  111.  
  112.         pygame.draw.circle(self.screen, (255,255,255), (pos[0] + 2 - self.crt[num], pos[1] - 2 + self.crt[num]), 9)
  113.  
  114.         #если крайняя точка кометы скрылась за экран, то тогда присваиваем Сдвигу значение задержки со знаком "-"
  115.         if (-72 + self.crt[num]) >= self.screen_resolution[1]:
  116.             self.crt[num] =- self.delay_comet[num]
  117.  
  118.     #Метод для расчета координат и радиуса подвижной(маленькой) окружности
  119.     def red_circle(self, name):
  120.         speed = 0.3 #Скорость
  121.         coordFATHER = self.coords_orange_c #Координаты большой окружности
  122.         coords = self.coords_red_c #Координаты маленькой окружности
  123.  
  124.         #Расчет координат и радиуса
  125.         if self.vec:
  126.             coords = [coords[0] - speed, coords[1] - speed]
  127.             self.radius_red_c -= 0.03
  128.         else:
  129.             coords = [coords[0] + speed, coords[1] + speed]
  130.             self.radius_red_c += 0.03
  131.  
  132.         #Смена направления движения и очередности отрисовки
  133.         if coords[0] <= coordFATHER[0] - self.radius_red_c * 2.5:
  134.             self.vec = False
  135.             self.z = True
  136.         elif coords[0] >= coordFATHER[0] + self.radius_red_c * 2.5:
  137.             self.vec = True
  138.             self.z = False
  139.  
  140.         dict = {"radius_red_c" : self.radius_red_c, "coords" : coords}
  141.  
  142.         self.coords_red_c = coords
  143.  
  144.         return dict[name]
  145.  
  146.     #Метод для обработки событий
  147.     def event_handler(self):
  148.         for event in pygame.event.get():
  149.             if event.type == pygame.QUIT:
  150.                 pygame.quit()
  151.                 sys.exit()
  152.             if event.type == pygame.KEYDOWN :
  153.                 if event.key == pygame.K_ESCAPE:
  154.                     pygame.quit()
  155.                     sys.exit()
  156.  
  157. #Запуск бесконечного цикла
  158. Main(60).run_while()
  159.  
Add Comment
Please, Sign In to add comment