/
Vibek
/
First_Game
Обзор
Документация
Войти
/
Vibek
/
First_Game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
core/display_manager.py
71 строка
3 KB
Vibek
все перменные перенесены в конфиг, отрисовка динамическая
21 июн 2026, 20:32
21 июн 2026, 20:32
f32a834
Код
Авторство
О чём код?
"""Масштабирование design-space холста на окно с uniform scale и letterbox.""" from __future__ import annotations import pygame from pygame.math import Vector2 from core.config import Config class DisplayManager: """ Виртуальный холст фиксированного design-размера. Present масштабирует его на физическое окно с сохранением пропорций. """ def __init__(self, design_width: int, design_height: int) -> None: self.design_width = design_width self.design_height = design_height self.design_size = (design_width, design_height) self.game_surface = pygame.Surface(self.design_size) self.window_width = design_width self.window_height = design_height self.scale = 1.0 self.offset_x = 0 self.offset_y = 0 def update_layout(self, window_size: tuple[int, int]) -> None: """Пересчитывает uniform scale и letterbox-offset после resize/fullscreen.""" self.window_width, self.window_height = window_size scale_x = self.window_width / self.design_width scale_y = self.window_height / self.design_height self.scale = min(scale_x, scale_y) scaled_w = max(1, int(self.design_width * self.scale)) scaled_h = max(1, int(self.design_height * self.scale)) self.offset_x = (self.window_width - scaled_w) // 2 self.offset_y = (self.window_height - scaled_h) // 2 def present(self, screen: pygame.Surface) -> None: """Рисует масштабированный холст по центру окна с чёрными полями.""" scaled_w = max(1, int(self.design_width * self.scale)) scaled_h = max(1, int(self.design_height * self.scale)) scaled = pygame.transform.smoothscale(self.game_surface, (scaled_w, scaled_h)) screen.fill(Config.BLACK) screen.blit(scaled, (self.offset_x, self.offset_y)) def window_to_design(self, pos: tuple[int, int] | Vector2) -> Vector2: """Преобразует координаты окна в design-space (для мыши).""" if isinstance(pos, Vector2): wx, wy = pos.x, pos.y else: wx, wy = pos if self.scale <= 0: return Vector2(0, 0) dx = (wx - self.offset_x) / self.scale dy = (wy - self.offset_y) / self.scale return Vector2(dx, dy) def design_to_window(self, pos: tuple[int, int] | Vector2) -> Vector2: """Преобразует design-space координаты в координаты окна.""" if isinstance(pos, Vector2): dx, dy = pos.x, pos.y else: dx, dy = pos return Vector2( self.offset_x + dx * self.scale, self.offset_y + dy * self.scale, )