Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Наша первая игра
- import pygame
- import random #Модуль случайности
- import lib_game
- from pygame.math import Vector2
- imgdir = "./media/img"
- snddir = "./media/snd"
- width = 1280 #Ширина экрана
- height = 720 #Высота экрана
- fps = 60 #Скорость работы игры
- gameName = "Mega Shooter"
- forestgreen = (34, 139, 34)
- yellow = (255, 255, 0)
- white = (255,255,255)
- red = (255,0,0)
- purple = (255,0,255)
- blue = (0,0,255)
- pygame.init() #Включает модуль pygame
- screen = pygame.display.set_mode((width,height))
- pygame.display.set_caption(gameName) #Устанавливаем заголовок нашей игры
- icon = pygame.image.load('icon.png') #Загрузка иконки
- pygame.display.set_icon(icon)
- clock = pygame.time.Clock() #Создаем игровые часы
- all_sprites = pygame.sprite.Group() #Группа для всех спрайтов
- mobs = pygame.sprite.Group() #Группа для всех мобов
- bullets = pygame.sprite.Group() #Группа для всех пуль
- bg = pygame.image.load(imgdir + '/bg2.jpg')
- bg = pygame.transform.scale(bg,(width,height))
- bg_rect = bg.get_rect()
- class Bullet(pygame.sprite.Sprite): #Класс пули
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- self.image = pygame.image.load(imgdir + '/shell.png')
- self.image = pygame.transform.scale(self.image,(4,10))
- self.image = pygame.transform.rotate(self.image, player.angle - 90) #поворот пули
- self.rect = self.image.get_rect() # рамка нашего спрайта
- self.rect.center = Vector2(player.rect.center) #помещаем пулю в центр игрока
- self.speed = 30 #Скорость полета пули
- self.move = player.direction * self.speed #Направление полета пули
- def update(self):
- self.rect.center += self.move #Двигаем пулю в направлении постоянно
- class Player(pygame.sprite.Sprite): #Класс игрока
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- self.damage = 30 #Урон игрока
- self.image = pygame.image.load(imgdir + '/player/1.png')
- self.image = pygame.transform.scale(self.image,(100,75))
- self.rect = self.image.get_rect() #рамка нашего спрайта
- self.rect.center = (width//2,height//2)
- self.points = 0
- self.speed = 5
- self.copy = self.image #Копия картинки игрока
- self.position = Vector2(self.rect.center) #Позиция игрока на сцене
- self.angle = 0 #Угол поворота игрока
- self.direction = Vector2(1, 0) #направление взгляда
- self.ammo = 30
- self.anim_speed = 4 # Скорость анимации
- self.frame = 0 # Счетчик кадров для анимации
- self.anim = [] # Список для картинок
- for i in range(1,21): # Цикл для добавления картинок анимации
- image = pygame.image.load(imgdir + f'/player/{i}.png') #Выбираем картинку для загрузки
- image = pygame.transform.scale(image,(100,75)) #Уменьшаем загруженную картинку
- self.anim.append(image) #Добавляем картинку в список
- def animation(self):
- self.image = self.anim[self.frame // self.anim_speed] #Переключаем картинки анимации
- self.image = pygame.transform.rotate(self.image, self.angle) #Поворот картинки в нужную сторону
- self.rect = self.image.get_rect(center = self.rect.center) # Определили новую рамку
- self.frame += 1 # Меняем кадр анимации
- if self.frame == self.anim_speed * len(self.anim): # Проверяем достижение конца картинок
- self.frame = 0 # Сбрасываем счетчик кадров
- def rotate(self, r_speed):
- self.direction.rotate_ip(-r_speed) #Поворачиваем взгляд
- self.angle += r_speed #Узнаем угол поворота
- self.image = pygame.transform.rotate(self.copy, self.angle) #Поворачиваем спрайт
- self.rect = self.image.get_rect(center=self.rect.center) #Получаем новую рамку
- def update(self):
- self.animation()
- key = pygame.key.get_pressed() #Сохраняем нажатие на кнопку клавиатуры
- if key[pygame.K_RIGHT]:
- self.rotate(-5)
- if key[pygame.K_LEFT]:
- self.rotate(5)
- if key[pygame.K_DOWN]:
- self.position -= self.speed * self.direction
- if key[pygame.K_UP]:
- self.position += self.speed * self.direction
- self.rect.center = self.position #Передивигаем спарйт игрока
- if self.position.y < 0: #Если игрок достиг верхней границы экрана
- self.position.y = height
- if self.position.x > width: #Если игрок достиг правой границы экрана
- self.position.x = 0 #Переносим в левую часть часть экрана
- if self.position.y > height: # Если игрок достиг нижней границы экрана
- self.position.y = 0
- if self.position.x < 0: # Если игрок достиг левой границы экрана
- self.position.x = width # Переносим его в правую часть экрана
- class Mob_left(pygame.sprite.Sprite): #Класс моба
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- # self.image = pygame.Surface((25, 10),pygame.SRCALPHA) #Картинка нашего моба
- # self.image.fill(white) #Заливаем белым цветом
- self.hp = 100
- self.image = pygame.image.load(imgdir + '/enemy1/1.png')
- self.image = pygame.transform.scale(self.image, (70,80))
- self.copy = self.image # Копия картинки моба
- self.rect = self.image.get_rect() # рамка нашего спрайта
- self.rect.x = 0
- self.rect.y = random.randrange(0,height)
- self.speedx = random.randrange(1,3) #Случайная скорость по горизонтали
- self.speedy = random.randrange(-3,3) #Случайная скорость по вертикали
- self.start = Vector2(0, 1) # Направление взгляда вниз
- self.direction = Vector2(self.speedx, self.speedy) # Направление взгляда моба
- self.angle = self.start.angle_to(self.direction) # Угол поворота моба
- self.anim_speed = 8 # Скорость анимации
- self.frame = 0 # Счетчик кадров для анимации
- self.anim = [] # Список для картинок
- for i in range(1, 10): # Цикл для добавления картинок анимации
- image = pygame.image.load(imgdir + f'/enemy1/{i}.png') # Выбираем картинку для загрузки
- image = pygame.transform.scale(image, (70, 80)) # Уменьшаем загруженную картинку
- self.anim.append(image) # Добавляем картинку в список
- def animation(self):
- self.image = self.anim[self.frame // self.anim_speed] # Переключаем картинки анимации
- self.image = pygame.transform.rotate(self.image, -self.angle) # Поворот картинки в нужную сторону
- self.rect = self.image.get_rect(center=self.rect.center) # Определили новую рамку
- self.frame += 1 # Меняем кадр анимации
- if self.frame == self.anim_speed * len(self.anim): # Проверяем достижение конца картинок
- self.frame = 0 # Сбрасываем счетчик кадров
- def update(self):
- self.animation()
- self.rect.x += self.speedx #Скорость по горизонтали
- self.rect.y += self.speedy #Скорость по вертикали
- if self.rect.x > width or self.rect.y < 0 or self.rect.bottom > height: #Если моб достиг правого края экрана
- self.rect.x = 0 #Переносим влево
- self.rect.y = random.randrange(0, height) #Даем новую случайную высоту
- self.speedx = random.randrange(1, 3) #Даем новую случайную скорость
- self.speedy = random.randrange(-3,3) #Случайная скорость по вертикали
- self.direction = Vector2(self.speedx, self.speedy) # Направление взгляда моба
- self.angle = self.start.angle_to(self.direction) # Угол поворота моба
- class Mob_right(pygame.sprite.Sprite): #Класс моба
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- # self.image = pygame.Surface((25, 10)) # Картинка нашего моба
- # self.image.fill(red) # Заливаем белым цветом
- self.image = pygame.image.load(imgdir + '/enemy2/1.png')
- self.image = pygame.transform.scale(self.image, (70, 80))
- self.rect = self.image.get_rect() # рамка нашего спрайта
- self.rect.x = width
- self.rect.y = random.randrange(0,height)
- self.speedx = -random.randrange(1, 3) # Случайная отрицательная скорость
- self.speedy = random.randrange(-3, 3) # Случайная отрицательная скорость
- self.copy = self.image #Копия картинки игрока
- self.start = Vector2(0, 1) # Направление взгляда вниз
- self.direction = Vector2(self.speedx, self.speedy) # Направление взгляда моба
- self.angle = self.start.angle_to(self.direction) # Угол поворота моба
- self.image = pygame.transform.rotate(self.copy, -self.angle) # Поворот картинки в нужную сторону
- self.start = Vector2(0, 1) # Направление взгляда вниз
- self.direction = Vector2(self.speedx, self.speedy) # Направление взгляда моба
- self.angle = self.start.angle_to(self.direction) # Угол поворота моба
- self.anim_speed = 8 # Скорость анимации
- self.frame = 0 # Счетчик кадров для анимации
- self.anim = [] # Список для картинок
- for i in range(1, 10): # Цикл для добавления картинок анимации
- image = pygame.image.load(imgdir + f'/enemy2/{i}.png') # Выбираем картинку для загрузки
- image = pygame.transform.scale(image, (70, 80)) # Уменьшаем загруженную картинку
- self.anim.append(image) # Добавляем картинку в список
- def animation(self):
- self.image = self.anim[self.frame // self.anim_speed] # Переключаем картинки анимации
- self.image = pygame.transform.rotate(self.image, -self.angle) # Поворот картинки в нужную сторону
- self.rect = self.image.get_rect(center=self.rect.center) # Определили новую рамку
- self.frame += 1 # Меняем кадр анимации
- if self.frame == self.anim_speed * len(self.anim): # Проверяем достижение конца картинок
- self.frame = 0 # Сбрасываем счетчик кадров
- def update(self):
- self.animation()
- self.rect.x += self.speedx # Скорость по горизонтали
- self.rect.y += self.speedy # Скорость по вертикали
- if self.rect.x < 0 or self.rect.y < 0 or self.rect.bottom > height: # Если моб достиг правого края экрана
- self.rect.x = width
- self.rect.y = random.randrange(0, height)
- self.speedx = random.randrange(1, 3) # Случайная отрицательная скорость
- self.speedy = random.randrange(-3, 3) # Случайная отрицательная скорость
- self.direction = Vector2(self.speedx, self.speedy) # новое Направление взгляда моба
- self.angle = self.start.angle_to(self.direction) # новый Угол поворота моба
- class Mob_up(pygame.sprite.Sprite): # Класс Моба
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- self.image = pygame.image.load(imgdir + '/enemy5/grenade.png')
- self.image = pygame.transform.scale(self.image, (35, 40))
- self.rect = self.image.get_rect()
- self.rect.x = random.randrange(0, width)
- self.rect.y = 0
- self.speedx = random.randrange(-5,5)
- self.speedy = random.randrange(1,8) # Случайная вертикальная скорость
- self.copy = self.image # Копия картинки игрока
- self.position = Vector2(self.rect.center) # Позиция игрока на сцене
- self.angle = 0 # Угол поворота игрока
- self.direction = Vector2(0, -1) # направление взгляда
- def rotate(self, r_speed):
- self.direction.rotate_ip(-r_speed) # Поворачиваем взгляд
- self.angle += r_speed # Узнаем угол поворота
- self.image = pygame.transform.rotate(self.copy, self.angle) # Поворачиваем спрайт
- self.rect = self.image.get_rect(center=self.rect.center) # Получаем новую рамку
- def update(self):
- self.rotate(-8)
- self.rect.x += self.speedx # скорость по горизонтали
- self.rect.y += self.speedy
- if self.rect.left < 0 or self.rect.bottom > height or self.rect.right > width: # Если моб достиг края экрана,
- self.rect.x = random.randrange(0, width)
- self.rect.y = 0
- self.speedx = random.randrange(-5, 5)
- self.speedy = random.randrange(1, 8) # Случайная вертикальная скорость
- class Mob_down(pygame.sprite.Sprite): # Класс Моба
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- self.image = pygame.image.load(imgdir + '/enemy3/1.png')
- self.image = pygame.transform.scale(self.image, (70, 80))
- self.rect = self.image.get_rect()
- self.rect.x = random.randrange(0, width)
- self.rect.bottom = height
- self.speedx = random.randrange(-3,3)
- self.speedy = -random.randrange(1,3) # Случайная вертикальная скорость
- self.copy = self.image #Копия картинки игрока
- self.position = Vector2(self.rect.center) #Позиция игрока на сцене
- self.angle = 0 #Угол поворота игрока
- self.direction = Vector2(1, 0) #направление взгляда
- self.start = Vector2(0, 1) # Направление взгляда вниз
- self.direction = Vector2(self.speedx, self.speedy) # Направление взгляда моба
- self.angle = self.start.angle_to(self.direction) # Угол поворота моба
- self.anim_speed = 8 # Скорость анимации
- self.frame = 0 # Счетчик кадров для анимации
- self.anim = [] # Список для картинок
- for i in range(1, 9): # Цикл для добавления картинок анимации
- image = pygame.image.load(imgdir + f'/enemy3/{i}.png') # Выбираем картинку для загрузки
- image = pygame.transform.scale(image, (70, 80)) # Уменьшаем загруженную картинку
- self.anim.append(image) # Добавляем картинку в список
- def animation(self):
- self.image = self.anim[self.frame // self.anim_speed] # Переключаем картинки анимации
- self.image = pygame.transform.rotate(self.image, -self.angle) # Поворот картинки в нужную сторону
- self.rect = self.image.get_rect(center=self.rect.center) # Определили новую рамку
- self.frame += 1 # Меняем кадр анимации
- if self.frame == self.anim_speed * len(self.anim): # Проверяем достижение конца картинок
- self.frame = 0 # Сбрасываем счетчик кадров
- def update(self):
- self.animation()
- self.rect.x += self.speedx # скорость по горизонтали
- self.rect.y += self.speedy
- if self.rect.left < 0 or self.rect.top < 0 or self.rect.right > width: # Если моб достиг края экрана,
- self.rect.x = random.randrange(0, width)
- self.rect.bottom = height
- self.speedx = random.randrange(-5,5)
- self.speedy = -random.randrange(1,8) # Случайная вертикальная скорость
- self.direction = Vector2(self.speedx, self.speedy) # новое Направление взгляда моба
- self.angle = self.start.angle_to(self.direction) # новый Угол поворота моба
- player = Player() #Создаем игрока
- all_sprites.add(player)
- for i in range(8):
- mob_left = Mob_left() #Создаем моба
- all_sprites.add(mob_left)
- mobs.add(mob_left)
- for i in range(8):
- mob_right = Mob_right() #Создаем моба
- all_sprites.add(mob_right)
- mobs.add(mob_right)
- for i in range(8):
- mob_up= Mob_up() #Создаем моба
- all_sprites.add(mob_up)
- mobs.add(mob_up)
- for i in range(8):
- mob_down = Mob_down() #Создаем моба
- all_sprites.add(mob_down)
- mobs.add(mob_down)
- run = True
- while run: #Запускаем игровой цикл
- clock.tick(fps)
- all_sprites.update() #Вызываем update у всех спрайтов
- hits = pygame.sprite.spritecollide(player,mobs,False) #Событие столкновения игрока и мобов
- if hits:
- pass
- shoots = pygame.sprite.groupcollide(bullets, mobs, True, False) #Событие столкновения пуль и мобов
- if shoots:
- for mob in shoots.values(): #Перебираем всех мобов
- mob[0].hp -= player.damage #Уменьшаем ХП нужного моба
- if mob[0].hp < 0: # Если ХП моба стало меньше 0
- mob[0].kill() # Моба убиваем
- screen.blit(bg, bg_rect)
- all_sprites.draw(screen)
- for event in pygame.event.get(): #Проверяем игровые события
- if event.type == pygame.QUIT: #Если событие - это выход, то:
- run = False #Заканчиваем игровой цикл
- if event.type == pygame.KEYDOWN:
- if event.key == pygame.K_SPACE and player.ammo > 0: #Если нажат пробел
- bul = Bullet() #Создаем пулю
- all_sprites.add(bul) #Добавляем пулю ко всем спрайтам
- bullets.add(bul) #Добавляем пулю ко всем пулям
- player.ammo -= 1 #Уменьшаем количество патронов
- lib_game.drawText(screen,str(player.points),40,width-100,height-50,yellow)
- lib_game.drawText(screen,str(player.ammo),40,100,height-50,yellow)
- pygame.display.flip() #Переворачиваем экран
- pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement