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

时间:2019-10-15 00:37:48

标签: python pygame sprite

我正在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 个答案:

答案 0 :(得分:2)

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

if my_sprite == normal():

是说“是我现有的sprite对象==这个新的sprite对象”,这是永远不会正确的。您可以使用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 )

答案 1 :(得分:0)

我发现一种解决方法有点多余,但是可以在有更多组的情况下进行扩展

这需要创建两个可以拉回的组和第四个组,并将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)
     ...