pygame: как отобразить полноэкранный режим без обрезания краев

#pygame #fullscreen

#pygame #полноэкранный режим

Вопрос:

Моя игра разработана для работы с соотношением отображения 16: 9.

Однако на мониторе моего компьютера нет дисплея с разрешением 16: 9. Итак, я пробовал различные методы, чтобы указать pygame растянуть окно игры до полноэкранного режима, и я столкнулся с различными проблемами, такими как:

1- Экран становится черным, и мой монитор выдает: «несоответствие разрешения».

2- Окно игры растягивается до нужного размера, и это портит графику.

3. Края экрана обрезаются, это КРАЙНЕ неприемлемо, поскольку это поставило бы некоторых игроков в невыгодное положение относительно того, какую часть игрового поля они могут видеть!

Я хочу, чтобы pygame отображал игру в полноэкранном режиме без обрезания краев…Я хочу, чтобы он добавлял черные полосы для эфира сверху и снизу или, при необходимости, по левому и правому краям экрана — в зависимости от монитора игрока.

Заранее спасибо!

(И, честно говоря, я не могу поверить, что у меня столько проблем с тем, что должно быть простой командой, но я нигде не могу найти ответы!)

Комментарии:

1. Не могли бы вы добавить несколько вещей, которые вы уже пробовали? Это может помочь определить, откуда исходит проблема.

2. Извините, но я почти уверен, что показ моего кода не поможет. Если бы кто-нибудь мог просто показать мне работающий код, я был бы готов!

Ответ №1:

Вот как можно масштабировать экран, чтобы он соответствовал любому монитору, сохраняя при этом соотношение сторон.

Сначала вы должны использовать этот код (или аналогичный), чтобы вычислить, до какого размера нужно масштабировать экран:

 import pygame
pygame.init()
infostuffs = pygame.display.Info() # gets monitor info

monitorx, monitory = infostuffs.current_w, infostuffs.current_h # puts monitor length and height into variables

dispx, dispy = <insert what you want your display length to be>, <and height>

if dispx > monitorx: # scales screen down if too long
    dispy /= dispx / monitorx
    dispx = monitorx
if dispy > monitory: # scales screen down if too tall
    dispx /= dispy / monitory
    dispy = monitory

dispx = int(dispx) # So your resolution does not contain decimals
dispy = int(dispy)
  

Это дает вам значения dispx и dispy, которые представляют собой размеры, до которых вы должны масштабировать свой дисплей в каждом цикле, прежде чем обновлять дисплей. Также, просто чтобы предупредить вас, я не смог протестировать этот код.Если что-то не так, пожалуйста, скажите мне в комментариях, чтобы я мог это исправить.

РЕДАКТИРОВАТЬ: Добавлены еще две строки кода.

Комментарии:

1. Я попробовал ваш код, и теперь я получаю сообщение об ошибке, которое гласит: «ожидается целочисленный аргумент, получено значение float»

2. Это потому, что в Pygame есть определенные функции, для которых требуются целые числа, а не числа с плавающей точкой. Масштабирование изображений является одним из них, поэтому вам следует преобразовать значения в целые числа. Спасибо, что указали на это, я отредактировал вопрос.

Ответ №2:

Я не пробовал это, но мой подход был бы:

 1. 16 / 9 ~= 1.778
2. `pygame.init()` ; `scr = pygame.display.Info()` ; `win_size = width, height = scr.current_w, scr.current_h` should give the display width and height.
3. Multiply height by 1.778, `x = int(height * 1.778)`.
4. If x < width, then width = x.
5. If not, then divide width by 1.7788, `y = int(width / 1.778)`. Now, height = y
6. `win_size = width, height` ; `screen = pygame.display.set_mode(win_size, FULLSCREEN)`
7. Scale and center align your graphics to fit.