Pygame是在不暂停程序的情况下减慢某个动画帧速率的最佳方法吗?

问题描述 投票:0回答:1

我一直有动画不同的精灵帧动画的问题。我的程序以60 FPS运行,我的一些精灵没有足够的帧来看起来平滑并且给予用户足够的时间。例如我的爆炸精灵,里面有6帧。当游戏以60FPS运行时,这意味着整个动画仅在1/10秒内可见。

我已经尝试了以下函数:Pygame.wait和Pygame.delay以及“//”floor函数。 Pygame.wait / delay都完全暂停程序,这意味着只是为了看爆炸,用户必须停止他们正在做的事情,我不想重复帧到30或60帧,这只是似乎效率低下。

爆炸阵列:

Expl = [pygame.image.load("EX1.png"),pygame.image.load("EX2.png"),pygame.image.load("EX3.png"),pygame.image.load("EX4.png"),pygame.image.load("EX5.png"),pygame.image.load("EX6.png")]

它发生的地方:

            if self.explosionc + 1 >= 6:
                self.explosionc = 0
            elif self.vel > 0:
                win.blit(Expl[self.explosionc // 5],(self.x,self.y))
                self.explosionc +=1

玩家类,如果你需要那么多信息

class Player(pygame.sprite.Sprite):

    def __init__(self,x,y,width,height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 5
        self.health = 10
        self.visible = True
        self.explosions = False
        self.explosionc = 0
        self.hitbox = (self.x + 5,self.y + 10,60,60)
        self.canshoot = True
        self.dead = False
    def draw(self,win):
        global bgvel
        if self.y > 600:
            win.blit(EFTNA,(self.x,self.y))
            for enemy in enemies:
                enemy.vel = 2
                #bgvel = 1
        elif self.y <= 600 and self.y > 400:
            win.blit(EFTAL,(self.x,self.y))
            for enemy in enemies:
                enemy.vel = 3
                #bgvel = 2
        elif self.y <= 400 and self.y > 350:
            win.blit(EFTAM,(self.x,self.y))
            for enemy in enemies:
                enemy.vel = 4
                #bgvel = 3
        elif self.y <= 450:
            win.blit(EFTAH,(self.x,self.y))
            for enemy in enemies:
                enemy.vel = 5
                #bgvel = 4
        self.hitbox = (self.x + 5,self.y + 10,60,60)
        #pygame.draw.rect(win,(255,0,0),self.hitbox,2)
        if self.y + self.height > HEIGHT:
            self.y -= self.vel
        if self.x < 0:
            self.x += self.vel
        if self.x + self.width > WIDTH:
            self.x -= self.vel
        if self.explosions == True:
            print("I exploded")
            self.canshoot = False
            self.dead = True
            index = self.explosionc//10
            if self.vel > 0:
                win.blit(Expl[index % 6],(self.x,self.y))
                self.explosionc += 1
                #if self.explosionc >= 6*10:
                #    self.explosionc = 0

            self.visible = False
    def hit(self):
        if self.health > 0:
                self.health -=1
        else:

                self.explosions = True

我希望程序在每帧之间等待一段时间而不会暂停整个程序。我听说“地板”是一种很好的方法,但它似乎没有效果,因为它要么让人眼看不见,要么没有效果。

animation pygame wait python-3.7
1个回答
0
投票

您可以使用pygame.time.get_ticks()使用时间来控制显示帧的时间

start_time = pygame.time.get_ticks()

while running:

    current_time = pygame.time.get_ticks()
    if current_time - start_time >= expected_delay_in_ms:
        change_frame_in_animation()
        start_time = current_time

我在start_time之前创建了while running,但是当你开始动画时你必须创建它。


您还可以使用qazxsw poi每隔几毫秒创建一个自己的事件。然后您可以使用此事件来更改动画中的帧

pygame.time.set_timer()

我在pygame.time.set_timer(pygame.USEREVENT+1, expected_delay_in_ms) while running: for event in pygame.event.get(): if event.type = pygame.USEREVENT+1: change_frame_in_animation() 之前使用pygame.time.set_timer()但你必须在开始动画时使用它。


编辑:使用您的新代码可能是(但我无法测试)

while running我定义

self.__init__

当玩家死亡时,我设置self.frame_delay = 200 # 200 milliseconds - 它应该显示第一帧没有延迟。

self.start_delay = 0

def hit(self): if self.health > 0: self.health -= 1 else: self.explosions = True self.start_delay = 0 # or pygame.time.get_ticks() 我使用drawself.start_delaycurrent_time进行比较

self.frame_delay

我计算下一帧

        if self.explosions == True:

            current_time = pygame.time.get_ticks()
            if current_time - self.start_delay >= self.frame_delay:
                self.start_delay = current_time

                print("I exploded")
                self.canshoot = False
                self.dead = True

                self.explosionc = (self.explosionc + 1) % 6
                if self.vel > 0: # ???
                    win.blit(Expl[self.explosionc],(self.x,self.y))

            self.visible = False

我不知道为什么你使用self.explosionc = (self.explosionc + 1) % 6

完整代码

if self.vel > 0:
© www.soinside.com 2019 - 2024. All rights reserved.