Масштабирование размера спрайта

#python #pygame

#python #pygame

Вопрос:

У меня есть спрайты, бегающие по симулятору.

 class guys(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("/Users/taiji/Desktop/Sim/images/guys.png")
        self.original_image = self.image
        self.surf = pygame.Surface((50, 30))
        pos = (random.uniform(0,SCREEN_WIDTH), random.uniform(0,300))
        self.rect = self.surf.get_rect(center = pos)
  

Я хотел бы уменьшить их размер с (50, 30) до (5, 3). Позже я заставлю их расти на основе энергии, поэтому я изменю это (5, 3) на что-то другое, но сейчас я просто пытаюсь разобраться с основами. Я попробовал это:

 def grow(sprites):
    for entity in sprites:
        pygame.transform.scale(entity.surf, (5, 3))
  

Но они вообще не изменились. Может кто-нибудь помочь мне с этим? Нужно ли мне что-либо делать с entity.rect, чтобы столкновения все еще были в порядке?

Спасибо за помощь!

Ответ №1:

Это происходит потому pygame.transform.scale() , что не работает на месте. Это можно решить, назначив поверхность для вывода функции, например:

 entity.surf = pygame.transform.scale(entity.surf, (5, 3))
  

В качестве примечания, этот метод считается разрушительным, и, следовательно, масштабирование, скорее всего, приведет к тому, что спрайты станут неузнаваемыми. Один из способов решить эту проблему — сохранить исходный спрайт (как, кажется, вы уже сделали self.original_image ) и просто установить для нового спрайта масштабированную версию этого оригинала.

Комментарии:

1. Я не уверен, что понимаю это, извините (хотя спасибо за помощь!) Я изменил код на это: « def grow(sprites): для сущности в спрайтах: entity.surf = pygame.transform.scale(entity.surf, (5, 3)) ` И я убедился, что он вызывается в группе, но они все того же размера. Я что-то не так понял?

2. @taijifajin Вы впоследствии перерисовываете масштабированные поверхности?

3. @taijifajin Спрайт PyGame всегда будет отображаться sprite.image , поэтому измените все вхождения sprite.surf на sprite.image .

4. @bbnumber2 У меня draw является последней функцией в основном коде игры.

5. @Kingsley Я только что попробовал это, иногда они возвращаются к нормальному размеру, но в остальном они маленькие. Вы знаете, как остановить мерцание? Является ли их размер прямоугольника новым, меньшим размером или мне нужно что-то с этим делать?