Загрузка данных
import pygame
import pygame as pg
from random import randint
from pygame.sprite import groupcollide
from gesture import Gesture
import pygame_menu
pg.init()
person = 0
enemy = 0
SCREEN_WIDTH = 900
SCREEN_HEIGHT = 550
FPS = 60
persons = ['fire wizard', 'lightning wizard', 'earth monk']
g = Gesture()
frame = 0
font = pg.font.Font(None, 40)
mode = 'menu'
def load_image(file, width, height):
image = pg.image.load(file).convert_alpha()
image = pg.transform.scale(image, (width, height))
return image
def text_render(text):
return font.render(str(text), True, "black")
class FireBall(pg.sprite.Sprite):
def __init__(self, center, side,size, image,move=False, ):
super().__init__()
self.image = pg.image.load(f"{image}")
self.size = size
self.side = side
self.image = pg.transform.scale(self.image, size) if self.side == 'Left' else pg.transform.flip(pg.transform.scale(self.image, size), True, False)
self.rect = self.image.get_rect()
self.rect.center = center
self.move = move
def update(self):
if self.move:
if self.side == "Right":
self.rect.x += 10
elif self.side == "Left":
self.rect.x -= 10
else:
self.rect.x += 10
self.image = pg.transform.scale(self.image, self.size)
def draw(self, screen):
screen.blit(self.image, self.rect)
class Player(pg.sprite.Sprite):
def __init__(self, player, mode):
super().__init__()
self.mode = mode
global person
self.index_fireball = 0
self.idles = [pg.image.load(f"images/{player}/idle{i}.png")for i in range(1,4)]
self.moves = [pg.image.load(f"images/{player}/move{i}.png")for i in range(1,5)]
self.moves1 = [pg.transform.flip(pg.image.load(f"images/{player}/move{i}.png"), True, False)for i in range(1,5)]
self.down = pg.transform.scale(pg.image.load(f'images/{player}/down.png'), (400,500))
self.size = [50, 50]
self.rect = pg.Rect(100, 250, 400, 500)
self.rect.center = (100, SCREEN_HEIGHT // 2)
self.rect2 = pg.Rect(100, 250, 200, 50)
self.displacement = 0
self.health_point = 500
self.is_seating = False
self.group = pg.sprite.Group()
temp1 = 0
self.moving = False
for i, d, e in zip(self.idles, self.moves, self.moves1):
i, d, e = pg.transform.scale(i, (400,500)), pg.transform.scale(d, (400,500)), pg.transform.scale(e, (400,500))
self.idles[temp1], self.moves[temp1], self.moves1[temp1] = i, d, e
temp1 += 1
self.image_index = 0
self.is_adding_fireball = True
self.is_fireball_release = True
def draw(self, screen):
if not self.moving:
self.is_seating = False
screen.blit(self.idles[self.image_index], self.rect)
else:
if self.moving == 'Right':
self.is_seating = False
screen.blit(self.moves[self.image_index], self.rect)
elif self.moving == 'Left':
screen.blit(self.moves1[self.image_index], self.rect)
self.is_seating = False
elif self.moving == 'Down':
self.is_seating = True
screen.blit(self.down, self.rect)
self.group.draw(screen)
pg.draw.rect(screen, pg.Color('red'), self.rect2)
def update(self, key):
global frame
if key[pg.K_a] and self.rect.centerx > 50:
self.rect.x -= 3
self.moving = 'Left'
elif key[pg.K_d] and self.rect.x < 600:
self.rect.x += 3
self.moving = 'Right'
elif key[pg.K_s] and not key[pg.K_d] and not key[pg.K_a]:
self.moving = 'Down'
else:
self.moving = False
self.rect2.center = (self.rect.centerx - self.displacement, 100)
frame += 1
self.group.update()
if frame % 30 == 0:
current_gesture = g.get_gesture()
match current_gesture:
case "rock":
if self.moving != 'Down':
if self.is_adding_fireball:
self.group.add(FireBall(self.rect.center, self.moving,self.size, f'images/{persons[person]}/magicball.png' ))
self.is_adding_fireball = False
self.is_fireball_release = False
self.size[0] += 40
self.size[1] += 40
self.group.sprites()[self.index_fireball].rect.centery -= 20
self.group.sprites()[self.index_fireball].rect.centerx -= 20
case _:
if not self.is_fireball_release:
self.group.sprites()[self.index_fireball].size = self.size
self.group.sprites()[self.index_fireball].move = True
self.is_adding_fireball = True
self.index_fireball += 1
self.is_fireball_release = True
self.size = [50,50]
class Enemy(pg.sprite.Sprite):
def __init__(self, enemy, mode):
super().__init__()
self.mode = mode
self.enemy = enemy
self.idles = [pg.transform.flip(pg.transform.scale(
pg.image.load
(f'images/{enemy}/idle{i}.png'),
(400,500)),
True,
False) for i in range(1,4)]
self.moves = [pg.transform.scale(pg.image.load(f'images/{enemy}/move{i}.png'), (400,500)) for i in range(1,4)]
self.moves1 = [pg.transform.flip(pg.transform.scale(pg.image.load(f'images/{enemy}/move{i}.png'), (400,500)), True, False) for i in range(1,4)]
self.down = pg.transform.flip(pg.transform.scale(pg.image.load(f'images/{enemy}/down.png'), (400,500)), True, False)
self.image_index = 0
self.health_point = 500
self.rect = self.idles[self.image_index].get_rect()
self.rect.center = (800, SCREEN_HEIGHT // 2)
self.rect2 = pg.Rect(100, 250, 200, 50)
self.displacement = 0
self.group = pg.sprite.Group()
self.random_seat = 0
self.random_fireball = 1
self.size = [50,50]
self.moving = 'Left'
self.is_adding_fireball = True
self.if_fireball_release = True
self.number_fireball = -1
self.is_seating = False
def update(self):
if self.mode == 2:
if frame % 30 == 0:
if self.random_fireball == 1:
if self.is_adding_fireball:
self.group.add(FireBall(self.rect.center, 'Left', self.size, f'images/{self.enemy}/magicball.png'))
self.number_fireball += 1
self.is_adding_fireball = False
self.size[0] += 40
self.size[1] += 40
self.group.sprites()[self.number_fireball].rect.centery -= 20
self.group.sprites()[self.number_fireball].rect.centerx -= 20
if self.size[0] > 209 and self.size[1] > 209:
self.group.sprites()[self.number_fireball].size = self.size
self.group.sprites()[self.number_fireball].move = True
self.is_adding_fireball = True
self.size = [50, 50]
self.random_fireball = randint(1, 4)
if self.random_fireball != 1:
self.random_fireball =randint(1, 4)
else:
if frame % 30 == 0:
print(1)
if pg.key.get_pressed()[pg.K_UP]:
print(2)
if self.is_adding_fireball:
self.group.add(FireBall(self.rect.center, 'Left', self.size, f'images/{self.enemy}/magicball.png'))
self.number_fireball += 1
self.is_adding_fireball = False
self.if_fireball_release = False
self.size[0] += 40
self.size[1] += 40
self.group.sprites()[self.number_fireball].rect.centery -= 20
self.group.sprites()[self.number_fireball].rect.centerx -= 20
else:
if not self.if_fireball_release:
self.group.sprites()[self.number_fireball].size = self.size
self.group.sprites()[self.number_fireball].move = True
self.is_adding_fireball = True
self.size = [50, 50]
if pg.key.get_pressed()[pg.K_LEFT]:
self.rect.centerx -= 3
self.moving = 'Left'
elif pg.key.get_pressed()[pg.K_RIGHT]:
self.rect.centerx += 3
self.moving = 'Right'
else:
self.moving = 'Left'
self.group.update()
self.rect2.center = (self.rect.centerx - self.displacement, 100)
def draw(self,screen):
if self.mode == 2:
if frame % 30 == 0:
self.random_seat = randint(1, 3)
if self.random_seat == 2:
self.is_seating = True
screen.blit(self.down , self.rect)
else:
screen.blit(self.idles[self.image_index], self.rect)
self.is_seating = False
else:
if pg.key.get_pressed()[pg.K_DOWN]:
self.is_seating = True
screen.blit(self.down, self.rect)
else:
screen.blit(self.idles[self.image_index], self.rect)
self.is_seating = False
self.group.draw(screen)
pg.draw.rect(screen, pg.Color('red'), self.rect2)
class Menu:
def __init__(self):
self.surface = pg.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
self.menu = pygame_menu.Menu(height=SCREEN_HEIGHT,
width=SCREEN_WIDTH,
theme=pygame_menu.themes.THEME_ORANGE,
title="Битва магов")
self.menu.add.selector("Персонаж: ", [('fire wizard', 1), ('lighting wizard', 2), ('earth monk', 3)], onchange=self.set_character)
self.menu.add.selector("Враг: ", [('fire wizard', 1), ('lighting wizard', 2), ('earth monk', 3)],onchange=self.set_enemy)
self.menu.add.selector("Режим: ", [('На двоих', 1), ('На одного', 2)], onchange=self.set_mode)
self.mode = ''
self.menu.add.button("Играть", self.start_game)
self.menu.add.button('Выход', quit)
self.modes = ['На двоих', 'На одного']
self.persons = ['fire wizard', 'lightning wizard', 'earth monk']
self.player = self.persons[0]
self.enemy = self.persons[0]
self.run()
def set_mode(self,character,value):
self.mode = value
def set_character(self,character,value):
global person
person = value - 1
print(character, person)
self.player = self.persons[value - 1]
def set_enemy(self, character,value):
global enemy
enemy = value - 1
self.enemy = self.persons[value - 1]
print(enemy, character)
def start_game(self):
Game(self.player, self.enemy, self.mode)
def run(self):
self.menu.mainloop(self.surface)
class Game:
def __init__(self, player, enemy, mode):
# Создание окна
self.screen = pg.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pg.display.set_caption("Битва магов")
self.player = Player(player, mode)
self.enemy = Enemy(enemy, mode)
self.background = load_image("images/background.png", SCREEN_WIDTH, SCREEN_HEIGHT)
self.image_index_event = pg.USEREVENT + 1
self.image_index_event1 = pg.event.Event(self.image_index_event)
pg.time.set_timer(self.image_index_event, 400)
self.clock = pg.time.Clock()
self.run()
def run(self):
while True:
self.event()
self.update()
self.draw()
self.clock.tick(FPS)
def event(self):
for event in pg.event.get():
if event.type == pg.QUIT:
quit()
if event.type == self.image_index_event:
if self.player.image_index != len(self.player.idles) - 1:
self.player.image_index += 1
self.enemy.image_index += 1
else:
self.player.image_index = 0
self.enemy.image_index = 0
def update(self):
self.player.update(pg.key.get_pressed())
self.enemy.update()
if pg.sprite.spritecollide(self.player, self.enemy.group, True) :
if not self.player.is_seating:
self.player.health_point -= 100
self.player.rect2.width -= 40
self.player.displacement += 25
self.enemy.number_fireball -= 1
if pg.sprite.spritecollide(self.enemy, self.player.group, True):
if not self.enemy.is_seating:
self.enemy.health_point -= 100
self.enemy.rect2.width -= 40
self.enemy.displacement += 25
self.player.index_fireball -= 1
def draw(self):
self.screen.blit(self.background, (0, 0))
self.enemy.draw(self.screen)
self.player.draw(self.screen)
pg.display.flip()
if __name__ == "__main__":
Menu()