python - 无事发生时显示 fps 为 0

标签 python pygame frame-rate

我正在制作一个基本的平台游戏,在调试游戏时我注意到一个问题,每当我运行游戏时,没有任何反应(我的 fps 为 0),直到我按下按键、移动鼠标​​或引发任何类型的事件。这不仅仅是我的 fps 下降,如果我做某事,我的 fps 通常会达到 100 或 200。

老实说,我不知道发生了什么,因为我从未遇到过这个问题。我尝试过更改驱动程序,更改显示标签,弄乱时钟,检查文档并尝试找到这样的问题,但无济于事。

这是我的主要内容:

class Main:
    def __init__(self):
        import pygame
        from pygame.math import Vector2
        import os
        from Database.Player import Player
        import platform
        pygame.init()

        # file path
        file_path = os.path.dirname(os.path.abspath(__file__))

        # changing driver
        if platform.system() == "Windows":
            os.environ["SDL_VIDEODRIVER"] = "directx"

        # screen vars
        screen = pygame.display.set_mode((800, 800), pygame.RESIZABLE)
        screen_info = pygame.display.Info()
        screen_size = Vector2(screen_info.current_w, screen_info.current_h)
        game_resolution = Vector2(800, 800)
        game_offset = Vector2(screen_size / 2 - game_resolution / 2)

        # class initializations
        player = Player((400, 0), file_path)

        # screen caption
        pygame.display.set_caption(f"reeeeeeeeeeeeeeeeeeeeeeeeeeeee")

        # clock
        clock = pygame.time.Clock()

        leave = False
        while not leave:
            pygame.display.set_caption(str(clock.get_fps()))

            # delta time
            delta_time = clock.get_time() / 1000

            # key presses
            key = pygame.key.get_pressed()

            # event
            event = pygame.event.wait()
            if event.type == pygame.QUIT or key[pygame.K_DELETE]:
                leave = True

            elif event.type == pygame.VIDEORESIZE:
                game_offset = Vector2(Vector2(event.size) / 2 - game_resolution / 2)
                screen = pygame.display.set_mode(event.size, pygame.RESIZABLE)

            # update
            player.update(key, delta_time)
            player.draw(screen, game_offset)
            pygame.display.flip()
            screen.fill((255, 255, 255))
            clock.tick(1000)

        pygame.display.quit()
        return


if __name__ == "__main__":
    Main()

这是玩家类别

import pygame
from pygame.math import Vector2


class Player(object):
    def __init__(self, start_pos, file_path):
        # visual
        self.image = pygame.Surface((20, 20))


        # positional
        self.pos = start_pos
        self.rect = pygame.Rect(start_pos, self.image.get_size())
        self.speed = Vector2(0)
        self.deceleration = 0.1
        self.acceleration = Vector2(4000, 0)
        self.gravity = Vector2(0, 800)
        self.max_speed = Vector2(1000, 1000)
        self.jump_speed = Vector2(0, 500)

        # properties
        self.jump = True

    def draw(self, surface, game_offset):
        surface.blit(self.image, self.pos + game_offset)

    def update(self, key, delta_time):

        if key[pygame.K_a]:
            self.speed.x -= self.acceleration.x * delta_time

        if key[pygame.K_d]:
            self.speed.x += self.acceleration.x * delta_time

        if key[pygame.K_w] or key[pygame.K_SPACE] and self.jump:
            self.speed.y -= self.jump_speed.y

        self.speed.y += self.gravity.y * delta_time

        self.speed.x = max(-self.max_speed.x, min(self.speed.x, self.max_speed.x))
        self.speed.y = max(-self.max_speed.y, min(self.speed.y, self.max_speed.y))

        self.pos += self.speed * delta_time

我在这里遗漏了一些明显的东西吗?我的问题在其他电脑上也能重现吗?老实说我不知道​​。如果有人能提供任何建议,我将不胜感激。感谢您花时间阅读我的代码并回答您的问题。

最佳答案

pygame.event.wait()的调用实际上将等待事件。您需要做的(为了保持运行)是调用 pygame.event.get()。

但是,get() 返回自上次调用它以来发生的事件的列表,因此正确的方法如下:

for event in pygame.event.get():
    if event.type == pygame.QUIT or key[pygame.K_DELETE]:
        leave = True
        break # No need to carry on if you're finishing up.

    if event.type == pygame.VIDEORESIZE:
        game_offset = Vector2(Vector2(event.size) / 2 - game_resolution / 2)
        screen = pygame.display.set_mode(event.size, pygame.RESIZABLE)
    # elif other events.

# Update stuff regardless of events.

player.update(key, delta_time)
screen.fill((255, 255, 255))
player.draw(screen, game_offset)
pygame.display.flip()
clock.tick(1000)

关于python - 无事发生时显示 fps 为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56962469/

相关文章:

python - 快速移动窗口时小部件消失

python - Py 安装程序 "ValueError: too many values to unpack"

python - Django 管理 URL 可见重定向

Python SSL : CERTIFICATE_VERIFY_FAILED

python - 组中对象之间的 Pygame 碰撞检测

python-3.x - 如何使用 systemd 服务显示 PyGame 帧缓冲区?

python - 如何在一个函数中休眠而不休眠整个程序

Android OpenGL ES 2.0 帧率上限?

google-chrome - 如何在Chrome开发者工具中获得平均FPS

c++ - 每 2 秒捕获帧