Как увеличить размер изображения с помощью pygame [дубликат]
В игре, которую я создаю, у меня есть изображение, которое мне нужно масштабировать от (old_width, old_height) до (new_width, new_height), так что кажется, что оно становится больше, и мне нужно делать это несколько раз во время игры. .
До сих пор я пробовал использовать pygame.trasform.smoothscale, но по некоторым причинам все, что он делает, это перемещает изображение по экрану в правый угол.
Мне это кажется очень странным, потому что я не понимаю, что происходит.
Вот класс, который обрабатывает изображение:
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
И здесь вызывается метод grow. Я удалил все остальное, что является лишним для этого вопроса, поэтому теоретически изображение должно бесконечно расти на этом этапе:
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)
Ну, это не так, и я абсолютно не понимаю, почему это происходит. Кто-нибудь знает, что я здесь делаю не так?
Ответы
Изображение на самом деле не движется. Может показаться, что он движется к нижнему правому углу, потому что он становится больше, то есть его ширина и высота увеличиваются, что, помните, начинается в верхнем левом углу изображения. Вот где он и нарисован. Чтобы он выглядел так, как будто он растет, вы можете сместить место, где он нарисован, на половину ширины и высоты, что в основном означает смещение, чтобы оно было нарисовано в центре. Заменять
background.blit(self.image, (self.x_pos, self.y_pos))
с участием
background.blit(self.image, (self.x_pos - (self.width/2), self.y_pos - (self.height/2)))
Рабочий пример
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()
Второй аргумент blitможет быть прямоугольником. Используйте pygame.Rectобъект, чтобы масштабировать изображение относительно его центра:
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)
См. Также Масштаб трансформации и масштабирование поверхности.