当前位置: 首页 > 知识库问答 >
问题:

一次更新全部显示PyGame

衡丰茂
2023-03-14

使用PyGame,我可以得到闪烁的东西。盒子,圆圈,文字,一切都在闪烁。我可以通过增加循环之间的等待时间来减少这种情况,但我想我可以通过一次将所有内容都绘制到屏幕上来消除这种情况,而不是单独进行所有操作。下面是一个发生在我身上的简单例子:

    import pygame, time
    pygame.init()
    screen = pygame.display.set_mode((400, 300))
    loop = "yes"
    while loop=="yes":
        screen.fill((0, 0, 0), (0, 0, 400, 300))
        font = pygame.font.SysFont("calibri",40)
        text = font.render("TextA", True,(255,255,255))
        screen.blit(text,(0,0))
        pygame.display.update()

        font = pygame.font.SysFont("calibri",20)
        text = font.render("Begin", True,(255,255,255))
        screen.blit(text,(50,50))
        pygame.display.update()
        time.sleep(0.1)

“开始”按钮为我闪烁。这可能只是我较慢的电脑,但是有没有办法减少或消除闪烁?在我正在做的更复杂的事情中,情况变得非常糟糕。谢谢!

共有3个答案

暴绪
2023-03-14

每0.1秒重新绘制一次整个屏幕的内容。跟踪您实际所做的更改并只更新实际包含更改内容的矩形更常见、更快。因此,在循环之外绘制所有内容,让事件修改屏幕,并跟踪实际更改的矩形。

所以像这样的事情:

import pygame, time
pygame.init()
screen = pygame.display.set_mode((400, 300))
screen.fill((0, 0, 0), (0, 0, 400, 300))
font = pygame.font.SysFont("calibri",40)
text = font.render("TextA", True,(255,255,255))
screen.blit(text,(0,0))
font = pygame.font.SysFont("calibri",20)
text = font.render("Begin", True,(255,255,255))
screen.blit(text,(50,50))
loop = "yes"
counter = 0
dirty_rects = []
while loop=="yes":
    pygame.display.update()
    time.sleep(0.1)
    # Handle events, checks for changes, etc. Call appropriate functions like:
    counter += 1
    if counter == 50:
        font = pygame.font.SysFont("calibri",20)
        text = font.render("We hit 50!", True,(255,255,255))
        screen.blit(text,(50,100))
        dirty_rects.append(Rect((50,100),text.get_size()))
孟福
2023-03-14

您正在循环更新屏幕2次,一次用于绘制第一个文本(TextA),另一次用于绘制第二个文本(Begin)。

第一次更新后,只会显示第一个文本,因此在第一次更新和第二次更新之间看不到begin文本。这会导致闪烁。

绘制所有内容后更新屏幕。在这种情况下,首先删除pygame.display.update()

子车凌龙
2023-03-14

我认为问题的一部分是你多次调用“pygame.display.update()”。尝试在主循环期间只调用它一次。

其他一些优化:

  • 您可以将字体创建代码从主循环中删除以加快速度
  • 执行loop=True而不是loop=“yes”
  • 要获得更一致的fps,可以使用Pygame的时钟类

所以...

import pygame
pygame.init()

screen = pygame.display.set_mode((400, 300))
loop = True

# No need to re-make these again each loop.
font1 = pygame.font.SysFont("calibri",40)
font2 = pygame.font.SysFont("calibri",20)

fps = 30 
clock = pygame.time.Clock()

while loop:
    screen.fill((0, 0, 0), (0, 0, 400, 300))

    text = font1.render("TextA", True,(255,255,255))
    screen.blit(text,(0,0))

    text = font2.render("Begin", True,(255,255,255))
    screen.blit(text,(50,50))

    pygame.display.update()   # Call this only once per loop
    clock.tick(fps)     # forces the program to run at 30 fps.
 类似资料:
  • 问题内容: 我正在尝试制作一个程序,一次显示3个框。我以为,如果您为设置一个类,它将每秒显示一个新框。 所以这是我想出的代码: } 它有效,但不是我想要的方式。在上一个按ok之后,它每秒显示一个新框,而不是每秒显示一个新框。 因此,当我按下“按下”键时,它会等待1秒钟并产生一个盒子。当我按“确定”时,它会等待1秒钟并生成另一个,依此类推。知道如何使3个盒子接连产生1个吗? 问题答案: 使用JOpt

  • 您好,我想平稳地更新seekbar,每秒钟更新一次,所以我创建了一个使用计时器的方法,每秒钟更新seekbar,但它每秒钟都在更新歌曲,我到处搜索,但没有找到解决方案,我不想使用任何处理程序,我想用这个方法修复 在这里我实现了歌曲开始时的方法 这是我的全部代码

  • 问题内容: 我正在使用带有ajax调用的twitter typeahead(typeahead.js 0.11.1)插件,但是当ajax结果的数量小于限制(默认限制为5,我未指定)时,它会给出一些奇怪的行为在预先输入电话中)。这是我的设置方法: 导致我出现此问题的实际示例是在输入框中键入“ new to”,它返回以下json.options: 但是出现的唯一建议是“所有要添加到g1的新内容”,当所

  • 问题内容: 我有两个表需要相同的值以实现非规范化。 这是查询。 第一张桌子 第二张桌子 如您所见,两个表之间的唯一区别是它们的名称和两个表没有该字段 无论如何将两个更新合并为一个? 问题答案: 如文档中所述,应该可以进行多表更新。 http://dev.mysql.com/doc/refman/5.5/en/update.html 注意:多表不支持LIMIT,因此根据具体情况,这可能会引起更多麻烦

  • 我想将我的所有软件包更新到最新版本: 谢谢!!

  • 问题内容: 在Java中,我尝试将String写入控制台。字符串的长度为20166个字符。将字符串打印到控制台后,仅出现字符串的后半部分。 整个字符串是一长行: 看起来像什么: 从一开始就有很多空格(应该是字母数字字符),然后是其余的字符串。 我试图将控制台编码从默认更改为UTF-16和UTF-8,但这没有帮助。 我要输出的字符串是从特定网页(http://docs.jquery.com/Tuto