def show_text(self, pos, text, font, *, color=(0, 0, 0), background=None, save=None, align=(0, 0), pan=(0, 0)): if save is None: pos = (pos[0] + pan[0], pos[1] + pan[1]) text_img = self.font.render_font(font).render( text, True, color, background) size = text_img.get_size() self.screen.blit(text_img, utils.top_left(pos, size, align=align)) else: text_imgs = [] for char in text: char_img = self.font.load(save, char) if char_img is None: char_img = self.font.render_font(font).render( char, True, color, background) self.font.save(save, char, char_img) text_imgs.append(char_img) total_size = sum([text_img.get_size()[0] for text_img in text_imgs]), \ max([text_img.get_size()[1] for text_img in text_imgs]) pos = utils.top_left(pos, total_size, align=align) x, y = pos[0], pos[1] + total_size[1] // 2 for text_img in text_imgs: self.show_img((x, y), text_img, align=(0, 1), pan=pan) x += text_img.get_size()[0]
def __init__(self, args, pos, map, *, arrows=False, max_turn=0, align=(0, 0)): self.args = args self.arrows = arrows self.size = (160, 130) if self.arrows else (160, 60) self.pos = utils.top_left(pos, self.size, align=align) self.map = map self.min_turn = 0 self.max_turn = max_turn self.buttons = { 'turn-': c.Button((self.pos[0] + self.size[0] // 2 - 40, self.pos[1] + 80), (30, 40), '', border=1, align=(1, 1), background=cl.gray_0), 'turn+': c.Button((self.pos[0] + self.size[0] // 2 + 40, self.pos[1] + 80), (30, 40), '', border=1, align=(1, 1), background=cl.gray_0) } if self.arrows else {}
def show(self, ui): if self.active: center = (self.args.size[0] // 2, self.args.size[1] // 2) # show container ui.show_div(center, self.size, color=self.color, align=(1, 1)) ui.show_div(center, self.size, border=1, align=(1, 1)) # show title ui.show_text((center[0], center[1] - 100), 'SAVE', font=('src', 'timesnewroman.ttf', 30), align=(1, 1)) # show input area ui.show_div((center[0], center[1] - 15), self.input_size, color=(255, 255, 255), align=(1, 1)) ui.show_div((center[0], center[1] - 15), self.input_size, border=1, align=(1, 1)) corner = utils.top_left((center[0], center[1] - 15), self.input_size, align=(1, 1)) ui.show_text((corner[0] + 20, corner[1] + 14), self.msg, font=('src', 'timesnewroman.ttf', 22)) # show buttons for name in self.buttons: self.buttons[name].show(ui)
def __init__(self, info, *, type='movable', align=(0, 0)): self.type = type self.name, self.pos, self.size, self.color = \ info['name'], utils.top_left(info['track'][0]['pos'], info['size'], align=align), info['size'], info['color'] self.track = info['track'] self.update_speed = True self.speed = self.track[0]['speed']
def __init__(self, pos, *, size=(220, 100), align=(0, 0)): # display self.pos = utils.top_left(pos, size, align=align) self.size = size # buttons self.buttons = { 'speed-': c.Button((self.pos[0] + self.size[0] // 2 - 75, self.pos[1] + 50), (30, 40), '', font=('src', 'timesnewroman.ttf', 22), align=(1, 1), background=(230, 230, 230)), '': c.Button((self.pos[0] + self.size[0] // 2, self.pos[1] + 50), (120, 40), 'speed×1', font=('src', 'timesnewroman.ttf', 22), align=(1, 1), background=(230, 230, 230)), 'speed+': c.Button((self.pos[0] + self.size[0] // 2 + 75, self.pos[1] + 50), (30, 40), '', font=('src', 'timesnewroman.ttf', 22), align=(1, 1), background=(230, 230, 230)) }
def __init__(self, args, pos, address, name, *, align=(0, 0)): self.args = args self.size = [600, 100] self.pos = utils.top_left(pos, self.size, align=align) self.ip = address[0] self.port = address[1] self.name = name self.join_btn = c.Button(utils.add(self.pos, (550, 50)), (80, 60), 'Join', font=f.tnr(20), border=1, align=(1, 1))
def __init__(self, info, *, type='switch', align=(0, 0)): self.type = type self.name, self.pos, self.size, self.color = \ info['name'], utils.top_left(info['pos'], info['size'], align=align), info['size'], info['color'] self.command = info['command'] self.state = 'close' self.props = {} self.speed = [0, 0]
def process_click(self, pos, mouse_pos, *, align=(0, 0)): pos = utils.top_left(pos, self.size, align=align) x0, x1, y0, y1, y2 = pos[0] + 650, pos[0] + 800, pos[ 1], pos[1] + self.size[1] // 2, pos[1] + self.size[1] if x0 < mouse_pos[0] < x1 and y0 < mouse_pos[1] < y1: return [ 'game', self.mode, self.player_mode, self.threshold, self.game ] elif x0 < mouse_pos[0] < x1 and y1 < mouse_pos[1] < y2: return ['delete', self.mode, self.name] return [None]
def __init__(self, mode, pos, *, align=(0, 0)): self.mode = mode self.size = (9, 9) if self.mode == '1' else (11, 11) self.block_size = 70 self.total_size = (self.size[0] * self.block_size, self.size[1] * self.block_size) self.pos = utils.top_left(pos, self.total_size, align=align) # board self.board = None self._board = None self.prepare()
def __init__(self, info, *, type='movable', align=(0, 0)): super().__init__(info, type) # show self.pos = list( utils.top_left(info['track'][0]['pos'], info['size'], align=align)) # move self.track = info['track'] self.update_speed = True self.speed = self.track[0]['speed'] # update if 'update' in info.keys(): self.update = info['update']
def show_circle(self, pos, radius, *, border=0, color=(0, 0, 0), align=(1, 1), pan=(0, 0)): pos = utils.add( utils.top_left(pos, (radius * 2, radius * 2), align=align), (radius, radius), pan) pygame.draw.circle(self.screen, color, pos, radius, border)
def show_div(self, pos, size, *, border=0, color=(0, 0, 0), align=(0, 0), pan=(0, 0)): # align: 0 left/top, 1 center, 2 right/bottom pos = utils.add(pos, pan) rect = [utils.top_left(pos, size, align=align), size] pygame.draw.rect(self.screen, color, rect, border)
def __init__(self, info, *, type='switch', align=(0, 0)): super().__init__(info, type) self.pos = list(utils.top_left(info['pos'], info['size'], align=align)) # command self.command = info['command'] self.state = 'close' self.triggered = False # move self.speed = [0, 0] # update self.update = [] if 'update' in info.keys(): self.update = info['update']
def show_text(self, pos, text, font, *, color=(0, 0, 0), background=None, align=(0, 0), pan=(0, 0)): pos = (pos[0] + pan[0], pos[1] + pan[1]) text_img = self.font.render_font(font).render(text, True, color, background) size = text_img.get_size() self.screen.blit(text_img, utils.top_left(pos, size, align=align))
def __init__(self, pos, *, buttons=('continue', 'quit'), size=(300, 240), align=(0, 0)): # display self.pos = utils.top_left(pos, size, align=align) self.size = size self.active = False # buttons self.buttons = {} x = 100 for name in buttons: self.buttons[name] = c.Button( (self.pos[0] + self.size[0] // 2, self.pos[1] + x), (200, 40), name, font=f.tnr(22), align=(1, 0), background=(230, 230, 230) ) x += 60
def process_click(self, pos, mouse_pos, *, align=(0, 0)): pos = utils.top_left(pos, self.size, align=align) x0, x1, y0, y1, y2 = ( pos[0] + self.size[0] - 120, pos[0] + self.size[0], pos[1], pos[1] + self.size[1] // 2, pos[1] + self.size[1]) if x0 < mouse_pos[0] < x1 and y0 < mouse_pos[1] < y1: if not self.err: return ['replay', sv.Saver.load(os.path.join(self.args.save_path, 'replay', f'{self.name}.gnr'))] elif x0 < mouse_pos[0] < x1 and y1 < mouse_pos[1] < y2: return ['delete', self.name] return [None]
def show_texts(self, pos, texts, font, *, align=(0, 0), pan=(0, 0)): pos = utils.add(pos, pan) text_font = self.font.render_font(font) # evaluate total size total_size = (0, 0) for text in texts: size = text_font.size(text[0]) total_size = (total_size[0] + size[0], size[1]) # draw text pos, x = utils.top_left(pos, total_size, align=align), 0 for text in texts: text_img = text_font.render(text[0], True, text[1]) self.screen.blit(text_img, (pos[0] + x, pos[1])) x += text_img.get_size()[0]
def __init__(self, pos, *, buttons=tuple(['quit']), size=(300, 240), align=(0, 0)): # display self.pos = utils.top_left(pos, size, align=align) self.size = size self.win = None # buttons self.buttons = {} x = 140 for name in buttons: self.buttons[name] = c.Button( (self.pos[0] + self.size[0] // 2, self.pos[1] + x), (200, 40), name, font=f.tnr(22), align=(1, 0), background=(230, 230, 230) ) x += 60
def __init__(self, pos, size, owner=None, num=0, terrain='blank', *, align=(0, 0)): self.size = size self.pos = utils.top_left(pos, (self.size, self.size), align=align) # contents self.owner = owner self.num = num self.visible = False self.terrain = terrain # blank, base, city, mountain
def __init__(self, pos, log, *, size=(200, 100), align=(0, 0)): # display self.pos = utils.top_left(pos, size, align=align) self.size = size # log self.log = log # buttons self.buttons = { 'next': c.Button((self.pos[0] + self.size[0] // 2, self.pos[1] + 30), (150, 40), 'skip', font=('src', 'timesnewroman.ttf', 22), align=(1, 0), background=(230, 230, 230)), }
def __init__(self, mode, map, threshold, pos, *, align=(0, 0)): # display self.size = {'1': (180, 180), '2': (180, 250)}[mode] self.pos = utils.top_left(pos, self.size, align=align) # game self.mode = mode self.map = map self.threshold = threshold self.sides = ['red', 'blue'] if self.mode == '1' else [ 'red', 'yellow', 'blue', 'green' ] self.colors = { 'red': (255, 0, 0), 'yellow': (204, 204, 0), 'blue': (0, 0, 255), 'green': (0, 255, 0) }
def __init__(self, mode, map_info, pos, *, align=(0, 0)): self.mode = mode self.map_info = map_info self.size = self.map_info['size'] self.pos = utils.top_left(pos, self.size, align=align) # objects self.objects = { 'target': None, 'obstacle': [], 'elevator': [], 'switch': [], 'coin': [], 'monster': [], } self.init_objects() self.descriptions = [] if 'description' in self.map_info.keys(): self.descriptions = self.map_info['description']
def __init__(self, pos, size, text, *, font=('src', 'timesnewroman.ttf', 25), border=2, color=((0, 0, 0), (0, 0, 0)), align=(0, 0), background=None): self.pos = utils.top_left(pos, size, align=align) self.size = size self.text = text self.font = font self.border = border self.color = color self.align = align self.background = background
def __init__(self, args, pos, players, id, dim=(29, 24), *, map_status=None, align=(0, 0)): self.args = args self.id = id self.dim = dim self.prd = tuple(product(range(self.dim[0]), range(self.dim[1]))) self.eprd = tuple(enumerate(self.prd)) # display self.grid_size = 40 self.total_size = self.dim[0] * self.grid_size, self.dim[ 1] * self.grid_size self.pos = utils.top_left(pos, self.total_size, align=align) self.pan = (0, 0) # cursor and blocks self.cursor = None self.blocks = None self.cities = None self.players = players self.init_status = None MapLoader.init_blocks(self, map_status=map_status) # update self.turn = 0 self.update_interval = 0.5 self.city_gen = 2 self.blank_gen = 50 self.clock = sw.Stopwatch() self.clock.start() # record self.record = [[None for _ in self.players]] # refresh self.refresh()
def __init__(self, pos, size, text, *, font=f.tnr(25), border=2, color=((0, 0, 0), (0, 0, 0)), save=None, align=(0, 0), background=None): self.pos = utils.top_left(pos, size, align=align) self.size = size self.text = text self.font = font self.border = border self.color = color self.save = save self.align = align self.background = background
def save(self, game): game.name = self.msg # get new pos and controls pos, ctrl = game.map.pos, game.ctrl center = (self.args.size[0] // 2, self.args.size[1] // 2) size = (game.map.size[0] * game.map.block_size, game.map.size[1] * game.map.block_size) game.map.pos, game.ctrl = utils.top_left( center, size, align=(1, 1)), mc.Controls(game.map) # save if len(game.game_menu.winner) == 0: with open(os.path.join('.', 'save', game.name + '.cns'), 'wb') as f: pickle.dump(game, f) else: with open(os.path.join('.', 'replay', game.name + '.cnsr'), 'wb') as f: pickle.dump(game.log, f) # return to original pos and controls game.map.pos, game.ctrl = pos, ctrl
def __init__(self, mode, pos, *, buttons=('save', 'quit'), size=(200, 220), align=(0, 0)): # display self.pos = utils.top_left(pos, size, align=align) self.size = size # game self.mode = mode self.round = 1 self.sides = ['red', 'blue'] if self.mode == '1' else [ 'red', 'yellow', 'blue', 'green' ] self.colors = { 'red': (255, 0, 0), 'yellow': (204, 204, 0), 'blue': (0, 0, 255), 'green': (0, 255, 0) } self.current = 0 self.winner = [] # buttons self.buttons = { buttons[0]: c.Button((self.pos[0] + self.size[0] // 2, self.pos[1] + 110), (150, 40), buttons[0], font=('src', 'timesnewroman.ttf', 22), align=(1, 0), background=(230, 230, 230)), buttons[1]: c.Button((self.pos[0] + self.size[0] // 2, self.pos[1] + 160), (150, 40), buttons[1], font=('src', 'timesnewroman.ttf', 22), align=(1, 0), background=(230, 230, 230)), }
def show(self, ui, pos, *, align=(0, 0), pan=(0, 0)): pos = utils.top_left(pos, self.size, align=align) # show background: if self.err: color = cl.gray_1 elif self.winner is None: color = cl.white else: color = self.player_colors[self.winner] color_blocks = (182, 192, 189) ui.show_div((pos[0], pos[1]), (self.size[0] - 300, self.size[1]), color=color_blocks, pan=pan) ui.show_div((pos[0] + 5, pos[1] + 5), (12, self.size[1] - 10), color=color, pan=pan) ui.show_div((pos[0] + self.size[0] - 300, pos[1]), (180, self.size[1]), color=cl.add(color_blocks, -10), pan=pan) ui.show_div( (pos[0] + self.size[0] - 120, pos[1]), (120, self.size[1] // 2), color=cl.add(color_blocks, -20), pan=pan) ui.show_div( (pos[0] + self.size[0] - 120, pos[1] + self.size[1] // 2), (120, self.size[1] // 2), color=(160, 145, 145), pan=pan) # show name, num, & turn ui.show_text( (pos[0] + 40, pos[1] + self.size[1] // 2), self.name, f.cambria(22), save='cambria-22', align=(0, 1), pan=pan) if not self.err: ui.show_text( (pos[0] + self.size[0] - 210, pos[1] + self.size[1] // 2 - 18), f'Turn {self.turn}', f.cambria(20), save='cambria-20', align=(1, 1), pan=pan) ui.show_text( (pos[0] + self.size[0] - 210, pos[1] + self.size[1] // 2 + 18), f'{self.num} player' + ('' if self.num == 1 else 's'), f.cambria(20), save='cambria-20', align=(1, 1), pan=pan) # show play and delete images ui.show_img_by_path( (pos[0] + self.size[0] - 60, pos[1] + self.size[1] // 4), 'play.png', align=(1, 1), pan=pan) ui.show_img_by_path( (pos[0] + self.size[0] - 60, pos[1] + self.size[1] * 3 // 4), 'delete.png', align=(1, 1), pan=pan)
def __init__(self, args, pos, size, choices=('continue', 'quit'), *, align=(0, 0)): self.args = args self.size = size self.pos = utils.top_left(pos, self.size, align=align) self.buttons = { name: c.Button((self.pos[0] + self.size[0] // 2, self.pos[1] + pos), (200, 40), name, font=f.tnr(22), border=1, align=(1, 0), background=(230, 230, 230)) for name, pos in zip(choices, range(100, 100 + 60 * len(choices), 60)) } self.active = False
def __init__(self, args, pos, *, dim=(30, 30), max_apples=3, align=(0, 0)): self.args = args self.dim = dim self.grid_size = 31 self.grid_inner_size = 22 self.apple_radius = 6 self.pos = utils.top_left(pos, self.size(), align=align) self.pan = [0, 0] self.blocks = [[ Block(self.args, (i, j), self.grid_size, self.grid_inner_size) for j in range(self.dim[1]) ] for i in range(self.dim[0])] self.board_ui = front.new_ui(self.args, self.size()) # show blocks for row in self.blocks: for block in row: block.show(self.board_ui) # show grid (x_min, y_min), (x_max, y_max) = (0, 0), self.size() step = self.grid_size for col in range(self.dim[0] + 1): self.board_ui.show_line((x_min + col * step, y_min), (x_min + col * step, y_max)) for row in range(self.dim[1] + 1): self.board_ui.show_line((x_min, y_min + row * step), (x_max, y_min + row * step)) self.apples = [] self.max_apples = max_apples self.steve_jobs = a.SteveJobs(self.args, self.dim, self.grid_size, self.apple_radius, max_size=self.max_apples)