Advertisement
Orleon

Lesson 11

Nov 29th, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 21.53 KB | None | 0 0
  1. #Наша первая игра
  2. import pygame
  3. import random      #Модуль случайности
  4. import lib_game
  5. from pygame.math import Vector2
  6.  
  7.  
  8. imgdir = "./media/img"
  9. snddir = "./media/snd"
  10.  
  11.  
  12. width = 1280    #Ширина экрана
  13. height = 720    #Высота экрана
  14. fps = 60        #Скорость работы игры
  15. gameName = "Mega Shooter"
  16.  
  17. forestgreen = (34, 139, 34)
  18. yellow = (255, 255, 0)
  19. white = (255,255,255)
  20. red = (255,0,0)
  21. purple = (255,0,255)
  22. blue = (0,0,255)
  23.  
  24. pygame.init()       #Включает модуль pygame
  25. screen = pygame.display.set_mode((width,height))
  26. pygame.display.set_caption(gameName)           #Устанавливаем заголовок нашей игры
  27.  
  28. icon = pygame.image.load('icon.png')            #Загрузка иконки
  29. pygame.display.set_icon(icon)
  30.  
  31. clock = pygame.time.Clock()                     #Создаем игровые часы
  32. all_sprites = pygame.sprite.Group()             #Группа для всех спрайтов
  33. mobs = pygame.sprite.Group()                    #Группа для всех мобов
  34. bullets = pygame.sprite.Group()                    #Группа для всех пуль
  35.  
  36. bg = pygame.image.load(imgdir + '/bg2.jpg')
  37. bg = pygame.transform.scale(bg,(width,height))
  38. bg_rect = bg.get_rect()
  39.  
  40.  
  41. class Bullet(pygame.sprite.Sprite):              #Класс пули
  42.     def __init__(self):
  43.         pygame.sprite.Sprite.__init__(self)
  44.         self.image = pygame.image.load(imgdir + '/shell.png')
  45.         self.image = pygame.transform.scale(self.image,(4,10))
  46.         self.image = pygame.transform.rotate(self.image, player.angle - 90)  #поворот пули
  47.         self.rect = self.image.get_rect()  # рамка нашего спрайта
  48.  
  49.         self.rect.center = Vector2(player.rect.center)     #помещаем пулю в центр игрока
  50.  
  51.  
  52.         self.speed = 30                                  #Скорость полета пули
  53.         self.move = player.direction * self.speed        #Направление полета пули
  54.  
  55.     def update(self):
  56.         self.rect.center += self.move               #Двигаем пулю в направлении постоянно
  57.  
  58.  
  59.  
  60. class Player(pygame.sprite.Sprite):              #Класс игрока
  61.     def __init__(self):
  62.         pygame.sprite.Sprite.__init__(self)
  63.  
  64.         self.damage = 30                  #Урон игрока
  65.         self.image = pygame.image.load(imgdir + '/player/1.png')
  66.         self.image = pygame.transform.scale(self.image,(100,75))
  67.  
  68.         self.rect = self.image.get_rect()         #рамка нашего спрайта
  69.         self.rect.center = (width//2,height//2)
  70.         self.points = 0
  71.         self.speed = 5
  72.  
  73.         self.copy = self.image                     #Копия картинки игрока
  74.         self.position = Vector2(self.rect.center)  #Позиция игрока на сцене
  75.         self.angle = 0                             #Угол поворота игрока
  76.         self.direction = Vector2(1, 0)             #направление взгляда
  77.  
  78.         self.ammo = 30
  79.  
  80.         self.anim_speed = 4             # Скорость анимации
  81.         self.frame = 0                  # Счетчик кадров для анимации
  82.         self.anim = []                  # Список для картинок
  83.  
  84.         for i in range(1,21):           # Цикл для добавления картинок анимации
  85.             image = pygame.image.load(imgdir + f'/player/{i}.png')   #Выбираем картинку для загрузки
  86.             image = pygame.transform.scale(image,(100,75))           #Уменьшаем загруженную картинку
  87.             self.anim.append(image)                                  #Добавляем картинку в список
  88.  
  89.     def animation(self):
  90.         self.image = self.anim[self.frame // self.anim_speed]    #Переключаем картинки анимации
  91.         self.image = pygame.transform.rotate(self.image, self.angle)    #Поворот картинки в нужную сторону
  92.         self.rect = self.image.get_rect(center = self.rect.center)     # Определили новую рамку
  93.  
  94.         self.frame += 1                                                # Меняем кадр анимации
  95.         if self.frame == self.anim_speed * len(self.anim):             # Проверяем достижение конца картинок
  96.             self.frame = 0                                             # Сбрасываем счетчик кадров
  97.  
  98.  
  99.     def rotate(self, r_speed):
  100.         self.direction.rotate_ip(-r_speed)          #Поворачиваем взгляд
  101.         self.angle += r_speed                       #Узнаем угол поворота
  102.         self.image = pygame.transform.rotate(self.copy, self.angle)   #Поворачиваем спрайт
  103.         self.rect = self.image.get_rect(center=self.rect.center)   #Получаем новую рамку
  104.  
  105.     def update(self):
  106.         self.animation()
  107.         key = pygame.key.get_pressed()    #Сохраняем нажатие на кнопку клавиатуры
  108.  
  109.         if key[pygame.K_RIGHT]:
  110.             self.rotate(-5)
  111.  
  112.         if key[pygame.K_LEFT]:
  113.             self.rotate(5)
  114.  
  115.         if key[pygame.K_DOWN]:
  116.             self.position -= self.speed * self.direction
  117.  
  118.         if key[pygame.K_UP]:
  119.             self.position += self.speed * self.direction
  120.  
  121.         self.rect.center = self.position                  #Передивигаем спарйт игрока
  122.  
  123.         if self.position.y < 0:      #Если игрок достиг верхней границы экрана
  124.             self.position.y = height
  125.  
  126.         if self.position.x > width:   #Если игрок достиг правой границы экрана
  127.             self.position.x = 0   #Переносим в левую часть часть экрана
  128.  
  129.         if self.position.y > height:  # Если игрок достиг нижней границы экрана
  130.             self.position.y = 0
  131.  
  132.         if self.position.x < 0:  # Если игрок достиг левой границы экрана
  133.             self.position.x = width  # Переносим его в правую часть экрана
  134.  
  135. class Mob_left(pygame.sprite.Sprite):              #Класс моба
  136.     def __init__(self):
  137.         pygame.sprite.Sprite.__init__(self)
  138.         # self.image = pygame.Surface((25, 10),pygame.SRCALPHA)      #Картинка нашего моба
  139.         # self.image.fill(white)                    #Заливаем белым цветом
  140.         self.hp = 100
  141.  
  142.         self.image = pygame.image.load(imgdir + '/enemy1/1.png')
  143.         self.image = pygame.transform.scale(self.image, (70,80))
  144.         self.copy = self.image  # Копия картинки моба
  145.  
  146.         self.rect = self.image.get_rect()         # рамка нашего спрайта
  147.         self.rect.x = 0
  148.         self.rect.y = random.randrange(0,height)
  149.         self.speedx = random.randrange(1,3)       #Случайная скорость по горизонтали
  150.         self.speedy = random.randrange(-3,3)      #Случайная скорость по вертикали
  151.  
  152.         self.start = Vector2(0, 1)                                     # Направление взгляда вниз
  153.         self.direction = Vector2(self.speedx, self.speedy)            # Направление взгляда моба
  154.         self.angle = self.start.angle_to(self.direction)              # Угол поворота моба
  155.  
  156.  
  157.         self.anim_speed = 8  # Скорость анимации
  158.         self.frame = 0  # Счетчик кадров для анимации
  159.         self.anim = []  # Список для картинок
  160.  
  161.         for i in range(1, 10):  # Цикл для добавления картинок анимации
  162.             image = pygame.image.load(imgdir + f'/enemy1/{i}.png')  # Выбираем картинку для загрузки
  163.             image = pygame.transform.scale(image, (70, 80))  # Уменьшаем загруженную картинку
  164.             self.anim.append(image)  # Добавляем картинку в список
  165.  
  166.     def animation(self):
  167.         self.image = self.anim[self.frame // self.anim_speed]  # Переключаем картинки анимации
  168.         self.image = pygame.transform.rotate(self.image, -self.angle)  # Поворот картинки в нужную сторону
  169.         self.rect = self.image.get_rect(center=self.rect.center)  # Определили новую рамку
  170.  
  171.         self.frame += 1  # Меняем кадр анимации
  172.         if self.frame == self.anim_speed * len(self.anim):  # Проверяем достижение конца картинок
  173.             self.frame = 0  # Сбрасываем счетчик кадров
  174.  
  175.     def update(self):
  176.         self.animation()
  177.         self.rect.x += self.speedx                       #Скорость по горизонтали
  178.         self.rect.y += self.speedy                       #Скорость по вертикали
  179.         if self.rect.x > width or self.rect.y < 0 or self.rect.bottom > height:       #Если моб достиг правого края экрана
  180.             self.rect.x = 0                             #Переносим влево
  181.             self.rect.y = random.randrange(0, height)   #Даем новую случайную высоту
  182.             self.speedx = random.randrange(1, 3)        #Даем новую случайную скорость
  183.             self.speedy = random.randrange(-3,3)        #Случайная скорость по вертикали
  184.  
  185.             self.direction = Vector2(self.speedx, self.speedy)  # Направление взгляда моба
  186.             self.angle = self.start.angle_to(self.direction)  # Угол поворота моба
  187.  
  188.  
  189. class Mob_right(pygame.sprite.Sprite):              #Класс моба
  190.     def __init__(self):
  191.         pygame.sprite.Sprite.__init__(self)
  192.         # self.image = pygame.Surface((25, 10))  # Картинка нашего моба
  193.         # self.image.fill(red)  # Заливаем белым цветом
  194.         self.image = pygame.image.load(imgdir + '/enemy2/1.png')
  195.         self.image = pygame.transform.scale(self.image, (70, 80))
  196.         self.rect = self.image.get_rect()  # рамка нашего спрайта
  197.  
  198.         self.rect.x = width
  199.         self.rect.y = random.randrange(0,height)
  200.  
  201.         self.speedx = -random.randrange(1, 3)  # Случайная отрицательная скорость
  202.         self.speedy = random.randrange(-3, 3)  # Случайная отрицательная скорость
  203.  
  204.         self.copy = self.image                     #Копия картинки игрока
  205.  
  206.         self.start = Vector2(0, 1)  # Направление взгляда вниз
  207.         self.direction = Vector2(self.speedx, self.speedy)  # Направление взгляда моба
  208.         self.angle = self.start.angle_to(self.direction)  # Угол поворота моба
  209.         self.image = pygame.transform.rotate(self.copy, -self.angle)  # Поворот картинки в нужную сторону
  210.  
  211.         self.start = Vector2(0, 1)  # Направление взгляда вниз
  212.         self.direction = Vector2(self.speedx, self.speedy)  # Направление взгляда моба
  213.         self.angle = self.start.angle_to(self.direction)  # Угол поворота моба
  214.  
  215.         self.anim_speed = 8  # Скорость анимации
  216.         self.frame = 0  # Счетчик кадров для анимации
  217.         self.anim = []  # Список для картинок
  218.  
  219.  
  220.         for i in range(1, 10):  # Цикл для добавления картинок анимации
  221.             image = pygame.image.load(imgdir + f'/enemy2/{i}.png')  # Выбираем картинку для загрузки
  222.             image = pygame.transform.scale(image, (70, 80))  # Уменьшаем загруженную картинку
  223.             self.anim.append(image)  # Добавляем картинку в список
  224.  
  225.     def animation(self):
  226.         self.image = self.anim[self.frame // self.anim_speed]  # Переключаем картинки анимации
  227.         self.image = pygame.transform.rotate(self.image, -self.angle)  # Поворот картинки в нужную сторону
  228.         self.rect = self.image.get_rect(center=self.rect.center)  # Определили новую рамку
  229.  
  230.         self.frame += 1  # Меняем кадр анимации
  231.         if self.frame == self.anim_speed * len(self.anim):  # Проверяем достижение конца картинок
  232.             self.frame = 0  # Сбрасываем счетчик кадров
  233.  
  234.     def update(self):
  235.         self.animation()
  236.         self.rect.x += self.speedx  # Скорость по горизонтали
  237.         self.rect.y += self.speedy  # Скорость по вертикали
  238.         if self.rect.x < 0 or self.rect.y < 0 or self.rect.bottom > height:  # Если моб достиг правого края экрана
  239.             self.rect.x = width
  240.             self.rect.y = random.randrange(0, height)
  241.             self.speedx = random.randrange(1, 3)  # Случайная отрицательная скорость
  242.             self.speedy = random.randrange(-3, 3)  # Случайная отрицательная скорость
  243.             self.direction = Vector2(self.speedx, self.speedy)  # новое Направление взгляда моба
  244.             self.angle = self.start.angle_to(self.direction)  # новый Угол поворота моба
  245.  
  246. class Mob_up(pygame.sprite.Sprite):       # Класс Моба
  247.     def __init__(self):
  248.         pygame.sprite.Sprite.__init__(self)
  249.         self.image = pygame.image.load(imgdir + '/enemy5/grenade.png')
  250.         self.image = pygame.transform.scale(self.image, (35, 40))
  251.         self.rect = self.image.get_rect()
  252.         self.rect.x = random.randrange(0, width)
  253.         self.rect.y = 0
  254.         self.speedx = random.randrange(-5,5)
  255.         self.speedy = random.randrange(1,8)  # Случайная вертикальная скорость
  256.         self.copy = self.image  # Копия картинки игрока
  257.         self.position = Vector2(self.rect.center)  # Позиция игрока на сцене
  258.         self.angle = 0  # Угол поворота игрока
  259.         self.direction = Vector2(0, -1)  # направление взгляда
  260.  
  261.     def rotate(self, r_speed):
  262.         self.direction.rotate_ip(-r_speed)  # Поворачиваем взгляд
  263.         self.angle += r_speed  # Узнаем угол поворота
  264.         self.image = pygame.transform.rotate(self.copy, self.angle)  # Поворачиваем спрайт
  265.         self.rect = self.image.get_rect(center=self.rect.center)  # Получаем новую рамку
  266.  
  267.     def update(self):
  268.         self.rotate(-8)
  269.         self.rect.x += self.speedx  # скорость по горизонтали
  270.         self.rect.y += self.speedy
  271.         if self.rect.left < 0 or self.rect.bottom > height or self.rect.right > width:  # Если моб достиг   края экрана,
  272.             self.rect.x = random.randrange(0, width)
  273.             self.rect.y = 0
  274.             self.speedx = random.randrange(-5, 5)
  275.             self.speedy = random.randrange(1, 8)  # Случайная вертикальная скорость
  276.  
  277. class Mob_down(pygame.sprite.Sprite):  # Класс Моба
  278.     def __init__(self):
  279.         pygame.sprite.Sprite.__init__(self)
  280.         self.image = pygame.image.load(imgdir + '/enemy3/1.png')
  281.         self.image = pygame.transform.scale(self.image, (70, 80))
  282.         self.rect = self.image.get_rect()
  283.  
  284.         self.rect.x = random.randrange(0, width)
  285.         self.rect.bottom = height  
  286.         self.speedx = random.randrange(-3,3)
  287.         self.speedy = -random.randrange(1,3)  # Случайная вертикальная скорость
  288.  
  289.         self.copy = self.image                     #Копия картинки игрока
  290.         self.position = Vector2(self.rect.center)  #Позиция игрока на сцене
  291.         self.angle = 0                             #Угол поворота игрока
  292.         self.direction = Vector2(1, 0)             #направление взгляда
  293.  
  294.         self.start = Vector2(0, 1)  # Направление взгляда вниз
  295.         self.direction = Vector2(self.speedx, self.speedy)  # Направление взгляда моба
  296.         self.angle = self.start.angle_to(self.direction)  # Угол поворота моба
  297.  
  298.  
  299.         self.anim_speed = 8  # Скорость анимации
  300.         self.frame = 0  # Счетчик кадров для анимации
  301.         self.anim = []  # Список для картинок
  302.  
  303.         for i in range(1, 9):  # Цикл для добавления картинок анимации
  304.             image = pygame.image.load(imgdir + f'/enemy3/{i}.png')  # Выбираем картинку для загрузки
  305.             image = pygame.transform.scale(image, (70, 80))  # Уменьшаем загруженную картинку
  306.             self.anim.append(image)  # Добавляем картинку в список
  307.  
  308.     def animation(self):
  309.         self.image = self.anim[self.frame // self.anim_speed]  # Переключаем картинки анимации
  310.         self.image = pygame.transform.rotate(self.image, -self.angle)  # Поворот картинки в нужную сторону
  311.         self.rect = self.image.get_rect(center=self.rect.center)  # Определили новую рамку
  312.  
  313.         self.frame += 1  # Меняем кадр анимации
  314.         if self.frame == self.anim_speed * len(self.anim):  # Проверяем достижение конца картинок
  315.             self.frame = 0  # Сбрасываем счетчик кадров
  316.  
  317.     def update(self):
  318.         self.animation()
  319.         self.rect.x += self.speedx  # скорость по горизонтали
  320.         self.rect.y += self.speedy
  321.         if self.rect.left < 0 or self.rect.top < 0 or self.rect.right > width:  # Если моб достиг   края экрана,
  322.             self.rect.x = random.randrange(0, width)
  323.             self.rect.bottom = height
  324.             self.speedx = random.randrange(-5,5)
  325.             self.speedy = -random.randrange(1,8)  # Случайная вертикальная скорость
  326.             self.direction = Vector2(self.speedx, self.speedy)  # новое Направление взгляда моба
  327.             self.angle = self.start.angle_to(self.direction)  # новый Угол поворота моба
  328.  
  329.  
  330.  
  331. player = Player()                   #Создаем игрока
  332. all_sprites.add(player)
  333.  
  334. for i in range(8):
  335.     mob_left = Mob_left()             #Создаем моба
  336.     all_sprites.add(mob_left)
  337.     mobs.add(mob_left)
  338.  
  339. for i in range(8):
  340.     mob_right = Mob_right()             #Создаем моба
  341.     all_sprites.add(mob_right)
  342.     mobs.add(mob_right)
  343.  
  344. for i in range(8):
  345.     mob_up= Mob_up()             #Создаем моба
  346.     all_sprites.add(mob_up)
  347.     mobs.add(mob_up)
  348.  
  349. for i in range(8):
  350.     mob_down = Mob_down()             #Создаем моба
  351.     all_sprites.add(mob_down)
  352.     mobs.add(mob_down)
  353.  
  354.  
  355. run = True
  356. while run:                  #Запускаем игровой цикл
  357.     clock.tick(fps)
  358.     all_sprites.update()            #Вызываем update у всех спрайтов
  359.  
  360.     hits = pygame.sprite.spritecollide(player,mobs,False)   #Событие столкновения игрока и мобов
  361.     if hits:
  362.         pass
  363.  
  364.  
  365.     shoots = pygame.sprite.groupcollide(bullets, mobs, True, False) #Событие столкновения пуль и мобов
  366.     if shoots:
  367.         for mob in shoots.values():             #Перебираем всех мобов
  368.             mob[0].hp -= player.damage          #Уменьшаем ХП нужного моба
  369.             if mob[0].hp < 0:                   # Если ХП моба стало меньше 0
  370.                 mob[0].kill()                   # Моба убиваем
  371.  
  372.  
  373.  
  374.     screen.blit(bg, bg_rect)
  375.     all_sprites.draw(screen)
  376.     for event in pygame.event.get():       #Проверяем игровые события
  377.         if event.type == pygame.QUIT:      #Если событие - это выход, то:
  378.             run = False                    #Заканчиваем игровой цикл
  379.         if event.type == pygame.KEYDOWN:
  380.             if event.key == pygame.K_SPACE and player.ammo > 0:    #Если нажат пробел
  381.                 bul = Bullet()                 #Создаем пулю
  382.                 all_sprites.add(bul)           #Добавляем пулю ко всем спрайтам
  383.                 bullets.add(bul)               #Добавляем пулю ко всем пулям
  384.                 player.ammo -= 1               #Уменьшаем количество патронов
  385.  
  386.  
  387.  
  388.     lib_game.drawText(screen,str(player.points),40,width-100,height-50,yellow)
  389.     lib_game.drawText(screen,str(player.ammo),40,100,height-50,yellow)
  390.     pygame.display.flip()    #Переворачиваем экран
  391.  
  392. pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement