Comment faire grossir une image avec pygame [duplicate]
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
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()
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