예제 #1
0
파일: ui.py 프로젝트: cty012/py-generals
 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]
예제 #2
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 {}
예제 #3
0
 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)
예제 #4
0
 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']
예제 #5
0
 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))
     }
예제 #6
0
 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))
예제 #7
0
 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]
예제 #8
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]
예제 #9
0
파일: map.py 프로젝트: cty012/cut-and-slice
 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()
예제 #10
0
 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']
예제 #11
0
 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)
예제 #12
0
 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)
예제 #13
0
 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']
예제 #14
0
 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))
예제 #15
0
 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
예제 #16
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] + 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]
예제 #17
0
 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]
예제 #18
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
예제 #19
0
파일: block.py 프로젝트: cty012/py-generals
 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
예제 #20
0
 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)),
     }
예제 #21
0
 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)
     }
예제 #22
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']
예제 #23
0
 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
예제 #24
0
    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()
예제 #25
0
 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
예제 #26
0
 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
예제 #27
0
 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)),
     }
예제 #28
0
    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)
예제 #29
0
 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
예제 #30
0
    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)