文本在 pygame 中一直闪烁

Text keeps blinking in pygame

所以我正在编写一个代码,其中有一个角色(一个矩形)和一个气球(一个圆圈),角色必须在气球落地之前接住气球。一切正常,直到我尝试让游戏看起来更好一点并使用 blit 函数添加图像。出于某种原因,我的文本现在一直在缓冲。

代码:

import random
import pygame
from pygame.locals import *
pygame.init()

#Variables
white = (255, 255, 255)
blue = (70,130,180)
black = (0,0,0)
red = (255,0,0)
x = 400
y = 450
score = 0
cooly = 100
randomx = random.randint(100,800)
clock = pygame.time.Clock()
#screen stuff
screenwidth = 800
screenheight = 600

screen = pygame.display.set_mode((screenwidth, screenheight))
pygame.display.set_caption("Balloon Game!")
#end of screen stuff

#Initializing font
def show_text(msg, x, y, color,size): 
   fontobj= pygame.font.SysFont("freesans", size)
   msgobj = fontobj.render(msg,False,color)
   screen.blit(msgobj,(x, y))
#Game loop
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            exit()
    # Draw Character
    screen.fill(blue)
    character = pygame.draw.rect(screen, red, (x, y, 60, 60))
    #End of Drawing Character

    #Draw Balloons
    balloon = pygame.draw.circle(screen, (black), (randomx, cooly), 30, 30)
    cooly = cooly + 2
    # Making Arrow Keys
    keyPressed = pygame.key.get_pressed()
    if keyPressed[pygame.K_LEFT]:
        x -= 3
    if keyPressed[pygame.K_RIGHT]:
        x += 3

    #Drawing Cool Stuff
    Cloud = pygame.image.load('Cloud.png')
    screen.blit(Cloud,(100,75))
    pygame.display.update()
    
    #End of making arrow keys
    show_text("Score:",130,0,black,50)
    show_text(str(score),250,0,black,50)

    #Collision
    if balloon.colliderect(character):
        randomx = random.randint(100,800)
        cooly = 100
        score = score + 1
    #end of collision

    #Ending
    if cooly >= 600:
        screen.fill(blue)
        show_text("Game Over!", 200, 250, black, 100)
        show_text("Score :", 200, 350, black, 75)
        show_text(str(score), 400, 350, black, 75)
    #Polishing
    if score == score + 5:
            cooly += 1
            x += 3
    pygame.display.update()
    clock.tick(250)

问题是由多次调用 pygame.display.update() 引起的。在应用程序循环结束时更新显示就足够了。多次调用 pygame.display.update()pygame.display.flip() 会导致闪烁。

从代码中删除对 pygame.display.update() 的所有调用,但在应用程序循环结束时调用一次。

不要创建字体对象,也不要在应用程序循环中加载图像。这是非常昂贵的操作,因为必须阅读和解释文件:

fontobj= pygame.font.SysFont("freesans", size)      #<-- INSERT

def show_text(msg, x, y, color,size): 
   # fontobj= pygame.font.SysFont("freesans", size)  <-- DELET
   msgobj = fontobj.render(msg,False,color)
   screen.blit(msgobj,(x, y))

Cloud = pygame.image.load('Cloud.png')              #<-- INSERT

# [...]
while True:
    # [...]

    # Cloud = pygame.image.load('Cloud.png')        <-- DELETE
    screen.blit(Cloud,(100,75))
    # pygame.display.update()                       <-- DELETE

    # [...]

    pygame.display.update()
    clock.tick(250)