我正在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
我不确定代码中什么不起作用,因为它不会返回错误。有人可以指出我正确的方向吗?
答案 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)
...