This commit is contained in:
bridge
2025-10-02 23:04:15 +08:00
parent bdb1d7fec7
commit 2ad784dd24
5 changed files with 49 additions and 30 deletions

View File

@@ -1,6 +1,29 @@
from typing import List
def _wrap_text_by_pixels(font, text: str, max_width_px: int) -> List[str]:
"""
按像素宽度对单行文本进行硬换行,适配中英文混排(逐字符测量)。
"""
if not text:
return [""]
lines: List[str] = []
current = ""
for ch in str(text):
test = current + ch
w, _ = font.size(test)
if w <= max_width_px:
current = test
else:
if current:
lines.append(current)
# 新行从当前字符开始
current = ch
if current:
lines.append(current)
return lines
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
@@ -23,15 +46,18 @@ def draw_sidebar(pygame_mod, screen, colors, font, events: List[object],
(sidebar_x + sidebar_width - 10, line_y), 1)
event_y = line_y + 15
max_events = (screen.get_height() - event_y - margin) // 20
recent_events = events[-max_events:] if len(events) > max_events else events
for event in reversed(recent_events):
# 预留左右边距各10px
usable_width = sidebar_width - 20
# 从最新事件开始,逐条向下渲染,超出底部则停止
for event in reversed(events):
event_text = str(event)
if len(event_text) > 35:
event_text = event_text[:32] + "..."
event_surf = font.render(event_text, True, colors["event_text"])
screen.blit(event_surf, (title_x, event_y))
event_y += 20
wrapped_lines = _wrap_text_by_pixels(font, event_text, usable_width)
for line in wrapped_lines:
event_surf = font.render(line, True, colors["event_text"])
screen.blit(event_surf, (title_x, event_y))
event_y += event_surf.get_height() + 2
if event_y > screen.get_height() - margin:
break
if event_y > screen.get_height() - margin:
break