Comment faire grossir une image avec pygame [duplicate]

Jan 03 2021

Dans un jeu que je suis en train de créer, j'ai une image que je dois faire évoluer de (old_width, old_height) à (new_width, new_height), de sorte qu'il semble qu'elle s'agrandisse, et je dois le faire plusieurs fois pendant le jeu .

Jusqu'à présent, j'ai essayé avec pygame.trasform.smoothscale, mais pour certaines raisons, il ne fait que déplacer l'image le long de l'écran vers le coin droit.

Cela me semble très étrange, car je ne comprends pas ce qui se passe.

Voici la classe qui gère l'image:

class GrowingImage:

    def __init__(self, image_path, x, y, width, height):
        self.width = width
        self.height = height

        self.object_image = pygame.image.load(image_path)

        self.image = pygame.transform.scale(self.object_image, (self.width, self.height))

        self.x_pos = x
        self.y_pos = y

    def draw(self, background):
        background.blit(self.image, (self.x_pos, self.y_pos))

    def grow(self):
        self.image = pygame.transform.smoothscale(self.object_image, (self.width, self.height))
        self.width += 1
        self.height += 1

Et c'est là que s'appelle la méthode Grow. J'ai supprimé tout le reste qui est superflu pour cette question, donc théoriquement l'image devrait grandir sans fin à ce stade:

image = GrowingImage('image.png', 400, 100, 405, 640)

while not is_game_over:
    for event in pygame.event.get():
        # Bunch of stuffs

     # Redraw the screen
     self.game_screen.fill(WHITE_COLOR)
     image.grow()
     image.draw()

     # Display the screen
     pygame.display.update()

     # Tick the clock to update everything within the game.
     clock.tick(self.TICK_RATE)

Eh bien, ce n'est pas le cas et je ne sais absolument pas pourquoi cela se produit. Quelqu'un sait ce que je fais de mal ici?

Réponses

2 hippozhipos Jan 03 2021 at 07:49

L'image ne bouge pas vraiment. Cela peut ressembler à son déplacement vers le coin inférieur droit parce qu'il s'agrandit, c'est-à-dire que sa largeur et sa hauteur augmentent, ce qui, rappelez-vous, commence dans le coin supérieur gauche de l'image. C'est aussi là que ça se dessine. Donc, pour le faire ressembler à sa croissance, vous pouvez décaler là où il est dessiné ma moitié de la largeur et de la hauteur, ce qui signifie essentiellement le décaler pour qu'il soit dessiné au centre. Remplacer

background.blit(self.image, (self.x_pos, self.y_pos))

avec

background.blit(self.image, (self.x_pos - (self.width/2), self.y_pos - (self.height/2)))

Exemple de travail

import pygame

class GrowingImage:

    def __init__(self, image_path, x, y, width, height):
        self.width = width
        self.height = height

        self.object_image = image_path

        self.image = pygame.transform.scale(self.object_image, (self.width, self.height))

        self.x_pos = x
        self.y_pos = y

    def draw(self, background):
        background.blit(self.image, (self.x_pos - (self.width/2), self.y_pos - (self.height/2)))

    def grow(self):
        self.image = pygame.transform.smoothscale(self.object_image, (self.width, self.height))
        self.width += 1
        self.height += 1


pygame.init()

d = pygame.display.set_mode((600, 600))
image = pygame.Surface((1, 1))
growingImage = GrowingImage(image, 300, 300, 20, 20)

while True:
    d.fill((255, 255, 255))
    pygame.event.get()

    growingImage.draw(d)
    growingImage.grow()

    pygame.display.update()
    
1 Rabbid76 Jan 03 2021 at 15:34

Le 2ème argument de blitpeut être un rectangle. Utilisez un pygame.Rectobjet pour mettre à l'échelle une image par rapport à son centre:

class GrowingImage:

    def __init__(self, image_path, x, y, width, height):
        
        self.object_image = pygame.image.load(image_path)
        self.image = pygame.transform.scale(self.object_image, (self.width, self.height))

        self.rect = self.image.get_rect(topleft = (x, y))

    def draw(self, background):
        background.blit(self.image, self.rect)

    def grow(self):
    
        w = self.rect.width + 1
        h = self.rect.height + 1
        self.image = pygame.transform.smoothscale(self.object_image, (w, h))
        
        self.rect = self.image.get_rect(center = self.rect.center)

Voir aussi Transformer l'échelle et zoomer la surface