有没有办法改变 my_sprite 或 my_group 来改变显示的动画?

Is there a way to change my_sprite or my_group to change the animation displayed?

我正在 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

我不确定我的代码中到底有什么问题,因为它不会返回错误。有人能指出我正确的方向吗?

它不起作用,因为当代码调用 normal() 时,它正在创建对象的新 实例 。所以调用:

if my_sprite == normal():

是在说 "is my existing sprite object == this new sprite object",这绝不是真的。您可以使用对象的 python 函数到 type() 来做同样的事情,或者添加您自己的类型函数,正如我在下面的代码中所展示的那样。

我会在 class 中跟踪 精灵的状态,并使用一些函数 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 )

我找到了一个有点多余的解决方法,但它可以在有更多组的情况下扩展它

需要做两个可以拉回来的组和第四个,把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)
     ...