import sys import pygame from common.colors import FONT_DARK, WHITE from common.constants import * from common.helpers import draw_text from logic.knights_queue import KnightsQueue from models.castle import Castle from models.knight import Knight from models.monster import Monster from ui.logs import Logs from ui.screens.credits import Credits from ui.screens.options import Options from ui.stats import Stats from .grid import Grid from .spawner import Spawner class Game: def __init__(self): pygame.init() pygame.display.set_caption(GAME_TITLE) pygame.display.set_icon(pygame.image.load('./resources/icons/sword.png')) self.screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) self.clock = pygame.time.Clock() self.tiles = [] for tile_path in TILES: converted_tile = pygame.image.load('resources/textures/' + tile_path).convert_alpha() self.tiles.append((tile_path, converted_tile)) self.bg = pygame.image.load("./resources/textures/bg.jpg") self.screens = {'credits': Credits(self.screen, self.clock), 'options': Options(self.screen, self.clock)} click = False def main_menu(self): while True: self.screen.blit(self.bg, (0, 0)) pygame.draw.rect(self.screen, (255, 255, 255), pygame.Rect(800, 100, 400, 500), 0, 5) draw_text('MAIN MENU', FONT_DARK, self.screen, 850, 150, 30, True) mx, my = pygame.mouse.get_pos() button_1 = pygame.Rect(850, 250, 300, 50) button_2 = pygame.Rect(850, 350, 300, 50) button_3 = pygame.Rect(850, 450, 300, 50) if button_1.collidepoint((mx, my)): if click: self.game() if button_2.collidepoint((mx, my)): if click: self.screens['options'].display_screen() if button_3.collidepoint((mx, my)): if click: self.screens['credits'].display_screen() pygame.draw.rect(self.screen, (0, 191, 255), button_1, 0, 4) draw_text('PLAY', WHITE, self.screen, 870, 255) pygame.draw.rect(self.screen, (0, 191, 255), button_2, 0, 4) draw_text('OPTIONS', WHITE, self.screen, 870, 355) pygame.draw.rect(self.screen, (0, 191, 255), button_3, 0, 4) draw_text('CREDITS', WHITE, self.screen, 870, 455) click = False for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: pygame.quit() sys.exit() if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: click = True pygame.display.update() self.clock.tick(60) def game(self): running = True grid = Grid(self.tiles) stats = Stats() logs = Logs() knights_sprite_group = pygame.sprite.Group() monsters_sprite_group = pygame.sprite.Group() castle_sprite_group = pygame.sprite.Group() knights_left = self.generate_knights_team(knights_sprite_group) knights_right = self.generate_knights_team(knights_sprite_group) knights_queue = KnightsQueue(knights_left, knights_right) spawn_left_team = Spawner(grid, knights_left, KNIGHTS_SPAWN_WIDTH, KNIGHTS_SPAWN_HEIGHT, LEFT_KNIGHTS_SPAWN_FIRST_ROW, LEFT_KNIGHTS_SPAWN_FIRST_COL) spawn_right_team = Spawner(grid, knights_right, KNIGHTS_SPAWN_WIDTH, KNIGHTS_SPAWN_HEIGHT, RIGHT_KNIGHTS_SPAWN_FIRST_ROW, RIGHT_KNIGHTS_SPAWN_FIRST_COL) spawn_left_team.spawn() spawn_right_team.spawn() spawned_monsters = self.generate_monster(monsters_sprite_group) monster_spawn = Spawner(grid, spawned_monsters, spawn_where_possible=True) monster_spawn.spawn() spawned_castle = self.generate_castle(castle_sprite_group) castle_spawn = Spawner(grid, [spawned_castle], CASTLE_SPAWN_WIDTH, CASTLE_SPAWN_HEIGHT, CASTLE_SPAWN_FIRST_ROW, CASTLE_SPAWN_FIRST_COL) castle_spawn.spawn() while running: self.screen.blit(self.bg, (0, 0)) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False grid.update(self.screen) stats.draw(self.screen) logs.draw(self.screen) knights_sprite_group.draw(self.screen) monsters_sprite_group.draw(self.screen) castle_sprite_group.draw(self.screen) pygame.display.update() self.clock.tick(FPS_COUNT) @staticmethod def generate_knights_team(knights_sprite_group): knights = [] for i in range(4): knight = Knight("./resources/textures/knight.png") knights.append(knight) knights_sprite_group.add(knight) return knights @staticmethod def generate_monster(monsters_sprite_group): monsters = [] for i in range(2): monster = Monster() monsters.append(monster) monsters_sprite_group.add(monster) return monsters @staticmethod def generate_castle(castle_sprite_group): castle = Castle() castle_sprite_group.add(castle) return castle