【问题标题】:pygame game speed is varying from pc to otherpygame 游戏速度因电脑而异
【发布时间】:2018-04-28 10:50:34
【问题描述】:

我刚刚用 pygame 完成了我的第二个 Python 游戏,但这次我遇到了一个新问题。当我在另一台电脑上尝试游戏时,游戏速度非常快,比预期的要快得多,我试图调整 FPS 但没有帮助。当我已经设置了所有设置(如移动速度和游戏 FPS)时,如何解决这个问题?为什么还会发生这种情况?

import pygame
from settings import Settings
import game_functions as gf
from ship import Ship
from pygame.sprite import Group
from game_stats import Stats
from animation import spriteSheet
from scoreboard import ScoreBoard
from button import Button

def run_game():

    pygame.init()

    icon = pygame.image.load('icons/icon.png')
    pygame.display.set_icon(icon)

    so_settings = Settings()

    screen = pygame.display.set_mode((so_settings.screen_width, so_settings.screen_height))

    pygame.display.set_caption('Space Vikers')

    last_tick = 0    

    ship = Ship(screen, so_settings)
    stats = Stats(so_settings, screen)


    bullets = Group()
    bullets_enemy = Group()
    enemies = Group()
    explosion = Group()

    exploAni = spriteSheet("animations/explosion.png", 5, 4)
    sb = ScoreBoard(so_settings, screen, stats, bullets, ship)
    btn = Button(screen)

    gf.start_background_music()

    clock = pygame.time.Clock()
    FPS = 120
    while True:
        clock.tick(FPS)

        while stats.main_menu:

            gf.move_bg(so_settings, screen, sb, stats, last_tick)
            btn.draw_button()
            pygame.display.flip()
            gf.check_event(screen, so_settings, ship, bullets, sb, stats, btn)

        if stats.game_active:
            gf.update_enemy_bullet(bullets_enemy, so_settings, screen)
            gf.update_bullet(bullets, so_settings, sb)
            gf.generate_enemy(so_settings, stats, last_tick, screen, ship, enemies, bullets_enemy, bullets, explosion, sb)
            gf.update(so_settings, screen, bullets, enemies, bullets_enemy, ship, exploAni, explosion, stats, sb)
            gf.move_bg(so_settings, screen, sb, stats, last_tick)
            gf.check_event(screen, so_settings, ship, bullets, sb, stats, btn)
        else:
            gf.move_bg(so_settings, screen, sb, stats, last_tick)
            gf.check_event(screen, so_settings, ship, bullets, sb, stats, btn)

run_game()

【问题讨论】:

  • @kabanus 我不认为这符合重复的条件。
  • @Coal_ 那里的答案不是解决了在不同计算机上以不同速度运行的 pygame 吗?
  • @kabanus 是的,但是您链接到的问题是关于一个非常具体的示例,而且这肯定不是唯一一次提出这个问题。
  • @Coal_ 据我所知,所有 pygames 都是这个问题的具体例子。副本必须提供一个好的答案,而不是逐字匹配问题 - 它旨在提供帮助,这就是 OP 可以提出异议的原因。如果你找到了一个更好的骗子 - 无论如何,链接它。

标签: python python-3.x python-2.7 pygame game-development


【解决方案1】:

您的问题是慢速计算机无法处理 120 fps。您可以通过在 clock.tick 语句之后的循环中包含以下行来轻松检查:

print(clock.get_fps())

这将打印实际达到的 FPS

有办法解决这个问题。首先你可以根据clock.tick的返回值来使所有的移动速度:

dt = clock.tick()

然后在移动脚本的某个地方:

pos = pos+speed*dt # Just an example

这是你以后应该做的。

如果你不想重写你的运动系统,只需降低帧率:

FPS = 30

【讨论】:

  • 是的,将速度乘以 delta 时间通常就足够了(在单人游戏中),但请注意,您现在有一个可变的时间步长,您的游戏变得不确定。这意味着你可能会在物理和网络方面遇到麻烦。通常建议使用具有可变渲染的固定时间步长,但这更难实现(参见gameprogrammingpatterns.com/game-loop.html)。
  • 这是否可能会带来问题,例如对象碰撞?如果两个物体在一条碰撞线上,但系统足够慢,那有时会不会让一个物体穿过另一个物体(因为经过的时间足够长,坐标会大得多)?
  • @ChatterOne,没错。这就是为什么在涉及物理时不应使用此解决方案的原因之一。我认为我之前的评论太积极了。可变时间步真的不是一个好的解决方案,除了简单的纸牌或棋盘游戏或点击冒险,您只想调整动画速度。通常应该首选具有固定更新时间步长和可变渲染的解决方案(请参阅gameprogrammingpatterns.com/game-loop.html)。
猜你喜欢
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
相关资源
最近更新 更多