web-dev-qa-db-fra.com

Comment redimensionner les images à la taille de l'écran dans Pygame

Je me demandais comment j'allais adapter la taille des images des projets pygame à la résolution de l'écran. Par exemple, envisagez le scénario suivant en supposant pour le moment un mode d'affichage fenêtré; Je suppose que le plein écran sera le même:

  • J'ai un 1600x900 image d'arrière-plan qui s'affiche bien sûr de manière native dans un 1600x900 fenêtre

  • Dans un 1280x720 fenêtre Je peux évidemment juste redimensionner le rect de ces images à 1280x720

  • Que se passe-t-il cependant si je dois ajouter, disons un 300x300 px image à x,y 1440,860 (exemples de tailles) dont la taille correspond à l'original 1600x900 Contexte? Bien sûr, pour le 1600x900 Je peux bien sûr utiliser l'image en mode natif mais qu'en est-il des tailles de fenêtre plus petites/plus grandes?

Fondamentalement, comment mettre les images à l'échelle de la taille de la fenêtre, puis les positionner en conséquence? Je suppose qu'il doit y avoir une méthode automatisée VRAIMENT facile, mais pour l'instant je ne peux pas le comprendre et franchement, je n'ai pas le temps de le rechercher ...

Merci d'avance, Ilmiont

24
Ilmiont

Vous pouvez mettre l'image à l'échelle avec pygame.transform.scale:

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

Vous pouvez ensuite obtenir le rectangle englobant de picture avec

rect = picture.get_rect()

et déplacer l'image avec

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

screen a été défini avec quelque chose comme

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

Pour permettre à vos widgets de s'adapter à différentes tailles d'écran, vous pouvez rendre l'affichage redimensionnable :

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

Si vous mettez à l'échelle 1600x900 à 1280x720, vous avez

scale_x = 1280.0/1600
scale_y = 720.0/900

Que vous pouvez l'utiliser pour trouver la taille et la position du bouton

button_width  = 300 * scale_x
button_height = 300 * scale_y

button_x = 1440 * scale_x
button_y = 860  * scale_y

Si vous modifiez 1280x720 à 1600x900, vous avez

scale_x = 1600.0/1280
scale_y = 900.0/720

et le repos est le même.


J'ajoute .0 à valeur pour faire float - sinon scale_x, scale_y sera arrondi à integer - dans cet exemple à 0 (zéro) (Python 2.x)

6
furas