From 45498662f9a9dee9a281d98ac0860f9c34abe352 Mon Sep 17 00:00:00 2001 From: bridge Date: Sat, 4 Oct 2025 15:04:21 +0800 Subject: [PATCH] fix front border --- src/front/app.py | 16 ++++++++++++++-- src/front/events_panel.py | 11 ++++++++--- src/front/rendering.py | 34 ++++++++++++++++++++-------------- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/front/app.py b/src/front/app.py index 8cd30ca..57c2362 100644 --- a/src/front/app.py +++ b/src/front/app.py @@ -15,6 +15,7 @@ from .rendering import ( draw_tooltip_for_avatar, draw_tooltip_for_region, draw_status_bar, + STATUS_BAR_HEIGHT, ) from .events_panel import draw_sidebar @@ -50,7 +51,7 @@ class Front: pygame.font.init() width_px = self.world.map.width * tile_size + margin * 2 + sidebar_width - height_px = self.world.map.height * tile_size + margin * 2 + height_px = self.world.map.height * tile_size + margin * 2 + STATUS_BAR_HEIGHT self.screen = pygame.display.set_mode((width_px, height_px)) pygame.display.set_caption(window_title) @@ -120,7 +121,16 @@ class Front: def _render(self): pygame = self.pygame self.screen.fill(self.colors["bg"]) - draw_map(pygame, self.screen, self.colors, self.world, self.tile_images, self.tile_size, self.margin) + draw_map( + pygame, + self.screen, + self.colors, + self.world, + self.tile_images, + self.tile_size, + self.margin, + STATUS_BAR_HEIGHT, + ) hovered_region = draw_region_labels( pygame, self.screen, @@ -129,6 +139,7 @@ class Front: self._get_region_font, self.tile_size, self.margin, + STATUS_BAR_HEIGHT, ) self._assign_avatar_images() hovered_avatar = draw_avatars_and_pick_hover( @@ -140,6 +151,7 @@ class Front: self.tile_size, self.margin, self._get_display_center, + STATUS_BAR_HEIGHT, ) # 先绘制状态栏和侧边栏,再绘制 tooltip 保证 tooltip 在最上层 draw_status_bar(pygame, self.screen, self.colors, self.status_font, self.margin, self.world, self._auto_step) diff --git a/src/front/events_panel.py b/src/front/events_panel.py index b47d984..58eb35f 100644 --- a/src/front/events_panel.py +++ b/src/front/events_panel.py @@ -1,4 +1,5 @@ from typing import List +from .rendering import STATUS_BAR_HEIGHT def _wrap_text_by_pixels(font, text: str, max_width_px: int) -> List[str]: @@ -27,10 +28,14 @@ def _wrap_text_by_pixels(font, text: str, max_width_px: int) -> List[str]: def draw_sidebar(pygame_mod, screen, colors, font, events: List[object], world_map, tile_size: int, margin: int, sidebar_width: int): sidebar_x = world_map.width * tile_size + margin * 2 - sidebar_y = margin + sidebar_y = margin + STATUS_BAR_HEIGHT - sidebar_rect = pygame_mod.Rect(sidebar_x, sidebar_y, sidebar_width, - screen.get_height() - margin * 2) + sidebar_rect = pygame_mod.Rect( + sidebar_x, + sidebar_y, + sidebar_width, + screen.get_height() - sidebar_y - margin, + ) pygame_mod.draw.rect(screen, colors["sidebar_bg"], sidebar_rect) pygame_mod.draw.rect(screen, colors["sidebar_border"], sidebar_rect, 2) diff --git a/src/front/rendering.py b/src/front/rendering.py index 8452a2f..f0b0072 100644 --- a/src/front/rendering.py +++ b/src/front/rendering.py @@ -5,33 +5,36 @@ from src.classes.tile import TileType from src.utils.text_wrap import wrap_text from src.classes.relation import Relation +# 顶部状态栏高度(像素) +STATUS_BAR_HEIGHT = 32 -def draw_grid(pygame_mod, screen, colors, map_obj, ts: int, m: int): + +def draw_grid(pygame_mod, screen, colors, map_obj, ts: int, m: int, top_offset: int = 0): grid_color = colors["grid"] for gx in range(map_obj.width + 1): - start_pos = (m + gx * ts, m) - end_pos = (m + gx * ts, m + map_obj.height * ts) + start_pos = (m + gx * ts, m + top_offset) + end_pos = (m + gx * ts, m + top_offset + map_obj.height * ts) pygame_mod.draw.line(screen, grid_color, start_pos, end_pos, 1) for gy in range(map_obj.height + 1): - start_pos = (m, m + gy * ts) - end_pos = (m + map_obj.width * ts, m + gy * ts) + start_pos = (m, m + top_offset + gy * ts) + end_pos = (m + map_obj.width * ts, m + top_offset + gy * ts) pygame_mod.draw.line(screen, grid_color, start_pos, end_pos, 1) -def draw_map(pygame_mod, screen, colors, world, tile_images, ts: int, m: int): +def draw_map(pygame_mod, screen, colors, world, tile_images, ts: int, m: int, top_offset: int = 0): map_obj = world.map for y in range(map_obj.height): for x in range(map_obj.width): tile = map_obj.get_tile(x, y) tile_image = tile_images.get(tile.type) if tile_image: - pos = (m + x * ts, m + y * ts) + pos = (m + x * ts, m + top_offset + y * ts) screen.blit(tile_image, pos) else: color = (80, 80, 80) - rect = pygame_mod.Rect(m + x * ts, m + y * ts, ts, ts) + rect = pygame_mod.Rect(m + x * ts, m + top_offset + y * ts, ts, ts) pygame_mod.draw.rect(screen, color, rect) - draw_grid(pygame_mod, screen, colors, map_obj, ts, m) + draw_grid(pygame_mod, screen, colors, map_obj, ts, m, top_offset) def calculate_font_size_by_area(tile_size: int, area: int) -> int: @@ -40,7 +43,7 @@ def calculate_font_size_by_area(tile_size: int, area: int) -> int: return max(16, min(40, base + growth)) -def draw_region_labels(pygame_mod, screen, colors, world, get_region_font, tile_size: int, margin: int): +def draw_region_labels(pygame_mod, screen, colors, world, get_region_font, tile_size: int, margin: int, top_offset: int = 0): ts = tile_size m = margin mouse_x, mouse_y = pygame_mod.mouse.get_pos() @@ -52,7 +55,7 @@ def draw_region_labels(pygame_mod, screen, colors, world, get_region_font, tile_ continue center_x, center_y = region.center_loc screen_x = m + center_x * ts + ts // 2 - screen_y = m + center_y * ts + ts // 2 + screen_y = m + top_offset + center_y * ts + ts // 2 font_size = calculate_font_size_by_area(tile_size, region.area) region_font = get_region_font(font_size) text_surface = region_font.render(str(name), True, colors["text"]) @@ -68,9 +71,9 @@ def draw_region_labels(pygame_mod, screen, colors, world, get_region_font, tile_ return hovered_region -def avatar_center_pixel(avatar: Avatar, tile_size: int, margin: int) -> Tuple[int, int]: +def avatar_center_pixel(avatar: Avatar, tile_size: int, margin: int, top_offset: int = 0) -> Tuple[int, int]: px = margin + avatar.pos_x * tile_size + tile_size // 2 - py = margin + avatar.pos_y * tile_size + tile_size // 2 + py = margin + top_offset + avatar.pos_y * tile_size + tile_size // 2 return px, py @@ -83,6 +86,7 @@ def draw_avatars_and_pick_hover( tile_size: int, margin: int, get_display_center: Optional[Callable[[Avatar, int, int], Tuple[float, float]]] = None, + top_offset: int = 0, ) -> Optional[Avatar]: mouse_x, mouse_y = pygame_mod.mouse.get_pos() hovered = None @@ -93,6 +97,7 @@ def draw_avatars_and_pick_hover( cx, cy = int(cx_f), int(cy_f) else: cx, cy = avatar_center_pixel(avatar, tile_size, margin) + cy += top_offset avatar_image = avatar_images.get(avatar_id) if avatar_image: image_rect = avatar_image.get_rect() @@ -223,7 +228,7 @@ def draw_year_month_info(pygame_mod, screen, colors, font, margin: int, guide_wi def draw_status_bar(pygame_mod, screen, colors, font, margin: int, world, auto_step: bool): status_y = 8 - status_height = 32 + status_height = STATUS_BAR_HEIGHT status_rect = pygame_mod.Rect(0, 0, screen.get_width(), status_height) pygame_mod.draw.rect(screen, colors["status_bg"], status_rect) pygame_mod.draw.line(screen, colors["status_border"], @@ -239,6 +244,7 @@ __all__ = [ "draw_tooltip_for_avatar", "draw_tooltip_for_region", "draw_status_bar", + "STATUS_BAR_HEIGHT", ]