Cómo hacer que una imagen crezca de tamaño con pygame [duplicar]

Jan 03 2021

En un juego que estoy haciendo, tengo una imagen que necesito escalar de (old_width, old_height) a (new_width, new_height), para que parezca que está creciendo más, y necesito hacerlo varias veces durante el juego. .

Hasta ahora, lo he intentado con pygame.trasform.smoothscale, pero por algunas razones todo lo que hace es mover la imagen a lo largo de la pantalla hacia la esquina derecha.

Me parece muy extraño, porque no entiendo lo que está pasando.

Aquí está la clase que maneja la imagen:

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

Y aquí es donde se llama el método grow. Eliminé todo el resto que es superfluo para esta pregunta, por lo que, en teoría, la imagen debería crecer sin cesar en este punto:

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)

Bueno, no es así y no tengo ni idea de por qué sucede esto. ¿Alguien sabe lo que estoy haciendo mal aquí?

Respuestas

2 hippozhipos Jan 03 2021 at 07:49

La imagen no se mueve realmente. Puede parecer que se está moviendo hacia la esquina inferior derecha porque se está haciendo más grande, es decir, su ancho y alto están aumentando, lo que recuerda, comienza en la esquina superior izquierda de la imagen. Ahí es donde también se dibuja. Entonces, para que parezca que está creciendo, puede compensar donde se dibuja la mitad del ancho y la altura, lo que básicamente significa compensarlo para que se dibuje en el centro. Reemplazar

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

con

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

Ejemplo de trabajo

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

El segundo argumento de blitpuede ser un rectángulo. Utilice un pygame.Rectobjeto para escalar una imagen con respecto a su centro:

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)

Véase también Transformar escala y superficie de zoom.