Pygame. Как мне изменить размер моего изображения рыбного плеера каждый раз, когда он ест рыбу?

#python #pygame #pygame-surface

#python #pygame #pygame-поверхность

Вопрос:

Я пытаюсь сделать свою рыбу больше каждый раз, когда она ест рыбу, но я не уверен, почему она не работает, это то, что я сделал

все остальное работает, но моя высота или ширина игрока не суммирует видео

 # our main loop
runninggame = True
while runninggame:
    clock.tick(fps)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            runninggame = False

         #[...........]
    for blac in blacs:
        if playerman.rect.colliderect(blac.rect):
            playerman.width  = 10
            playerman.height  = 10
            blac.x = 880
  

Мой полный код:
https://pastebin.com/iL5h4fst

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

1. playerman является экземпляром класса player (вы должны использовать это Player с большой буквы для правильного стиля Python PEP-8). Когда вы изменяете playerman.width = 10 и .height , это лучший стиль для создания метода resize(new_width, new_height) , а не для доступа к переменным-членам экземпляра, как вы это делаете. Можете ли вы провести подобный рефакторинг, перезапустить его и сообщить нам, происходит ли это по-прежнему? (с таким же успехом можно было бы ввести подробный флаг resize(new_width, new_height, verbose=True) и заставить его распечатать свои аргументы, когда он будет вызван.

Ответ №1:

Вам нужно масштабировать все изображения проигрывателя pygame.transform.smoothscale() , когда размер увеличивается:

 if playerman.rect.colliderect(blac.rect):
    playerman.width  = 10
    playerman.height  = 10
    blac.x = 880
    playerman.right = [pygame.transform.scale(image, (playerman.width,playerman.height)) for image in playerman.right]
    playerman.left = [pygame.transform.scale(image, (playerman.width,playerman.height)) for image in playerman.left]
    playerman.rect = pygame.Rect(playerman.x, playerman.y, playerman.width, playerman.height)
  

Атрибуты self.width и self.height должны быть инициализированы уменьшенным размером изображений ( image.get_width()//8 соответственно image.get_height()//8 )

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

 class player:
    def __init__(self,x,y,height,width,color):
        # [...]

        self.right_original = [pygame.image.load("r"   str(i)   ".png") for i in range(1, 13)]
        self.left_original = [pygame.image.load("l"   str(i)   ".png") for i in range(1, 13)]
        self.width = self.right_original[0].get_width() / 8
        self.height = self.right_original[0].get_height() / 8
        self.scale_images()

        # [...]

    def scale_images(self):
        w, h = round(self.width), round(self.height)
        self.right = [pygame.transform.scale(image, (w, h)) for image in self.right_original]
        self.left = [pygame.transform.scale(image, (w, h)) for image in self.left_original]
        self.rect = pygame.Rect(self.x, self.y, w, h)

    def collide(self, other_rect):
        return self.rect.colliderect(other_rect)

    def grow(self, scale):
        self.width *= scale
        self.height *= scale
        self.scale_images()
  
 for blac in blacs:
    if playerman.collide(blac):
        blac.x = 880
        playerman.grow(1.1)
  

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

1. это хорошо, но gyazo.com/29bc7258e91aa195244aa2e1f3f173aa пиксели моего спрайта намного

2. @HabibIsmail Попробуйте масштабировать исходные изображения, а не масштабировать масштабированные изображения. Смотрите 2-ю часть ответа.

3. могу я спросить еще одну вещь Извините, если я вас беспокою, но я не уверен, почему моя ширина на порядок больше, чем моя высота gyazo.com / … также есть ли способ, которым я мог бы сделать так, чтобы ширина и высота моей рыбы росли медленнее, потому что, если я ставлю 1, она все равно растет с той же скоростью, что и 10.для быстрого

4. @HabibIsmail self.width и self.height должны быть инициализированы image.get_width()//8 соответственно image.get_height()//8

5. @HabibIsmail я улучшил ответ.