Хорошо, поэтому для анимации вам понадобится куча изображений и таймер.
Я представляю некоторые фрагменты кода, основанные на спрайте Pygame. Возможно, это не совсем подходит к вопросу, но кажется, что это лучшее решение, чем рисовать / перетягивать изображения вручную.
Итак, сначала код начинается с класса спрайта:
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()
, обычный механизм обновления для спрайтов обрабатывает текущее «состояние» инопланетного спрайта, 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 миллисекундами между каждым кадром. Чтобы запустить анимацию спрайта, просто наберите 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, но я не сделал этого, чтобы упростить пример.