Orleon

Untitled

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