как сделать анимацию в Pygame - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь сделать анимацию, когда мой игрок стреляет, чтобы казалось, что он падает на землю.

Я попробовал код ниже, но это не похоже на работу. он замедляет кадры и показывает только последнее изображение моей анимации. Есть ли более простой способ анимации в 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)

Есть ли функция для создания последовательности изображений или что-то в этом роде?

1 Ответ

0 голосов
/ 16 января 2019

Хорошо, поэтому для анимации вам понадобится куча изображений и таймер.

Я представляю некоторые фрагменты кода, основанные на спрайте 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, но я не сделал этого, чтобы упростить пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...