File size: 5,903 Bytes
a3e5f70 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | from settings import *
from os.path import join
from os import walk
from pytmx.util_pygame import load_pygame
# import functions
def import_image(*path, alpha = True, format = 'png'):
full_path = join(*path) + f'.{format}'
surf = pygame.image.load(full_path).convert_alpha() if alpha else pygame.image.load(full_path).convert()
return surf
def import_folder(*path):
frames = []
for folder_path, sub_folders, image_names in walk(join(*path)):
for image_name in sorted(image_names, key = lambda name: int(name.split('.')[0])):
full_path = join(folder_path, image_name)
surf = pygame.image.load(full_path).convert_alpha()
frames.append(surf)
return frames
def import_folder_dict(*path):
frames = {}
for folder_path, sub_folders, image_names in walk(join(*path)):
for image_name in image_names:
full_path = join(folder_path, image_name)
surf = pygame.image.load(full_path).convert_alpha()
frames[image_name.split('.')[0]] = surf
return frames
def import_sub_folders(*path):
frames = {}
for _, sub_folders, __ in walk(join(*path)):
if sub_folders:
for sub_folder in sub_folders:
frames[sub_folder] = import_folder(*path, sub_folder)
return frames
def import_tilemap(cols, rows, *path):
frames = {}
surf = import_image(*path)
cell_width, cell_height = surf.get_width() / cols, surf.get_height() / rows
for col in range(cols):
for row in range(rows):
cutout_rect = pygame.Rect(col * cell_width, row * cell_height,cell_width,cell_height)
cutout_surf = pygame.Surface((cell_width, cell_height))
cutout_surf.fill('green')
cutout_surf.set_colorkey('green')
cutout_surf.blit(surf, (0,0), cutout_rect)
frames[(col, row)] = cutout_surf
return frames
def character_importer(cols, rows, *path):
frame_dict = import_tilemap(cols, rows, *path)
new_dict = {}
for row, direction in enumerate(('down', 'left', 'right', 'up')):
new_dict[direction] = [frame_dict[(col, row)] for col in range(cols)]
new_dict[f'{direction}_idle'] = [frame_dict[(0, row)]]
return new_dict
def all_character_import(*path):
new_dict = {}
for _, __, image_names in walk(join(*path)):
for image in image_names:
image_name = image.split('.')[0]
new_dict[image_name] = character_importer(4,4,*path, image_name)
return new_dict
def coast_importer(cols, rows, *path):
frame_dict = import_tilemap(cols, rows, *path)
new_dict = {}
terrains = ['grass', 'grass_i', 'sand_i', 'sand', 'rock', 'rock_i', 'ice', 'ice_i']
sides = {
'topleft': (0,0), 'top': (1,0), 'topright': (2,0),
'left': (0,1), 'right': (2,1), 'bottomleft': (0,2),
'bottom': (1,2), 'bottomright': (2,2)}
for index, terrain in enumerate(terrains):
new_dict[terrain] = {}
for key, pos in sides.items():
new_dict[terrain][key] = [frame_dict[(pos[0] + index * 3, pos[1] + row)] for row in range(0,rows, 3)]
return new_dict
def tmx_importer(*path):
tmx_dict = {}
for folder_path, sub_folders, file_names in walk(join(*path)):
for file in file_names:
tmx_dict[file.split('.')[0]] = load_pygame(join(folder_path, file))
return tmx_dict
def monster_importer(cols, rows, *path):
monster_dict = {}
for folder_path, sub_folders, image_names in walk(join(*path)):
for image in image_names:
image_name = image.split('.')[0]
monster_dict[image_name] = {}
frame_dict = import_tilemap(cols, rows, *path, image_name)
for row, key in enumerate(('idle', 'attack')):
monster_dict[image_name][key] = [frame_dict[(col,row)] for col in range(cols)]
return monster_dict
def outline_creator(frame_dict, width):
outline_frame_dict = {}
for monster, monster_frames in frame_dict.items():
outline_frame_dict[monster] = {}
for state, frames in monster_frames.items():
outline_frame_dict[monster][state] = []
for frame in frames:
new_surf = pygame.Surface(vector(frame.get_size()) + vector(width * 2), pygame.SRCALPHA)
new_surf.fill((0,0,0,0))
white_frame = pygame.mask.from_surface(frame).to_surface()
white_frame.set_colorkey('black')
new_surf.blit(white_frame, (0,0))
new_surf.blit(white_frame, (width,0))
new_surf.blit(white_frame, (width * 2,0))
new_surf.blit(white_frame, (width * 2,width))
new_surf.blit(white_frame, (width * 2,width * 2))
new_surf.blit(white_frame, (width,width * 2))
new_surf.blit(white_frame, (0,width * 2))
new_surf.blit(white_frame, (0,width))
outline_frame_dict[monster][state].append(new_surf)
return outline_frame_dict
def attack_importer(*path):
attack_dict = {}
for folder_path, _, image_names in walk(join(*path)):
for image in image_names:
image_name = image.split('.')[0]
attack_dict[image_name] = list(import_tilemap(4,1,folder_path, image_name).values())
return attack_dict
def audio_importer(*path):
files = {}
for folder_path, _, file_names in walk(join(*path)):
for file_name in file_names:
full_path = join(folder_path, file_name)
files[file_name.split('.')[0]] = pygame.mixer.Sound(full_path)
return files
# game functions
def draw_bar(surface, rect, value, max_value, color, bg_color, radius = 1):
ratio = rect.width / max_value
bg_rect = rect.copy()
progress = max(0, min(rect.width,value * ratio))
progress_rect = pygame.FRect(rect.topleft, (progress,rect.height))
pygame.draw.rect(surface, bg_color, bg_rect, 0, radius)
pygame.draw.rect(surface, color, progress_rect, 0, radius)
def check_connections(radius, entity, target, tolerance = 30):
relation = vector(target.rect.center) - vector(entity.rect.center)
if relation.length() < radius:
if entity.facing_direction == 'left' and relation.x < 0 and abs(relation.y) < tolerance or\
entity.facing_direction == 'right' and relation.x > 0 and abs(relation.y) < tolerance or\
entity.facing_direction == 'up' and relation.y < 0 and abs(relation.x) < tolerance or\
entity.facing_direction == 'down' and relation.y > 0 and abs(relation.x) < tolerance:
return True |