diff --git a/design.py b/design.py index 642adf7..203ad20 100644 --- a/design.py +++ b/design.py @@ -1,8 +1,14 @@ import pygame, random -import os, time, math +import os, math, time +from datetime import datetime +time_delta = datetime.strptime('2018-03-21T14:35:18.000Z', '%Y-%m-%dT%H:%M:%S.000Z') +gg = False +ww = False +www = False w = 1200 h = 600 +rgb = (120, 120, 120) fps = 60 a = -10 b = 15 @@ -13,6 +19,8 @@ wb = 10 hb = 10 particles = [] +particles1 = [] +particles2 = [] BLUE = (0, 0, 255) fixspeed = 20 # Переменные для установки ширины и высоты окна @@ -36,7 +44,8 @@ # Здесь лишь создание переменной, вывод заднего фона ниже в коде bg = pygame.image.load('blue.jpeg') zzz = True - +canshoot = True +cantp = True # Класс, описывающий поведение главного игрока class Player(pygame.sprite.Sprite): @@ -50,6 +59,7 @@ class Player(pygame.sprite.Sprite): # Методы def __init__(self): global rect + self.change_tp = 60 self.k = 0 self.b = 15 self.c = 0 @@ -64,7 +74,7 @@ def __init__(self): # Установите ссылку на изображение прямоугольника self.rect = self.image.get_rect() rect = self.rect - + self.change_tp_per = 0 # Задаем вектор скорости игрока self.change_x = 0 self.change_y = 0 @@ -73,6 +83,8 @@ def update(self): global pers global rect global k + global www + global px, py # В этой функции мы передвигаем игрока # Сперва устанавливаем для него гравитацию self.calc_grav() @@ -87,9 +99,14 @@ def update(self): elif self.change_x != 0: if self.k != 60: self.image = pygame.image.load('бег/' + str(pers[int(self.k)])) + www = True if not self.right: self.flip() self.rect = self.image.get_rect(topleft=(self.rect.x, self.rect.y)) + if not self.right: + px, py = self.rect.bottomright[0] - 10, self.rect.bottomright[1] + else: + px, py = self.rect.bottomleft[0] + 10, self.rect.bottomleft[1] self.k += 1 else: self.k = 0 @@ -99,7 +116,8 @@ def update(self): self.flip() self.right = True self.zzz = False - + if self.change_tp != 240: + self.change_tp += self.change_tp_per # Следим ударяем ли мы какой-то другой объект, платформы, например block_hit_list = pygame.sprite.spritecollide(self, self.level.platform_list, False) # Перебираем все возможные объекты, с которыми могли бы столкнуться @@ -146,33 +164,87 @@ def calc_grav(self): def Shoot(self): global zzz global k - speedx = 25 - if not zzz: - speedx *= -1 - else: - speedx *= 1 - if k == 8: - shoot_sound = pygame.mixer.Sound('tetiva.wav') - shoot_sound.play() - # if self.change_y == 0 and self.change_x == 0: - if self.c != 57: - self.image = pygame.image.load('стрельба/' + str(sshot[self.c])) + global t1 + global canshoot + if canshoot: + speedx = 25 if not zzz: - self.flip() - self.rect = self.image.get_rect(topleft=(self.rect.x, self.rect.y)) - self.c += 1 - if self.c == 35: - shoot_sound = pygame.mixer.Sound('strela.wav') + speedx *= -1 + else: + speedx *= 1 + if k == 8: + shoot_sound = pygame.mixer.Sound('tetiva.wav') shoot_sound.play() - if self.c == 45: - if speedx < 0: - bullet = Bullet(self.rect.centerx - 43, self.rect.centery - 15, speedx) - else: - bullet = Bullet(self.rect.centerx - 27, self.rect.centery - 15, speedx) - bullets.add(bullet) - active_sprite_list.add(bullet) + # if self.change_y == 0 and self.change_x == 0: + if self.c != 57: + self.image = pygame.image.load('стрельба/' + str(sshot[self.c])) + if not zzz: + self.flip() + self.rect = self.image.get_rect(topleft=(self.rect.x, self.rect.y)) + self.c += 1 + if self.c == 35: + shoot_sound = pygame.mixer.Sound('strela.wav') + shoot_sound.play() + t1 = datetime.now() + if self.c == 45: + if speedx < 0: + bullet = Bullet(self.rect.centerx - 43, self.rect.centery - 15, speedx) + else: + bullet = Bullet(self.rect.centerx - 27, self.rect.centery - 15, speedx) + bullets.add(bullet) + active_sprite_list.add(bullet) + else: + self.c = 0 + canshoot = False + else: + self.reload() + if canshoot: + self.Shoot() + + def reload(self): + global t1 + global time_delta + global canshoot + time_delta = datetime.now() - t1 + if time_delta.total_seconds() >= 10: + canshoot = True + + def reload_tp(self): + global t2 + global time_delta_tp + global cantp + time_delta_tp = datetime.now() - t2 + if time_delta_tp.total_seconds() >= 18: + cantp = True + + def teleport(self): + global gg + global tx, ty + tx = self.rect.x + ty = self.rect.y + if zzz: + self.rect.x += self.change_tp + else: + self.rect.x -= self.change_tp + self.change_tp = 60 + self.change_tp_per = 0 + gg = False + + def tele(self): + global cantp + if cantp: + global gg + global t2 + t2 = datetime.now() + gg = True + self.change_tp_per = 6 + cantp = False else: - self.c = 0 + self.reload_tp() + if cantp: + self.tele() + else: + self.change_tp = 0 def jump(self): global rect @@ -189,6 +261,11 @@ def jump(self): self.change_y = -16 rect = self.rect + def down(self): + global rect + self.change_y = 16 + rect = self.rect + # Передвижение игрока def go_left(self): global zzz @@ -207,7 +284,9 @@ def go_right(self): zzz = True def stop(self): + global www global zzz + www = False # вызываем этот метод, когда не нажимаем на клавиши self.image = pygame.image.load('imgonline-com-ua-Resize-7XzS01XpL1HN9.png') if not self.right and self.k != 0: @@ -241,11 +320,26 @@ def __init__(self, width, height): self.rect = self.image.get_rect() +class Rel_plat(pygame.sprite.Sprite): + def __init__(self, width): + # Конструктор платформ + super().__init__() + # Также указываем фото платформы + if width == 0: + self.image = pygame.image.load('Strel.png') + else: + self.image = pygame.image.load('Tp_Rel.png') + + # Установите ссылку на изображение прямоугольника + self.rect = self.image.get_rect() + + # Класс для расстановки платформ на сцене class Level(object): def __init__(self, player): # Создаем группу спрайтов (поместим платформы различные сюда) self.platform_list = pygame.sprite.Group() + self.reload_list = pygame.sprite.Group() # Ссылка на основного игрока self.player = player @@ -253,6 +347,7 @@ def __init__(self, player): # При вызове этого метода обновление будет происходить def update(self): self.platform_list.update() + self.reload_list.update() # Метод для рисования объектов на сцене def draw(self, screen): @@ -260,6 +355,7 @@ def draw(self, screen): screen.blit(bg, (0, 0)) # Рисуем все платформы из группы спрайтов self.platform_list.draw(screen) + self.reload_list.draw(screen) # Класс, что описывает где будут находится все платформы @@ -276,6 +372,7 @@ def __init__(self, player): [210, 32, 200, 400], [210, 32, 600, 300], ] + rel = [[10, 10], [70, 10]] # Перебираем массив и добавляем каждую платформу в группу спрайтов - platform_list for platform in level: @@ -284,10 +381,19 @@ def __init__(self, player): block.rect.y = platform[3] block.player = self.player self.platform_list.add(block) + for platform in rel: + block = Rel_plat(rel.index(platform)) + block.rect.x = platform[0] + block.rect.y = platform[1] + block.player = self.player + self.reload_list.add(block) class Bullet(pygame.sprite.Sprite): def __init__(self, x, y, speedx): + + global ww + ww = True pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load('Стрела.png') if speedx < 0: @@ -298,31 +404,19 @@ def __init__(self, x, y, speedx): self.speedx = speedx def update(self): + global ww + global mx, my self.rect.x += self.speedx + if self.speedx < 0: + mx, my = self.rect.x - 4, self.rect.y + 2 + else: + mx, my = self.rect.x + 67, self.rect.y + 2 if self.rect.x > SCREEN_WIDTH + 200: self.kill() elif self.rect.x < -200: self.kill() -class Particles: - def __init__(self, x, y): - mx, my = x, y - particles.append([[mx, my], [random.randint(0, 20) / 10 - 1, -2], random.randint(4, 6)]) - - def update(self): - particle = particles[0] - particle[0][0] += particle[1][0] - particle[2] -= 0.1 - particle[1][1] += 0.1 - self.rect = pygame.draw.circle(screen, (226, 88, 34), [int(particle[0][0]), int(particle[0][1])], int(particle[2])) - bullets.add( - self.rect) - pygame.draw.circle(screen, (226, 88, 34), [int(particle[0][0]), int(particle[0][1])], int(particle[2])) - if particle[2] <= 0: - particles.remove(particle) - - k = 0 bullets = pygame.sprite.Group() @@ -333,6 +427,8 @@ def update(self): def main(): global k global screen + global time_delta + global time_delta_tp # Инициализация pygame.init() @@ -359,7 +455,7 @@ def main(): player.rect.x = 340 player.rect.y = SCREEN_HEIGHT - player.rect.height active_sprite_list.add(player) - + zu = 0 # Цикл будет до тех пор, пока пользователь не нажмет кнопку закрытия done = False @@ -381,6 +477,10 @@ def main(): player.go_right() if event.key == pygame.K_UP or event.key == pygame.K_w: player.jump() + if event.key == pygame.K_DOWN or event.key == pygame.K_s: + player.down() + if event.key == pygame.K_e: + player.tele() elif event.type == pygame.KEYUP: if event.key == pygame.K_LEFT and player.change_x < 0 or event.key == pygame.K_a and \ @@ -389,19 +489,23 @@ def main(): if event.key == pygame.K_RIGHT and player.change_x > 0 or event.key == pygame.K_d and \ player.change_x > 0: player.stop() + if event.key == pygame.K_e: + player.teleport() elif event.type == pygame.MOUSEBUTTONDOWN: if event.button == 3: if player.change_x == 0 and player.change_y == 0: player.Shoot() - k += 1 - if k == 58: - k = 0 + if canshoot: + k += 1 + if k == 58: + k = 0 if k != 0: - player.Shoot() - k += 1 - if k == 58: - k = 0 + if canshoot: + player.Shoot() + k += 1 + if k == 58: + k = 0 # Обновляем игрока active_sprite_list.update() @@ -420,6 +524,78 @@ def main(): # Рисуем объекты на окне current_level.draw(screen) active_sprite_list.draw(screen) + if ww: + particles.append([[mx, my], [random.randint(0, 20) / 10 - 1, -2], random.randint(4, 6)]) + for particle in particles: + particle[0][1] -= particle[1][0] + + particle[2] -= 0.1 + particle[1][1] += 0.1 + pygame.draw.circle(screen, (226, 88, 34), [int(particle[0][0]), int(particle[0][1])], int(particle[2])) + if particle[2] <= 0: + particles.remove(particle) + if www: + particles1.append([[px, py], [random.randint(1, 2), 2], random.randint(2, 4)]) + for particle in particles1: + particle[0][1] -= particle[1][0] + particle[2] -= 0.1 + particle[1][1] += 0.1 + pygame.draw.circle(screen, rgb, [int(particle[0][0]), int(particle[0][1])], int(particle[2])) + if particle[2] <= 2: + particles1.remove(particle) + else: + for particle in particles1: + particle[0][1] -= particle[1][0] + particle[2] -= 0.1 + particle[1][1] += 0.1 + pygame.draw.circle(screen, rgb, [int(particle[0][0]), int(particle[0][1])], int(particle[2])) + if particle[2] <= 2: + particles1.remove(particle) + if gg: + zu = 1 + if zzz: + pygame.draw.circle(screen, (0, 0, 255), + [int(player.rect.x + player.change_tp + 10), int(player.rect.centery - 5)], 6) + else: + pygame.draw.circle(screen, (0, 0, 255), + [int(player.rect.x - player.change_tp + 30), int(player.rect.centery - 5)], 6) + if zzz: + particles2.append([[int(player.rect.x + player.change_tp + 10), int(player.rect.centery - 5)], + [2, -2], random.randint(1, 2), random.randint(1, 3)]) + else: + particles2.append([[int(player.rect.x - player.change_tp + 30), int(player.rect.centery - 5)], + [2, -2], random.randint(1, 2), random.randint(1, 3)]) + for particle in particles2: + particle[0][1] += particle[1][1] + particle[2] -= 0.05 + particle[1][1] += 0.05 + f = [int(particle[0][0]), int(particle[0][0]) - 1, int(particle[0][0]) + 1, int(particle[0][0]) - 2, + int(particle[0][0]) + 2, int(particle[0][0]) - 5, int(particle[0][0]) + 5] + pygame.draw.circle(screen, (0, 0, 255), [ + random.choice(f), + int(particle[0][1]) - 3], int(particle[2])) + if particle[2] <= particle[3]: + particles2.remove(particle) + + if len(particles2) != 0 and not gg: + for particle in particles2: + particles2.remove(particle) + if ww: + p = Player() + p.reload() + if time_delta.total_seconds() != 0 and int(time_delta.total_seconds()) < 10: + f1 = pygame.font.Font(None, 45) + text1 = f1.render(str(10 - int(time_delta.total_seconds())), True, + (255, 0, 0)) + screen.blit(text1, (20, 25)) + if not gg and zu != 0: + p = Player() + p.reload_tp() + if time_delta_tp.total_seconds() != 0 and int(time_delta_tp.total_seconds()) < 18: + f1 = pygame.font.Font(None, 45) + text1 = f1.render(str(18 - int(time_delta_tp.total_seconds())), True, + (255, 0, 0)) + screen.blit(text1, (80, 25)) # Устанавливаем количество фреймов clock.tick(30)