我已经阅读了此处发布的其他相关问题,但我似乎无法将这些答案放入我的状态机中,可在此处找到: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))
答案 0 :(得分:2)
images
(当前图像列表/动画)属性。 images
设置动画,首先将dt
(delta 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()