python - 我如何才能让我的步行动画以设定的速度播放? ( python ,游戏)

标签 python pygame

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)

这是我的代码。如何在不改变 FPS 的情况下将其创建为步行动画播放速度变慢的位置?

最佳答案

您需要跟踪时间,因此您可以使用 pygame.time.get_ticksclock.tick() 返回的时间(通常称为dt for delta time),然后在一段时间后更新图像。

pygame.time.get_ticks 变体:

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

还有一个带有delta time 变体的完整示例。 (如果你最终想让游戏帧速率独立,你将需要在你的类中使用 dt 来获得移动速度)。

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()

关于python - 我如何才能让我的步行动画以设定的速度播放? ( python ,游戏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45178397/

相关文章:

python - 如何使用许多工作人员发送 slurm 作业,而不仅仅是在本地模式下运行?

python - 无法为我的 Ping Pong pygame 创建一个 Hitbox

python - 如何在 pygame 中添加敌人?

python 相当于curl -X POST -F "name=blahblah"-F "file=@blahblah.jpg"

Python/ Pandas : Finding index for the nlargest and keeping only those above a value

python - 寻找最大的二进制间隙

python - 使用 else pass 的列表理解

Python2 Pygame 安装问题 OS X

python - 贪吃蛇游戏错误代码(IndexError : list index out of range)

image - pygame 1.9 似乎没有加载 png