WMICraft/logic/game.py
XsedoX deabeeac43 mozna zgetowac tile po row i column do tego jest funkcja get_tile w grid;
step_onto -> put_on(zmiana nazwy), dziala poprawnie(maly bug byl);funkcja put_on_tile(row, column, obj) sluzy polozeniu danego obiektu na danym tilu, przyklad uzycia zakomentowany w game.py(wywolujcie po spawnerze, bo nadpisze pozycje xd); dorobilem wlasny exception, gdy tile jest zajety w pliku exceptions.py - moze sie przyda ten plik
2022-04-08 17:15:01 +02:00

166 lines
5.8 KiB
Python

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()
#grid.put_on_tile(0, 0, knights_left[0])
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