Как масштабировать изображения до размера экрана в Pygame

Мне было интересно, как бы я решил масштабировать размер изображений в проектах pygame до разрешения экрана. Например, предусмотрите следующий сценарий, предполагающий оконный режим отображения на данный момент; Я предполагаю, что полный экран будет таким же:

  • У меня есть фоновое изображение 1600x900, которое, конечно, отображается изначально в окне 1600x900

  • В окне 1280x720 я могу, очевидно, просто масштабировать эти образы "rect" до 1280x720

  • Что произойдет, однако, если мне нужно добавить, скажите 300x300 px изображение в x,y 1440,860 (размеры примера), размер которого соответствует исходному фону 1600x900? Конечно, для 1600x900 я могу, конечно, использовать изображение изначально, но как насчет размеров меньшего/большего размера?

В принципе, как мне масштабировать изображения до размера окна, а затем размещать их соответственно? Я предполагаю, что должен быть ДЕЙСТВИТЕЛЬНО простой автоматизированный метод, но прямо сейчас я не могу понять это и, честно говоря, не успел его найти...

Спасибо заранее, Ilmiont

Ответы

Ответ 1

Вы можете масштабировать изображение с помощью pygame.transform.scale:

import pygame
picture = pygame.image.load(filename)
picture = pygame.transform.scale(picture, (1280, 720))

Затем вы можете получить ограничивающий прямоугольник picture с помощью

rect = picture.get_rect()

и переместите изображение с помощью

rect = rect.move((x, y))
screen.blit(picture, rect)

где screen был установлен с чем-то вроде

screen = pygame.display.set_mode((1600, 900))

Чтобы позволить вашим виджетам настраиваться на различные размеры экрана, вы можете сделать отображение изменяемый:

import os
import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((500, 500), HWSURFACE | DOUBLEBUF | RESIZABLE)
pic = pygame.image.load("image.png")
screen.blit(pygame.transform.scale(pic, (500, 500)), (0, 0))
pygame.display.flip()
while True:
    pygame.event.pump()
    event = pygame.event.wait()
    if event.type == QUIT:
        pygame.display.quit()
    elif event.type == VIDEORESIZE:
        screen = pygame.display.set_mode(
            event.dict['size'], HWSURFACE | DOUBLEBUF | RESIZABLE)
        screen.blit(pygame.transform.scale(pic, event.dict['size']), (0, 0))
        pygame.display.flip()

Ответ 2

Если вы масштабируете 1600x900 до 1280x720, у вас есть

scale_x = 1280.0/1600
scale_y = 720.0/900

Чем вы можете использовать его, чтобы найти размер кнопки и положение кнопки

button_width  = 300 * scale_x
button_height = 300 * scale_y

button_x = 1440 * scale_x
button_y = 860  * scale_y

Если вы масштабируете 1280x720 до 1600x900, у вас есть

scale_x = 1600.0/1280
scale_y = 900.0/720

и остальное то же самое.


Я добавляю .0 в значение float - иначе scale_x, scale_y будет округлено до integer - в этом примере до 0 (ноль) (Python 2.x)