def build_gui(self): super().build_gui() panel_rect = Rect( 0, 0, 500, self.display.get_rect().height - (get_param('panel_padding') * 2)) panel_rect.centerx = self.display.get_rect().centerx panel_rect.y = get_param('panel_padding') self.ui_elements['panel'] = UIPanel(panel_rect, 1, self.gui) # all other elements are relative scene_label_rect = Rect(0, 0, 400, get_param('element_height')) scene_label_rect.y = get_param('element_padding') scene_label_rect.centerx = panel_rect.w // 2 # midpoint of the panel self.ui_elements['scene_label'] = UILabel(scene_label_rect, "Map Editor Menu", self.gui, self.ui_elements['panel']) # buttons button_rect = Rect(0, 100, 400, get_param('element_height')) button_rect.centerx = panel_rect.w // 2 self.ui_elements['btn_new'] = UIButton(button_rect, "New Map", self.gui, self.ui_elements['panel']) button_rect.y += get_param('element_height') + get_param( 'element_padding') self.ui_elements['btn_load'] = UIButton(button_rect, "Load Map", self.gui, self.ui_elements['panel']) button_rect.y += get_param('element_height') + get_param( 'element_padding') self.ui_elements['btn_back'] = UIButton(button_rect, "Back", self.gui, self.ui_elements['panel'])
def create_labels(self, root: Component) -> None: """ Create all labels in the settings menu. """ label_style = Style(background_color=(0, 128, 255), primary_color=(255, 255, 255)) self.soundFX = Label(text="Adjust Sound FX", rect=Rect(150, 120, 250, 50), style=label_style, parent=self.soundFx_panel) self.music = Label(text="Music volume", rect=Rect(200, 200, 200, 50), style=label_style, parent=self.music_panel) self.window_mode = Label(text="Window Mode", rect=Rect(200, 300, 200, 100), style=label_style, parent=self.window_mode_panel) size = sm.SceneManager.instance.get_screen_size() title_rect = Rect(400, 45, 250, 50) title_rect.centerx = size[0] / 2 self.menu = Label(text="CHANGE SETTINGS", rect=title_rect, style=label_style, parent=root)
def draw_map(self, map_data=None): if self.show_damage_update: self.damage_layer_cache = {} WriteLog.debug(__name__, "绘制地图") self.clear_map() # 清空精灵 if map_data is None: map_data = self.map_data temp_x = 0 temp_y = 0 px, py = self.trans_locate(0, 0) rect = Rect(px, py, self.block_size, self.block_size) ground = get_resource('0') # 地板 先暂时这么搞吧 self.fill_surface(ground, mode="repeat") PlayerCon = global_var.get_value("PlayerCon") self.add_sprite(PlayerCon) while temp_y < self.height: while temp_x < self.width: map_element = map_data[temp_y][temp_x] if int(map_element) != 0: # sprite的显示需要接通group name = str(map_element) ret = get_resource(name) px, py = self.trans_locate(temp_x, temp_y, "down") rect.centerx = px rect.bottom = py if type(ret) is tuple: # 属于精灵 (注意:此时不能直接导入精灵,因为先有map后有精灵) img = ret[0] img_rect = ret[1] # 以资源本体大小显示 用以支持超过32*32的图像 img_rect.topleft = rect.topleft sp = list(ret[2]) self.add_sprite(EventSprite(name, img, sp), fill_rect=img_rect) elif ret is not None: self.fill_surface(ret, fill_rect=rect) # 显伤怪物id和位置的缓存 if map_element > 200: if self.show_damage_update: if map_element in self.damage_layer_cache: self.damage_layer_cache[map_element]["loc"].append([temp_x, temp_y]) else: self.damage_layer_cache[map_element] = {} self.damage_layer_cache[map_element]["loc"] =[] self.damage_layer_cache[map_element]["loc"].append([temp_x, temp_y]) check_result = self.FUNCTION.get_damage_info(map_element) critical = self.FUNCTION.get_criticals(map_element, 1, damage_info=check_result) if check_result == False: self.damage_layer_cache[map_element]["damage"] = "???" else: self.damage_layer_cache[map_element]["damage"] = check_result["damage"] if critical == []: self.damage_layer_cache[map_element]["critical"] = 0 else: self.damage_layer_cache[map_element]["critical"] = critical[0][0] temp_x += 1 temp_y += 1 temp_x = 0 self.temp_srufcae = self.surface.copy() self.show_damage_update = False
def build_gui(self): super().build_gui() panel_rect = Rect( 0, 0, 500, self.display.get_rect().height - (get_param('panel_padding') * 2)) panel_rect.centerx = self.display.get_rect().centerx panel_rect.y = get_param('panel_padding') self.ui_elements['panel'] = UIPanel(panel_rect, 1, self.gui) # all other elements are relative scene_label_rect = Rect(0, 0, 400, get_param('element_height')) scene_label_rect.y = get_param('element_padding') scene_label_rect.centerx = panel_rect.w // 2 # midpoint of the panel self.ui_elements['scene_label'] = UILabel(scene_label_rect, "Main Menu", self.gui, self.ui_elements['panel']) # buttons button_rect = Rect(0, 0, 400, get_param('element_height')) button_rect.y = scene_label_rect.bottom + get_param('element_padding') button_rect.centerx = panel_rect.w // 2 self.ui_elements['btn_new'] = UIButton(button_rect, "New Game", self.gui, self.ui_elements['panel']) button_rect.y += get_param('element_height') + get_param( 'element_padding') self.ui_elements['btn_load'] = UIButton(button_rect, "Load Game", self.gui, self.ui_elements['panel']) button_rect.y += get_param('element_height') + get_param( 'element_padding') self.ui_elements['btn_editor'] = UIButton(button_rect, "Map Editor", self.gui, self.ui_elements['panel']) button_rect.y += get_param('element_height') + get_param( 'element_padding') self.ui_elements['btn_settings'] = UIButton(button_rect, "Settings", self.gui, self.ui_elements['panel']) button_rect.y += get_param('element_height') + get_param( 'element_padding') self.ui_elements['btn_quit'] = UIButton(button_rect, "Quit Game", self.gui, self.ui_elements['panel'])
def build_gui(self): super().build_gui() panel_rect = Rect(0, 0, 500, self.display.get_rect().height - (get_param('panel_padding') * 2)) panel_rect.centerx = self.display.get_rect().centerx panel_rect.y = get_param('panel_padding') self.ui_elements['panel'] = UIPanel(panel_rect, 1, self.gui) # all other elements are relative scene_label_rect = Rect(0, 0, 400, get_param('element_height')) scene_label_rect.y = get_param('element_padding') scene_label_rect.centerx = panel_rect.w // 2 # midpoint of the panel self.ui_elements['scene_label'] = UILabel(scene_label_rect, "Select Existing Game Map", self.gui, self.ui_elements['panel']) # buttons select_rect = Rect(0, 0, 400, get_param('element_height') * 3) select_rect.y = scene_label_rect.bottom + get_param('element_padding') select_rect.centerx = panel_rect.w // 2 self.ui_elements['map_select'] = UISelectionList(select_rect, [f"Map {n}" for n in range(20)], self.gui, container=self.ui_elements['panel']) preview_rect = Rect(0, 0, 256, get_param('element_height') * 8) preview_rect.y = select_rect.bottom + get_param('element_padding') preview_rect.centerx = panel_rect.w // 2 self.ui_elements['preview'] = UILabel(preview_rect, "PREVIEW AREA", self.gui, self.ui_elements['panel']) button_rect = Rect(0, 0, 200, get_param('element_height')) button_rect.y = preview_rect.bottom + get_param('element_padding') button_rect.centerx = (panel_rect.w // 2) - 100 self.ui_elements['btn_back'] = UIButton(button_rect, "Back", self.gui, self.ui_elements['panel']) button_rect.centerx = (panel_rect.w // 2) + 100 self.ui_elements['btn_next'] = UIButton(button_rect, "Next", self.gui, self.ui_elements['panel']) self.ui_elements['btn_next'].disable()
def test_centerx(self): """Changing the centerx attribute moves the rect and does not change the rect's width """ r = Rect(1, 2, 3, 4) new_centerx = r.centerx + 20 expected_left = r.left + 20 old_width = r.width r.centerx = new_centerx self.assertEqual(new_centerx, r.centerx) self.assertEqual(expected_left, r.left) self.assertEqual(old_width, r.width)
def test_centerx( self ): """Changing the centerx attribute moves the rect and does not change the rect's width """ r = Rect( 1, 2, 3, 4 ) new_centerx = r.centerx + 20 expected_left = r.left + 20 old_width = r.width r.centerx = new_centerx self.assertEqual( new_centerx, r.centerx ) self.assertEqual( expected_left, r.left ) self.assertEqual( old_width, r.width )
def draw_icon(self, map_element, x, y): px, py = self.trans_locate(0, 0) rect = Rect(px, py, self.block_size, self.block_size) # sprite的显示需要接通group name = str(map_element) ret = get_resource(name) px, py = self.trans_locate(x, y, "down") rect.centerx = px rect.bottom = py if type(ret) is tuple: # 属于精灵 (注意:此时不能直接导入精灵,因为先有map后有精灵) img = ret[0] img_rect = ret[1] # 以资源本体大小显示 用以支持超过32*32的图像 img_rect.topleft = rect.topleft sp = list(ret[2]) self.add_sprite(EventSprite(name, img, sp), fill_rect=img_rect) elif ret is not None: self.fill_surface(ret, fill_rect=rect)
def build_gui(self): super().build_gui() panel_rect = Rect( 0, 0, 500, self.display.get_rect().height - (get_param('panel_padding') * 2)) panel_rect.centerx = self.display.get_rect().centerx panel_rect.y = get_param('panel_padding') self.ui_elements['panel'] = UIPanel(panel_rect, 1, self.gui) # all other elements are relative scene_label_rect = Rect(0, 0, 400, get_param('element_height')) scene_label_rect.y = get_param('element_padding') scene_label_rect.centerx = panel_rect.w // 2 # midpoint of the panel self.ui_elements['scene_label'] = UILabel(scene_label_rect, "Settings", self.gui, self.ui_elements['panel']) # screen size label_rect = Rect(0, 0, 150, get_param('element_height')) label_rect.y += scene_label_rect.bottom + get_param('element_padding') dd_rect = Rect(0, 0, 250, get_param('element_height')) dd_rect.y = label_rect.y label_rect.centerx = 125 dd_rect.centerx = 325 self.ui_elements['d_size_label'] = UILabel(label_rect, "Display Size", self.gui, self.ui_elements['panel']) self.ui_elements['dd_d_size'] = UIDropDownMenu( get_param('display_sizes'), get_param('current_display_size'), dd_rect, self.gui, self.ui_elements['panel']) # full screen label_rect.y += get_param('element_height') + get_param( 'element_padding') dd_rect.y = label_rect.y self.ui_elements['fs_label'] = UILabel(label_rect, "Full Screen", self.gui, self.ui_elements['panel']) self.ui_elements['dd_fs'] = UIDropDownMenu( ["On", "Off"], get_param('display_full_screen_value'), dd_rect, self.gui, self.ui_elements['panel']) # buttons button_rect = Rect(0, 0, 200, get_param('element_height')) button_rect.y = label_rect.bottom + get_param('element_padding') button_rect.centerx = (panel_rect.w // 2) - 100 self.ui_elements['btn_back'] = UIButton(button_rect, "Back", self.gui, self.ui_elements['panel']) # the apply button always starts off disabled button_rect.centerx = (panel_rect.w // 2) + 100 self.ui_elements['btn_apply'] = UIButton(button_rect, "Apply", self.gui, self.ui_elements['panel']) self.ui_elements['btn_apply'].disable() # re-assign values for our check parameters, this is to control the apply buttons state self._check_screen_size = get_param('current_display_size') self._check_full_screen = get_param('display_full_screen_value')
def draw_text(text='sample text', color=(255, 255, 255), pos=(0, 0), surface=None, align_x='left', align_y='top'): if (surface == None): surface = api.screen text_rect = Rect(0, 0, *font.size(text)) if (align_x == 'left'): text_rect.left = pos[0] elif (align_x == 'center'): text_rect.centerx = pos[0] elif (align_x == 'right'): text_rect.right = pos[0] if (align_y == 'top'): text_rect.top = pos[1] elif (align_y == 'center'): text_rect.centery = pos[1] elif (align_y == 'bottom'): text_rect.bottom = pos[1] surface.blit(font.render(text, 1, color), text_rect)
def align_rect(outer: pygame.Rect, inner: pygame.Rect, coords, *, halign: Literal["left", "center", "right"] = "left", valign: Literal["top", "center", "bottom"] = "top", outer_halign: Literal["left", "center", "right"] = "left", outer_valign: Literal["top", "center", "bottom"] = "top"): """Calculate coordinates for an inner rectangle aligned to an outer rectangle""" x, y = coords if outer_halign == "left": pass elif outer_halign == "center": x = outer.centerx + x elif outer_halign == "right": x = outer.right + x if outer_valign == "top": pass elif outer_valign == "center": y = outer.centery + y elif outer_valign == "bottom": y = outer.bottom + y if halign == "left": inner.left = x elif halign == "center": inner.centerx = x elif halign == "right": inner.right = x if valign == "top": inner.top = y elif valign == "center": inner.centery = y elif valign == "bottom": inner.bottom = y return inner.topleft
def set_screensize(screensize): """ Set the physical screen size in pixels. Calculates the transformations to and from game space, using an aspect-preserving scale. """ global screenarea, screenplayarea global s_f_g_w, s_f_g_h, s_f_g_x, s_f_g_y global g_f_s_w, g_f_s_h, g_f_s_x, g_f_s_y # find screenarea rect # the rect in screen space that the game will take up # by doing an aspect preserve scale, and centering in the middle of the screen if screensize[0] / screensize[1] > GAME_AREA.width / GAME_AREA.height: # game uses full height of screen screenarea = Rect(0, 0, screensize[1] * GAME_AREA.width / GAME_AREA.height, screensize[1]) screenarea.centerx = screensize[0] / 2 else: # game uses full width of screen screenarea = Rect(0, 0, screensize[0], screensize[0] * GAME_AREA.height / GAME_AREA.width) screenarea.centery = screensize[1] / 2 # screen_from_game: s_f_g_w = screenarea.width / GAME_AREA.width s_f_g_h = screenarea.height / GAME_AREA.height s_f_g_x = screenarea.x - GAME_AREA.x * s_f_g_w s_f_g_y = screenarea.y - GAME_AREA.y * s_f_g_h # game_from_screen g_f_s_w = GAME_AREA.width / screenarea.width g_f_s_h = GAME_AREA.height / screenarea.height g_f_s_x = GAME_AREA.x - screenarea.x * g_f_s_w g_f_s_y = GAME_AREA.y - screenarea.y * g_f_s_h screenplayarea = screenrect_from_gamerect(GAME_PLAY_AREA)
def build_gui(self): super().build_gui() panel_rect = Rect( 0, 0, 500, self.display.get_rect().height - (get_param('panel_padding') * 2)) panel_rect.centerx = self.display.get_rect().centerx panel_rect.y = get_param('panel_padding') self.ui_elements['panel'] = UIPanel(panel_rect, 1, self.gui) # all other elements are relative scene_label_rect = Rect(0, 0, 400, get_param('element_height')) scene_label_rect.y = get_param('element_padding') scene_label_rect.centerx = panel_rect.w // 2 # midpoint of the panel self.ui_elements['scene_label'] = UILabel(scene_label_rect, "Load Saved Game", self.gui, self.ui_elements['panel']) # buttons select_rect = Rect(0, 0, 400, get_param('element_height') * 3) select_rect.y = scene_label_rect.bottom + get_param('element_padding') select_rect.centerx = panel_rect.w // 2 self.ui_elements['game_select'] = UISelectionList( select_rect, [f"Game {n}" for n in range(5)], self.gui, container=self.ui_elements['panel']) button_rect = Rect(0, 0, 200, get_param('element_height')) button_rect.y = select_rect.bottom + get_param('element_padding') button_rect.centerx = (panel_rect.w // 2) - 100 self.ui_elements['btn_load'] = UIButton(button_rect, "Load Save", self.gui, self.ui_elements['panel']) self.ui_elements['btn_load'].disable() button_rect.centerx = (panel_rect.w // 2 + 100) self.ui_elements['btn_delete'] = UIButton(button_rect, "Delete Save", self.gui, self.ui_elements['panel']) self.ui_elements['btn_delete'].disable() button_rect.w = 400 button_rect.centerx = panel_rect.w // 2 button_rect.y += get_param('element_height') + get_param( 'element_padding') self.ui_elements['btn_back'] = UIButton(button_rect, "Back", self.gui, self.ui_elements['panel'])
def build_gui(self): super().build_gui() panel_rect = Rect( 0, 0, 500, self.display.get_rect().height - (get_param('panel_padding') * 2)) panel_rect.centerx = self.display.get_rect().centerx panel_rect.y = get_param('panel_padding') self.ui_elements['panel'] = UIPanel(panel_rect, 1, self.gui) # all other elements are relative scene_label_rect = Rect(0, 0, 400, get_param('element_height')) scene_label_rect.y = get_param('element_padding') scene_label_rect.centerx = panel_rect.w // 2 # midpoint of the panel self.ui_elements['scene_label'] = UILabel(scene_label_rect, "Start New Game", self.gui, self.ui_elements['panel']) l_side_rect = Rect(0, 0, 150, get_param('element_height')) l_side_rect.centerx = 125 l_side_rect.y = scene_label_rect.bottom + get_param('element_padding') self.ui_elements['l_dd_label'] = UILabel(l_side_rect, "Map Type", self.gui, self.ui_elements['panel']) dd_rect = Rect(0, 0, 250, get_param('element_height')) dd_rect.y = l_side_rect.y dd_rect.centerx = 325 self.ui_elements['l_dd_game_map'] = UIDropDownMenu( ['Existing', 'Random'], 'Existing', dd_rect, self.gui, self.ui_elements['panel']) btn_rect = Rect(0, 0, 200, get_param('element_height')) btn_rect.centerx = (panel_rect.w) // 2 - 100 btn_rect.y = dd_rect.bottom + get_param('element_padding') self.ui_elements['btn_back'] = UIButton(btn_rect, "Back", self.gui, self.ui_elements['panel']) btn_rect = Rect(0, 0, 200, get_param('element_height')) btn_rect.centerx = (panel_rect.w // 2) + 100 btn_rect.y = dd_rect.bottom + get_param('element_padding') self.ui_elements['btn_next'] = UIButton(btn_rect, "Next", self.gui, self.ui_elements['panel'])
def build_gui(self): super().build_gui() panel_rect = Rect( 0, 0, 500, self.display.get_rect().height - (get_param('panel_padding') * 2)) panel_rect.centerx = self.display.get_rect().centerx panel_rect.y = get_param('panel_padding') self.ui_elements['panel'] = UIPanel(panel_rect, 1, self.gui) # all other elements are relative scene_label_rect = Rect(0, 0, 400, get_param('element_height')) scene_label_rect.y = get_param('element_padding') scene_label_rect.centerx = panel_rect.w // 2 # midpoint of the panel self.ui_elements['scene_label'] = UILabel(scene_label_rect, "Generate Random Map", self.gui, self.ui_elements['panel']) # map size label_rect = Rect(0, 0, 150, get_param('element_height')) label_rect.y += scene_label_rect.bottom + get_param('element_padding') dd_rect = Rect(0, 0, 250, get_param('element_height')) dd_rect.y = label_rect.y label_rect.centerx = 125 dd_rect.centerx = 325 self.ui_elements['d_size_label'] = UILabel(label_rect, "Map Size", self.gui, self.ui_elements['panel']) self.ui_elements['dd_map_size'] = UIDropDownMenu( ['64', '128', '256'], '64', dd_rect, self.gui, self.ui_elements['panel']) # Seed label_rect.y += get_param('element_height') + get_param( 'element_padding') ip_rect = Rect(0, 0, 180, get_param('element_height')) ip_rect.centerx = (panel_rect.w // 2) + 30 ip_rect.y = label_rect.y s_btn_rect = Rect(0, 0, 60, get_param('element_height')) s_btn_rect.x = ip_rect.right + get_param('element_padding') s_btn_rect.y = ip_rect.y self.ui_elements['seed_label'] = UILabel(label_rect, 'Map Seed', self.gui, self.ui_elements['panel']) self.ui_elements['input_seed'] = UITextEntryLine( ip_rect, self.gui, self.ui_elements['panel']) self.ui_elements['btn_rnd_seed'] = UIButton(s_btn_rect, 'Random', self.gui, self.ui_elements['panel']) # I want to add two sliders, 1 for mountains and 1 for water, these would be used to control the upper # and lower limits of the height mapping. h_sl_ops = (0, 100) h_sl_sel = 50 label_rect.y += get_param('element_height') + get_param( 'element_padding') h_sl_rect = Rect(0, 0, 200, get_param('element_height')) h_sl_rect.centerx = (panel_rect.w // 2) + get_param('element_padding') + 30 h_sl_rect.y = label_rect.y self.ui_elements['hsl_grass'] = UILabel(label_rect, 'Grass', self.gui, self.ui_elements['panel']) self.ui_elements['hs_grass'] = UIHorizontalSlider( h_sl_rect, h_sl_sel, h_sl_ops, self.gui, self.ui_elements['panel']) label_rect.y += get_param('element_height') + get_param( 'element_padding') h_sl_rect.y = label_rect.y self.ui_elements['hsl_water'] = UILabel(label_rect, 'Water', self.gui, self.ui_elements['panel']) self.ui_elements['hs_water'] = UIHorizontalSlider( h_sl_rect, h_sl_sel, h_sl_ops, self.gui, self.ui_elements['panel']) label_rect.y += get_param('element_height') + get_param( 'element_padding') h_sl_rect.y = label_rect.y self.ui_elements['hsl_mountain'] = UILabel(label_rect, 'Mountain', self.gui, self.ui_elements['panel']) self.ui_elements['hs_mountain'] = UIHorizontalSlider( h_sl_rect, h_sl_sel, h_sl_ops, self.gui, self.ui_elements['panel']) # buttons button_rect = Rect(0, 0, 200, get_param('element_height')) button_rect.centerx = panel_rect.w // 2 button_rect.y = label_rect.bottom + get_param('element_padding') self.ui_elements['btn_preview'] = UIButton(button_rect, "Generate Preview", self.gui, self.ui_elements['panel']) button_rect.w = 200 button_rect.y += get_param('element_height') + get_param( 'element_padding') button_rect.centerx = (panel_rect.w // 2) - 100 self.ui_elements['btn_back'] = UIButton(button_rect, "Back", self.gui, self.ui_elements['panel']) # the apply button always starts off disabled button_rect.centerx = (panel_rect.w // 2) + 100 self.ui_elements['btn_next'] = UIButton(button_rect, "Next", self.gui, self.ui_elements['panel']) pv_rect = Rect(0, 0, 300, 300) pv_rect.centerx = panel_rect.w // 2 pv_rect.y = button_rect.bottom + get_param('element_padding') self.ui_elements['pv_image'] = UIImage(pv_rect, self.pv_img, self.gui, self.ui_elements['panel'])
def __init__(self, gui) -> None: """ Creates a button with attributes Note: If colour is none then the button is invisible on_click is a function that will exectute when the button has been pressed """ self.gui = gui # Title self.title_rect = Rect(120, self.gui.height // 8, self.gui.width // 2, self.gui.width // 2 * 244 / 925) self.title_rect.centerx = self.gui.width // 2 self.game_title = pygame.image.load('assets/A45.png').convert_alpha() self.game_title = pygame.transform.smoothscale( self.game_title, self.title_rect.size) # Start 2 Player Button two_player_rect = Rect(0, 0, 200, 50) two_player_rect.centerx = self.gui.width // 2 two_player_rect.centery = self.gui.height // 2 - 50 two_player_button = Button(two_player_rect, self.gui.start_game_two_player, (255, 255, 255), '2 Player') # Start AI Easy Button easy_rect = Rect(0, 0, 200, 50) easy_rect.centerx = self.gui.width // 2 easy_rect.centery = self.gui.height // 2 + 50 easy_button = Button(easy_rect, self.gui.start_game_easy, (255, 255, 255), 'Easy AI') # Start AI Hard Button hard_rect = Rect(0, 0, 200, 50) hard_rect.centerx = self.gui.width // 2 hard_rect.centery = self.gui.height // 2 + 150 hard_button = Button(hard_rect, self.gui.start_game_hard, (255, 255, 255), 'Hard AI') # Quit Button end_rect = Rect(0, 0, 200, 50) end_rect.centerx = self.gui.width // 2 end_rect.centery = self.gui.height // 2 + 250 end_game_button = Button(end_rect, self.gui.end_game, (255, 255, 255), 'Quit Game') self.buttons = [] self.buttons.append(two_player_button) self.buttons.append(easy_button) self.buttons.append(hard_button) self.buttons.append(end_game_button)