Projekt_Sztuczna_Inteligencja/display_assets.py

273 lines
7.7 KiB
Python

import pygame
import project_constants as const
from mine_models.standard_mine import StandardMine
from mine_models.chained_mine import ChainedMine
from mine_models.time_mine import TimeMine
# ================================= #
# === SO THE OLD BLITTING WORKS === #
# ================================= #
tile_asset_options = {
"MUD": const.ASSET_MUD,
"GRASS": const.ASSET_GRASS,
"CONCRETE": const.ASSET_CONCRETE
}
mine_asset_options = {
"MINE": const.ASSET_MINE,
"CHAINS": const.ASSET_CHAINS,
"TIME_MINE": const.ASSET_TIME_MINE,
}
# ====================== #
# === MAIN FUNCTIONS === #
# ====================== #
def blit_graphics(minefield):
# background grid (fills frame with white, blits grid)
const.SCREEN.fill((255, 255, 255))
const.SCREEN.blit(
const.ASSET_BACKGROUND,
(
const.V_SCREEN_PADDING,
const.V_SCREEN_PADDING
)
)
for row in minefield.matrix:
for tile in row:
# calculate tile position on the screen
tile_screen_coords = calculate_screen_position(tile.position)
# draw a tile
const.SCREEN.blit(
tile_asset_options.get(tile.terrain_type),
tile_screen_coords
)
# darkening every other tile
if (tile.position[0]+tile.position[1]) % 2 == 0:
pass # darken_tile(tile.position)
# draw a mine on top if there is one
if tile.mine is not None:
if isinstance(tile.mine, StandardMine):
const.SCREEN.blit(mine_asset_options["MINE"], tile_screen_coords)
if isinstance(tile.mine, ChainedMine):
predecessor = tile.mine.predecessor
predecessor_position = predecessor.position if predecessor is not None else None
display_chained_mine(tile.position, predecessor_position)
elif isinstance(tile.mine, TimeMine):
display_time_mine(tile.position, "0" + str(tile.mine.timer))
# changed sapper's movement from jumping to continuous movement (moved everything to Agent's class)
# # sapper
# display_sapper(
# minefield.agent.position,
# minefield.agent.direction
# )
# update graphics after blitting
# pygame.display.update()
# moved here from minefield
def calculate_screen_position(coords):
coords = (
const.V_NUMBER_PADDING + const.V_SCREEN_PADDING + const.V_TILE_SIZE * coords[1],
const.V_NUMBER_PADDING + const.V_SCREEN_PADDING + const.V_TILE_SIZE * coords[0],
)
return coords
def darken_tile(coords):
shadow = pygame.Surface((const.V_TILE_SIZE, const.V_TILE_SIZE))
shadow.fill((220, 220, 220))
const.SCREEN.blit(
shadow,
calculate_screen_position(coords),
special_flags=pygame.BLEND_RGB_MULT
)
# ============== #
# === SAPPER === #
# ============== #
def display_sapper(coords, direction):
sapper_screen_coords = calculate_screen_position(coords)
if direction == const.Direction.UP:
const.SCREEN.blit(
const.ASSET_SAPPER,
sapper_screen_coords
)
elif direction == const.Direction.RIGHT:
const.SCREEN.blit(
pygame.transform.rotate(const.ASSET_SAPPER, 270),
sapper_screen_coords
)
elif direction == const.Direction.DOWN:
const.SCREEN.blit(
pygame.transform.rotate(const.ASSET_SAPPER, 180),
sapper_screen_coords
)
elif direction == const.Direction.LEFT:
const.SCREEN.blit(
pygame.transform.rotate(const.ASSET_SAPPER, 90),
sapper_screen_coords
)
# ============= #
# === TILES === #
# ============= #
def display_concrete(coords):
const.SCREEN.blit(
const.ASSET_CONCRETE,
calculate_screen_position(coords)
)
def display_mud(coords):
const.SCREEN.blit(
const.ASSET_MUD,
calculate_screen_position(coords)
)
def display_grass(coords):
const.SCREEN.blit(
const.ASSET_GRASS,
calculate_screen_position(coords)
)
# ============= #
# === MINES === #
# ============= #
def display_mine(coords):
const.SCREEN.blit(
const.ASSET_MINE,
calculate_screen_position(coords)
)
def display_chained_mine(coords, parent_coords=None):
def display_number(which_coord, number):
number_asset = const.ASSET_NUMBER_CHAINS_0
if number == 1:
number_asset = const.ASSET_NUMBER_CHAINS_1
elif number == 3:
number_asset = const.ASSET_NUMBER_CHAINS_3
elif number == 4:
number_asset = const.ASSET_NUMBER_CHAINS_4
elif number == 5:
number_asset = const.ASSET_NUMBER_CHAINS_5
elif number == 6:
number_asset = const.ASSET_NUMBER_CHAINS_6
elif number == 7:
number_asset = const.ASSET_NUMBER_CHAINS_7
elif number == 8:
number_asset = const.ASSET_NUMBER_CHAINS_8
elif number == 9:
number_asset = const.ASSET_NUMBER_CHAINS_9
elif number == 10:
number_asset = const.ASSET_NUMBER_CHAINS_10
elif number == 11:
number_asset = const.ASSET_NUMBER_CHAINS_11
elif number == 12:
number_asset = const.ASSET_NUMBER_CHAINS_12
elif number == 13:
number_asset = const.ASSET_NUMBER_CHAINS_13
elif number == 14:
number_asset = const.ASSET_NUMBER_CHAINS_14
elif number == 15:
number_asset = const.ASSET_NUMBER_CHAINS_15
mine_coords = calculate_screen_position(coords)
number_coords = mine_coords
if which_coord == const.Coords.X:
number_coords = (mine_coords[0] + 20, mine_coords[1] + 24)
elif which_coord == const.Coords.Y:
number_coords = (mine_coords[0] + 34, mine_coords[1] + 24)
const.SCREEN.blit(
number_asset,
number_coords
)
display_mine(coords)
const.SCREEN.blit(
const.ASSET_CHAINS,
calculate_screen_position(coords)
)
if parent_coords is not None:
display_number(const.Coords.X, parent_coords[0])
display_number(const.Coords.Y, parent_coords[1])
def display_time_mine(coords, time):
def display_number(which_digit, number):
number_asset = const.ASSET_NUMBER_TIME_0
if number == 1:
number_asset = const.ASSET_NUMBER_TIME_1
elif number == 2:
number_asset = const.ASSET_NUMBER_TIME_2
elif number == 3:
number_asset = const.ASSET_NUMBER_TIME_3
elif number == 4:
number_asset = const.ASSET_NUMBER_TIME_4
elif number == 5:
number_asset = const.ASSET_NUMBER_TIME_5
elif number == 6:
number_asset = const.ASSET_NUMBER_TIME_6
elif number == 7:
number_asset = const.ASSET_NUMBER_TIME_7
elif number == 8:
number_asset = const.ASSET_NUMBER_TIME_8
elif number == 9:
number_asset = const.ASSET_NUMBER_TIME_9
mine_coords = calculate_screen_position(coords)
number_coords = mine_coords
if which_digit == const.Digit.ONES:
number_coords = (mine_coords[0] + 44, mine_coords[1] + 22)
elif which_digit == const.Digit.TENS:
number_coords = (mine_coords[0] + 36, mine_coords[1] + 22)
const.SCREEN.blit(
number_asset,
number_coords
)
const.SCREEN.blit(
const.ASSET_TIME_MINE,
calculate_screen_position(coords)
)
display_number(const.Digit.ONES, int(str(time)[-1]))
display_number(const.Digit.TENS, int(str(time)[-2]))