Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pygame, sys, random, math #Импорт библиотек
- class Main:
- def __init__(self, fps=60):
- self.fps = fps
- # Инициализация PyGame
- pygame.init()
- # Окно демосцены: размер, позиция
- self.screen_resolution = (500,500)
- self.screen = pygame.display.set_mode(self.screen_resolution)
- self.clock = pygame.time.Clock()
- self.display_width, self.display_height = pygame.display.Info().current_w, pygame.display.Info().current_h
- self.crt = [0, 0, 0, 0] #Сдвиг для комет
- self.speed_comet = [10, 15, 10, 4] #Скорость комет
- self.delay_comet = [500, 350, 1000, 1500] #Задержка появления комет
- self.vec = True #Направление маленькой окружности
- self.z = False #Если False то маленькая окружность отрисовывается раньше большей
- self.radius_red_c = 50 #Радиус маленькой окружности
- #Координаты окружностей
- self.coords_orange_c = (int(self.display_width/2), int(self.display_height/2))
- self.coords_red_c = (int(self.display_width/2 - self.radius_red_c/2), int(self.display_height/2 - self.radius_red_c/2))
- #Метод для отрисовки участков фона
- def background_patches(self, color, pos, obl):
- self.screen.fill(color, (pos, obl))
- #Метод для нахождения значения b(rgb) у участков фона
- @staticmethod
- def col(i):
- return 255 if i*2>=255 else i*2
- #Бесконечный цикл
- def run_while(self):
- while True:
- #Вычисляем сдвиг для комет
- for i in range(len(self.crt)):
- self.crt[i] += self.speed_comet[i]
- #Отрисовка фона
- step = 50
- for i in range(int(self.screen_resolution[0]/step + 1)):
- self.background_patches((0,0,self.col(i)), (0+i*step , 0), (step,self.screen_resolution[1]))
- #Отрисовка звезд
- self.cosMY((77,113,152), (0,self.screen_resolution[1]/2))
- self.cosMY((0,33,55), (100,self.screen_resolution[1]/6))
- self.cosMY((0,33,55), (100,self.screen_resolution[1]/1.6))
- self.cosMY((77,113,152), (0,self.screen_resolution[1]/1.1))
- #Отрисовка комет
- self.comet(0);
- self.comet(1, (self.screen_resolution[0], self.screen_resolution[1]/2))
- self.comet(2, (self.screen_resolution[0]/2, 0))
- self.comet(3,( self.screen_resolution[0]/6, 0))
- #Отривка большой и маленькой окружностей с учетом их очереди отрисовки (self.z)
- if self.z:
- pygame.draw.circle(self.screen, "yellow",self.coords_orange_c , 100)
- pygame.draw.circle(self.screen, "red", self.red_circle("coords"), self.red_circle("radius_red_c"))
- else:
- pygame.draw.circle(self.screen, "red", self.red_circle("coords"), self.red_circle("radius_red_c"))
- pygame.draw.circle(self.screen, "yellow",self.coords_orange_c , 100)
- #Обработчик событий
- self.event_handler()
- #Обновление окна и задержка анимации
- pygame.display.flip()
- self.clock.tick(self.fps)
- #Метод для отрисовки окружностей(Звёзд) по Косинусу
- def cosMY(self, color, pos, scale=30):
- #всего 5 окружностей
- vsego = 5
- for xx in range(0, vsego):
- x = xx * 10
- pygame.draw.circle(self.screen, color, (pos[0] + x*scale, pos[1] - math.cos(x)*scale) , 5)
- pygame.draw.circle(self.screen, color, (pos[0] + x*scale, pos[1] - math.cos(x)*scale) , 5)
- #Метод для отрисовки комет
- def comet(self, num = 0, pos = None): #num - номер кометы, pos - координаты кометы
- #Если координаты не были указаны, тогда примут значение - (self.screen_resolution[0], 0)
- if pos == None:
- pos = (self.screen_resolution[0], 0)
- pygame.draw.circle(self.screen, (255,222,173), (pos[0]-self.crt[num], pos[1]+self.crt[num]) , 10)
- pygame.draw.polygon(self.screen, (255,222,173), [(-7+pos[0] - self.crt[num], -6+pos[1] + self.crt[num]),
- (4+pos[0] - self.crt[num], 6+pos[1] + self.crt[num]),
- (24+pos[0] - self.crt[num], -13+pos[1] + self.crt[num]),
- (13+pos[0] - self.crt[num], -24+pos[1] + self.crt[num])])
- pygame.draw.polygon(self.screen, (255,163,163), [(13+pos[0] - self.crt[num], -24+pos[1] + self.crt[num]),
- (24+pos[0] - self.crt[num], -13+pos[1] + self.crt[num]),
- (44+pos[0] - self.crt[num], -33+pos[1] + self.crt[num]),
- (33+pos[0] - self.crt[num], -41+pos[1] + self.crt[num])])
- pygame.draw.polygon(self.screen, (253,123,124), [(33+pos[0] - self.crt[num], -41+pos[1] + self.crt[num]),
- (44+pos[0] - self.crt[num], -33+pos[1] + self.crt[num]),
- (64+pos[0] - self.crt[num], -54+pos[1] + self.crt[num]),
- (53+pos[0] - self.crt[num], -57+pos[1] + self.crt[num])])
- pygame.draw.polygon(self.screen, (189,50,53), [(64+pos[0] - self.crt[num], -54+pos[1] + self.crt[num]),
- (53+pos[0] - self.crt[num], -57+pos[1] + self.crt[num]),
- (94+pos[0] - self.crt[num], -87+pos[1] + self.crt[num]),
- (83+pos[0] - self.crt[num], -75+pos[1] + self.crt[num])])
- pygame.draw.circle(self.screen, (255,255,255), (pos[0] + 2 - self.crt[num], pos[1] - 2 + self.crt[num]), 9)
- #если крайняя точка кометы скрылась за экран, то тогда присваиваем Сдвигу значение задержки со знаком "-"
- if (-72 + self.crt[num]) >= self.screen_resolution[1]:
- self.crt[num] =- self.delay_comet[num]
- #Метод для расчета координат и радиуса подвижной(маленькой) окружности
- def red_circle(self, name):
- speed = 0.3 #Скорость
- coordFATHER = self.coords_orange_c #Координаты большой окружности
- coords = self.coords_red_c #Координаты маленькой окружности
- #Расчет координат и радиуса
- if self.vec:
- coords = [coords[0] - speed, coords[1] - speed]
- self.radius_red_c -= 0.03
- else:
- coords = [coords[0] + speed, coords[1] + speed]
- self.radius_red_c += 0.03
- #Смена направления движения и очередности отрисовки
- if coords[0] <= coordFATHER[0] - self.radius_red_c * 2.5:
- self.vec = False
- self.z = True
- elif coords[0] >= coordFATHER[0] + self.radius_red_c * 2.5:
- self.vec = True
- self.z = False
- dict = {"radius_red_c" : self.radius_red_c, "coords" : coords}
- self.coords_red_c = coords
- return dict[name]
- #Метод для обработки событий
- def event_handler(self):
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- sys.exit()
- if event.type == pygame.KEYDOWN :
- if event.key == pygame.K_ESCAPE:
- pygame.quit()
- sys.exit()
- #Запуск бесконечного цикла
- Main(60).run_while()
Add Comment
Please, Sign In to add comment