Cum se adaptează imaginile la dimensiunea ecranului în Pygame (Programare, Python, Imagine, Fundal, Pygame, Scalare)

Ilmiont a intrebat.

Mă întrebam cum aș putea face pentru a scala dimensiunea imaginilor în pygame proiecte la rezoluția ecranului. De exemplu, preconizez următorul scenariu, presupunând deocamdată modul de afișare în fereastră; presupun că pe ecran complet va fi la fel:

  • Am un 1600x900 imagine de fundal care, bineînțeles, se afișează în mod nativ în format 1600x900 fereastră

  • Într-o fereastră 1280x720 fereastră pot, evident, să măresc rectul acestei imagini la 1280x720

  • Ce se întâmplă, însă, dacă trebuie să adaug, să zicem, un element 300x300 px imagine la x,y 1440,860 (exemple de dimensiuni) care este dimensionată pentru a se potrivi cu imaginea originală 1600x900 fundal? Bineînțeles că pentru 1600x900 pot folosi, desigur, imaginea în mod nativ, dar cum rămâne cu dimensiunile mai mici/mari ale ferestrelor?

Practic, cum pot să adaptez imaginile la dimensiunea ferestrei și apoi să le poziționez corespunzător? Presupun că trebuie să existe o metodă automatizată FOARTE ușoară, dar în momentul de față nu reușesc să-mi dau seama și, sincer, nu am timp să o caut…

Mulțumesc anticipat,Ilmiont

2 răspunsuri
unutbu

Poți scala imaginea cu pygame.transform.scale:

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

Puteți obține apoi dreptunghiul delimitator al picture cu

rect = picture.get_rect()

și să mutați imaginea cu

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

unde screen a fost setat cu ceva de genul

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

Pentru a permite widgeturilor dvs. să se adapteze la diferite dimensiuni de ecran, ați putea să faceți ca afișajul să fie redimensionabil:

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()

Comentarii

  • Bine, am înțeles, dar dacă imaginea de fundal a fost redimensionată de la 1600×900 la 1280×720, iar imaginea unui buton de la 300×300 la ceva relativ la 1280×720-1600×900, atunci cum aș putea afla unde ar trebui plasat butonul în fereastra mai mică? Pentru că, evident, 600 de pixeli în jos, să zicem pe un ecran de 1280×720, este mai mult decât pe un ecran de 1280×900, relativ vorbind. –  > Por Ilmiont.
  • Vă referiți la modul de ajustare pentru un raport de aspect diferit? Ar trebui să calculați raportul de aspect în sine și să înmulțiți fiecare valoare de dimensiune cu factorul său. –  > Por cprn.
furas

Dacă scalați 1600x900 la 1280x720 aveți

scale_x = 1280.0/1600
scale_y = 720.0/900

Apoi îl puteți folosi pentru a găsi dimensiunea și poziția butoanelor

button_width  = 300 * scale_x
button_height = 300 * scale_y

button_x = 1440 * scale_x
button_y = 860  * scale_y

Dacă scalați 1280x720 la 1600x900 aveți

scale_x = 1600.0/1280
scale_y = 900.0/720

iar restul este la fel.


Eu adaug .0 la valoare pentru a face float – altfel scale_x, scale_y va fi rotunjită la integer – în acest exemplu la 0 (zero) (Python 2.x)

Comentarii

  • există vreun motiv pentru a nu folosi pygame.transform.scale? –  > Por rain_.