Есть ли способ изменить my_sprite или my_group, чтобы изменить отображаемую анимацию? - PullRequest
1 голос
/ 15 октября 2019

Я делаю анимированные спрайты в Pygame, и вы хотели бы помочь найти способ переключаться с одного на другое? Текущий код выглядит примерно так:

class normal(pygame.sprite.Sprite):
  def __init__(self):
    #etc, list of images to create the animation

class tall(pygame.sprite.Sprite):
  def __init__(self):
    #rinse and repeat with a different set of images

У меня уже есть идея, как вызвать изменение с помощью нажатия клавиши. Но я не уверен, какую переменную изменить и на какую. Когда я пытаюсь изменить следующий код, ничего не происходит

fps = 25
pygame.init()
my_sprite = normal()
my_group = pygame.sprite.Group(my_sprite)

#etc until we get to the part where it changes

    if event.type == pygame.KEYDOWN:
      if event.key == pygame.K_RETURN:
        if my_sprite == normal():
          my_sprite = tall()
          fps = 30
        else:
          my_sprite = normal()
          fps = 25

Я не совсем уверен, что не работает в моем коде, так как он не возвращается с ошибкой. Может ли кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Это не работает, потому что когда код вызывает normal(), это создает новый экземпляр объекта. Таким образом, вызов:

if my_sprite == normal():

говорит «это мой существующий объект спрайта == этот новый объект спрайта», что никогда не соответствует действительности. Вы можете использовать функцию python для type() объекта, чтобы сделать то же самое, или добавить свою собственную функцию типа, как я представил в коде ниже.

Я бы отслеживал состояние спрайта внутри класса и некоторые функции grow() и shrink() используются для автоматического изменения размера.

class GrowingSprite( pygame.sprite.Sprite, x, y ):
    def __init__( self ):
        #etc, list of images to create the animation
        self.image_short  = ... # load "short" image
        self.image_tall   = ... # load "tall" image
        # Set the initial state
        self.image        = self.image_short       # start short
        self.rect         = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y
        self.state        = 'short' 

    def getState( self ):
        return self.state

    def grow( self ):
        self.state = 'tall'
        self.image = self.image_tall
        current_x  = self.rect.centerx     # preserve existing location
        current_y  = self.rect.centery
        self.rect  = self.image.get_rect()
        self.rect.center = ( current_x, current_y )

    def shrink( self ):
        self.state = 'short'
        self.image = self.image_short
        current_x = self.rect.centerx      # preserve existing location
        current_y = self.rect.centery
        self.rect = self.image.get_rect()
        self.rect.center = ( current_x, current_y )
0 голосов
/ 15 октября 2019

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

Требуется создать две группы, которые можно откатить назад и четвертую, и изменить foo.draw(screen) в новую группу. Вот так это выглядит

nml_sprite = normal()
tal_sprite = tall()
tg = 1 #this is nothing more than a switch to trigger the change
tal_group = pygame.sprite.Group(tal_sprite)
nml_group = pygame.sprite.Group(nml_sprite)
cursprite = nml_group #this variable determines which sprite set is loaded
  ...
      ...
        if event.key == pygame.K_RETURN:
          if tg == 1:
            curspt = tal_group
            tg = 2
          else:
            curspt = nml_group
            tg = 2
         ...
       ...
     nml_group.update()
     tal_group.update()
     curspt.draw(screen)
     ...
...