如何让我的图像在pygame中作为动画工作?

时间:2018-03-18 21:28:48

标签: python-3.x animation pygame

我已经阅读了此处发布的其他相关问题,但我似乎无法将这些答案放入我的状态机中,可在此处找到:https://github.com/Aeryes/Demented

我正在尝试使用精灵表创建动画,或者只是通过列表或词典进行迭代。到目前为止,我设法将列表中的第一个图像作为动画加载,但只要我的标志变量running = True,它就不会循环遍历4个图像的列表。相反,它将从列表中加载第一个图像并将其保留在该图像上,直到运行= False,在这种情况下,它会按预期恢复到静止图像。

以下是我的播放器类的当前代码,没有失败的动画尝试:

import pygame as pg
from settings import Music_Mixer, loadCustomFont, States, screen
from time import sleep

"""This section contains entity states which are separate from game and menu states."""
class Player():
    def __init__(self, x, y):
        self.health = 100
        self.speed = 1
        self.screen = screen
        self.imagex = x
        self.imagey = y
        self.running_right = False
        self.running_left = False
        self.rect = pg.draw.rect(self.screen, (255, 0, 0), [self.imagex, self.imagey, 20, 45])
        self.image = pg.image.load('Images/Animations/PlayerRun/Stickman_stand_still.png').convert_alpha()
        self.images = ['Images/Animations/PlayerRun/Stickman_stand_still.png', 'Images/Animations/PlayerRun/Stickman_run_1.png', 'Images/Animations/PlayerRun/Stickman_run_2.png',
        'Images/Animations/PlayerRun/Stickman_run_3.png', 'Images/Animations/PlayerRun/Stickman_run_4.png']

    #Moves the player and begins the animation phase.
    def move_player(self, speed):
        self.pressed = pg.key.get_pressed()

        #Move left and start left run animation.
        if self.pressed[pg.K_a]:
            self.imagex -= 5

        #Move right and start right run animation
        if self.pressed[pg.K_d]:
            self.running_right = True
            self.imagex += 5
        elif not self.pressed[pg.K_d]:
            self.running_right = False

        #Move up and start jump animation.
        if self.pressed[pg.K_w]:
           self.imagey -= 5

        #Move down and start either crouch.
        if self.pressed[pg.K_s]:
            self.imagey += 5

    #Animates the running movement of the player.
    def runAnim(self):

        if self.running_right:
            pass

        elif self.running_right == False:
            self.image = pg.image.load('Images/Animations/PlayerRun/Stickman_stand_still.png').convert_alpha()

    #draws the player to the screen.
    def draw_entity(self):
        screen.blit(self.image, (self.imagex, self.imagey))

我看过这里:Animation in with a list of images in Pygame

在这里:Animated sprite from few images

1 个答案:

答案 0 :(得分:2)

  • 加载图像并将其放入列表中。
  • 向类中添加索引,计时器和images(当前图像列表/动画)属性。
  • 当用户按下其中一个移动键时,请交换图像列表。
  • 要为images设置动画,首先将dtdelta time)传递给播放器的update方法,然后再传递给需要它的其他方法。增加计时器属性,并在所需的时间间隔后,递增索引并使用它来交换图像。

基本上你只需做一些事情,但也许你必须调整一些事情。

import pygame as pg


pg.init()
screen = pg.display.set_mode((640, 480))

# Load images once when the program starts. Put them into lists, so that
# you can easily swap them out when the player changes the direction.
STICKMAN_IDLE = [pg.image.load(
    'Images/Animations/PlayerRun/Stickman_stand_still.png').convert_alpha()]
# You could use a list comprehension here (look it up).
STICKMAN_RUN = [
    pg.image.load('Images/Animations/PlayerRun/Stickman_run_1.png').convert_alpha(),
    pg.image.load('Images/Animations/PlayerRun/Stickman_run_2.png').convert_alpha(),
    pg.image.load('Images/Animations/PlayerRun/Stickman_run_3.png').convert_alpha(),
    pg.image.load('Images/Animations/PlayerRun/Stickman_run_4.png').convert_alpha(),
    ]


class Player:

    def __init__(self, x, y):
        self.pos_x = x
        self.pos_y = y

        self.images = STICKMAN_IDLE
        self.image = self.images[0]
        self.rect = self.image.get_rect(center=(x, y))

        self.anim_index = 0
        self.anim_timer = 0

    def move_player(self, dt):
        """Move the player."""
        self.pressed = pg.key.get_pressed()

        if self.pressed[pg.K_a]:
            self.pos_x -= 5  # Move left.
            self.images = STICKMAN_RUN_RIGHT  # Change the animation.
        if self.pressed[pg.K_d]:
            self.pos_x += 5  # Move right.
            self.images = STICKMAN_RUN_RIGHT  # Change the animation.
        if not self.pressed[pg.K_d] and not self.pressed[pg.K_a]:
            self.images = STICKMAN_IDLE  # Change the animation.

        # Update the rect because it's used to blit the image.
        self.rect.center = self.pos_x, self.pos_y

    def animate(self, dt):
        # Add the delta time to the anim_timer and increment the
        # index after 70 ms.
        self.anim_timer += dt
        if self.anim_timer > .07:  # After 70 ms.
            self.anim_timer = 0  # Reset the timer.
            self.anim_index += 1  # Increment the index.
            self.anim_index %= len(self.images)  # Modulo to cycle the index.
            self.image = self.images[self.anim_index]  # And switch the image.

    def update(self, dt):
        self.move_player(dt)
        self.animate(dt)

    def draw(self, screen):
        screen.blit(self.image, self.rect)


def main():
    clock = pg.time.Clock()
    player = Player(100, 300)
    done = False

    while not done:
        # dt (delta time) = time in ms since previous tick.
        dt = clock.tick(30) / 1000

        for event in pg.event.get():
            if event.type == pg.QUIT:
                done = True

        player.update(dt)  # Pass the delta time to the player.

        screen.fill((30, 30, 30))
        player.draw(screen)
        pg.display.flip()


if __name__ == '__main__':
    main()
    pg.quit()