我正在尝试制作动画,说明玩家何时被射中,以使其看起来好像跌倒了。
我尝试了下面的代码,但这似乎不起作用。它会减慢帧的播放速度,只显示动画的最后一张图像,Pygame中是否有更简单的动画制作方法?
if player2_hit_sequence == True:
stage1 = True
if stage1 == True:
game_display.blit(dying1_p2, (player2X, player2Y))
time.sleep(0.2)
stage1 = False
stage2 = True
if stage2 == True:
game_display.blit(dying2_p2, (player2X, player2Y))
time.sleep(0.2)
stage2 = False
stage3 = True
if stage3 == True:
game_display.blit(dying3_p2, (player2X, player2Y))
time.sleep(0.2)
是否具有制作图像序列或类似图像的功能?
答案 0 :(得分:1)
好的,因此对于动画,您需要一堆图像和一个计时器。
我要介绍一些基于pygame精灵的代码段。也许这并不完全适合这个问题,但是与手动绘制/涂抹图像相比,这似乎是一个更好的解决方案。
所以首先,代码以sprite类开头:
class AlienSprite(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.base_image = pygame.image.load('alien.png').convert_alpha()
self.image = self.base_image
self.rect = self.image.get_rect()
self.rect.center = ( WINDOW_WIDTH//2, WINDOW_HEIGHT//2 )
# Load warp animation
self.warp_at_time = 0
self.warp_images = []
for filename in [ "warp1.png", "warp2.png", "warp3.png" ]:
self.warp_images.append( pygame.image.load(filename).convert_alpha() )
因此,想法是Alien Sprite具有“正常”图像,但是随后当其“扭曲”(传送)时播放动画。该方法的实现是获取动画图像列表。动画开始时,子画面的image
从base_image
变为warp_images[]
的第一个。随着时间的流逝,子画面图像会先更改为下一帧,然后再转换为下一帧,最后再返回到基本图像。通过将所有这些内容嵌入到sprite update()
函数中,sprite的常规更新机制可以处理外来sprite,normal或“ warp”的当前“状态”。一旦触发了“扭曲”状态,它将在pygame主循环没有任何额外参与的情况下运行。
def update(self):
# Get the current time in milliseconds (normally I keep this in a global)
NOW_MS = int(time.time() * 1000.0)
# Did the alien warp? (and at what time)
if (self.warp_at_time > 0):
# 3 Frames of warp animation, show each for 200m
ms_since_warp_start = NOW_MS - self.warp_at_time
if ( ms_since_warp > 600 ):
# Warp complete
self.warp_at_time = 0
self.image = self.base_image # return to original bitmap
# Move to random location
self.rect.center = ( random.randrange( 0, WINDOW_WIDTH ), random.randrange( 0, WINDOW_HEIGHT ) )
else:
image_number = ms_since_warp // 200 # select the frame for this 200ms period
self.image = self.warp_images[image_number] # show that image
def startWarp(self):
# Get the current time in milliseconds (normally I keep this in a global)
NOW_MS = int(time.time() * 1000.0)
# if not warping already ...
if (self.warp_at_time == 0):
self.warp_at_time = NOW_MS
因此,首先要注意的是update()
使用时钟来知道动画开始以来经过的毫秒数。为了跟踪时间,我通常在游戏循环中设置一个全局NOW_MS
。
在精灵中,我们有3帧动画,每帧之间有200毫秒。要启动Sprite动画,只需调用startWarp()
,显然它会启动计时器。
SPRITES = pygame.sprite.Group()
alien_sprite = AlienSprite()
SPRITES.add(alien_sprite)
...
# Game Loop
done = False
while not done:
SPRITES.update()
# redraw window
screen.fill(BLACK)
SPRITES.draw(screen)
pygame.display.update()
pygame.display.flip()
if (<some condition>):
alien_sprite.startWarp() # do it
很明显,所有这些帧定时和什么都不应该是sprite类的成员变量,但是我没有这样做,只是为了使示例简单。