如何使我的行走动画以设定的速度播放?(Python、Pygame)
这是我的密码。如何在不改变FPS的情况下将其创建到行走动画播放速度较慢的位置?您需要跟踪时间,以便可以使用如何使我的行走动画以设定的速度播放?(Python、Pygame),python,pygame,Python,Pygame,这是我的密码。如何在不改变FPS的情况下将其创建到行走动画播放速度较慢的位置?您需要跟踪时间,以便可以使用pygame.time.get_ticks或clock.tick()返回的时间(对于增量时间,通常称为dt)然后在一段时间后更新图像 pygame.time.get_ticks变体: keystate = pg.key.get_pressed() if keystate[pg.K_LEFT]: self.counter = (self.counter
pygame.time.get_ticks
或clock.tick()
返回的时间(对于增量时间,通常称为dt
)然后在一段时间后更新图像
pygame.time.get_ticks
变体:
keystate = pg.key.get_pressed()
if keystate[pg.K_LEFT]:
self.counter = (self.counter + 1) % len(player_images)
self.acc.x = -PLAYER_ACC
self.image = pg.transform.flip(player_images[self.counter], True, False)
self.image.set_colorkey(WHITE)
还有一个完整的示例,其中包含delta time变量。(如果你最终想让游戏帧速率独立,你需要在你的类中使用dt
来计算移动速度)
那么,你的意思是你想在更换精灵之间有更长的休息时间吗?是的,这正是我想要的。你可以使用
time.sleep(time)
方法,当你通过time
时,它会使你的程序休眠。@Joykill教授,我可以举一个例子说明在哪里对time.sleep(time)进行编码吗?对于noob的问题,我很抱歉,我还是一个初学者。
class Player(pg.sprite.Sprite):
def __init__(self, pos, *groups):
super().__init__(*groups)
self.frame = 0 # Index of the current animation frame.
self.image = IMAGES[self.frame] # Set image to the first image.
self.rect = self.image.get_rect(center=pos)
# Start time of the last animation frame.
self.start_time = pg.time.get_ticks()
# If the time limit is reached, increment the index
# and change self.image.
self.time_limit = 300 # Milliseconds.
def update(self):
now = pg.time.get_ticks()
if now - self.start_time > self.time_limit:
self.frame += 1 # Increment the frame index.
self.frame %= len(IMAGES) # Keep the index in the range.
self.image = IMAGES[self.frame] # Switch the image.
self.start_time = now
import pygame as pg
# Some images with dots for the animation.
IMAGE1 = pg.Surface((90, 90))
IMAGE1.fill((30, 90, 200))
pg.draw.circle(IMAGE1, (50, 170, 220), (45, 45), 15)
IMAGE2 = pg.Surface((90, 90))
IMAGE2.fill((30, 90, 200))
pg.draw.circle(IMAGE2, (50, 170, 220), (30, 30), 15)
pg.draw.circle(IMAGE2, (50, 170, 220), (60, 60), 15)
IMAGE3 = pg.Surface((90, 90))
IMAGE3.fill((30, 90, 200))
pg.draw.circle(IMAGE3, (50, 170, 220), (20, 20), 15)
pg.draw.circle(IMAGE3, (50, 170, 220), (45, 45), 15)
pg.draw.circle(IMAGE3, (50, 170, 220), (70, 70), 15)
IMAGES = [IMAGE1, IMAGE2, IMAGE3]
class Entity(pg.sprite.Sprite):
def __init__(self, pos, *groups):
super().__init__(*groups)
self.frame = 0 # Index of the current animation frame.
self.image = IMAGES[self.frame] # Set image to the first image.
self.rect = self.image.get_rect(center=pos)
self.timer = 0 # Time in seconds.
def update(self, dt):
self.timer += dt # Increment the timer.
# If the timer is above the desired time limit ...
if self.timer >= .5:
self.timer = 0 # Reset the timer.
self.frame += 1 # Increment the frame index.
self.frame %= len(IMAGES) # Keep the index in the range.
self.image = IMAGES[self.frame] # Switch the image.
def main():
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
all_sprites = pg.sprite.Group(Entity((200, 200)))
dt = 0
done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True
# Pass dt to the update methods of all sprites.
all_sprites.update(dt)
screen.fill((30, 30, 30))
all_sprites.draw(screen)
pg.display.flip()
# dt is the time that has passed since the last clock.tick call.
# Divide by 1000 to convert milliseconds to seconds.
dt = clock.tick(30) / 1000
if __name__ == '__main__':
pg.init()
main()
pg.quit()