pygame中的闪烁文字



所以我一直在Pygame制作游戏,并且遇到了一个问题。我正在做一个分数计数器,在游戏循环中,如果发生了什么事,则得分会上升并调用字体功能。但是,我认为问题是只有在分数上升时才被称为,所以这只是一个帧。那么我该如何坚持每个帧?

    #Importation
import pygame
import time
from random import randint

#Initialization
pygame.mixer.pre_init(44100,16,2,4096)
pygame.init()
display_width = 800
display_height = 600
black = (0,0,0)
white = (255, 255, 255)
orange = (255, 122, 55)
slow_yellow = (255, 203, 82)
medium_orange = (255, 119, 0)
fast_red = (255, 102, 82)
bk_orange = (255, 228, 196)
gameDisplay = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('Dodger Man')
clock = pygame.time.Clock()
score = 0
#MUSIC
pygame.mixer.music.load('coastin_converted.wav')
pygame.mixer.music.set_volume(.3)
pygame.mixer.music.play(-1)
#Man Sprite
manImg = pygame.image.load('tutorialcharacter.png')
man_width = 64
man_height = 64
#Wall Sprites
wall_LImg = pygame.image.load('wall.png')
def wall_L(wall_LX, wall_LY):
    gameDisplay.blit(wall_LImg, (wall_LX, wall_LY))

wall_RImg = pygame.image.load('wall.png')
def wall_R(wall_RX, wall_RY):
    gameDisplay.blit(wall_RImg, (wall_RX, wall_RY))

#Functions
def man(x,y):
    gameDisplay.blit(manImg,(x,y))
#OBSTACLES
def obs(obsx, obsy, obsw, obsh, obscolor):
    pygame.draw.rect(gameDisplay, obscolor, [obsx, obsy, obsw, obsh])
def obs_2(obsx_2, obsy_2, obsw_2, obsh_2, obscolor_2):
    pygame.draw.rect(gameDisplay, obscolor_2, [obsx_2, obsy_2, obsw_2, obsh_2])
def obs_3(obsx_3, obsy_3, obsw_3, obsh_3, obscolor_3):
    pygame.draw.rect(gameDisplay, obscolor_3, [obsx_3, obsy_3, obsw_3, obsh_3])

##Messages
def font_func(font_size, font_msg, font_color):
    font =  pygame.font.SysFont("freesansbold.tff", font_size )
    text = font.render(font_msg, True, font_color)
##Death
def death():
    pygame.mixer.music.load('death.wav')
    pygame.mixer.music.set_volume(.3)
    pygame.mixer.music.play(1)
    font_func(115, "YOU'RE DEAD", orange)
    window.blit(font_msg, (display_width / 2), 70)
    x = (display_width * 0.40)
    y = (display_height * 0.8)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            end_game()
        else:
            pass
    time.sleep(.5)
    pygame.mixer.music.load('coastin_converted.wav')
    pygame.mixer.music.set_volume(.3)
    pygame.mixer.music.play(-1)
    game_loop(False)

#Game Loop
def game_loop(gameExit):
    global score
    x = (display_width * 0.40)
    y = (display_height * 0.8)
    wall_LX = 0
    wall_LY = 0
    wall_RX = display_width - 64
    wall_RY = 0
    #Obstacles
    obs_startx = randint(64, display_width - 64)
    obs_starty = -800
    obs_speed = 10
    obs_width = 75
    obs_height = 75
    obs_startx_2 = randint(64, display_width - 64)
    obs_starty_2 = -300
    obs_speed_2 = 12
    obs_width_2 = 75
    obs_height_2 = 75
    obs_startx_3 = randint(64, display_width - 64)
    obs_starty_3 = -1000
    obs_speed_3 = 15
    obs_width_3 = 75
    obs_height_3 = 75
    #Movement variables
    x_change = 0
    y_change = 0
    #Event Loop
    while gameExit != True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                gameExit = True
                end_game()
            #Movement
            if event.type == pygame.KEYDOWN:                    
                if event.key == pygame.K_LEFT:
                    x_change = -10
                if event.key == pygame.K_RIGHT:
                    x_change = 10
                if event.key == pygame.K_UP:
                    y_change = -10
                if event.key == pygame.K_DOWN:
                    y_change = 10
            #Non-Movement
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                    x_change = 0
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    y_change = 0
        #Logic
        x += x_change
        y += y_change
        gameDisplay.fill(bk_orange)
        wall_L(wall_LX, wall_LY)
        wall_R(wall_RX, wall_RY)
        ##Blocks
        obs(obs_startx, obs_starty, obs_width, obs_height, slow_yellow)
        obs_starty += obs_speed
        obs_2(obs_startx_2, obs_starty_2, obs_width_2, obs_height_2, medium_orange)
        obs_starty_2 += obs_speed_2
        obs_3(obs_startx_3, obs_starty_3, obs_width_3, obs_height_3, fast_red)
        obs_starty_3 += obs_speed_3
        man(x,y)
        if x >= display_width - man_width or x <= 0:
            death()
        if y >= display_height - man_height or y <= 0:
            y_change = 0
        if obs_starty > display_height:
            obs_starty = 0 - obs_height
            obs_startx = randint(64, display_width - 64)
            score += 1
            font_func(70, ("SCORE:", str(score)), orange)
            gameDisplay.blit(font_msg, (display_width/2), 70)
        if obs_starty > 400:
            if obs_starty_2 > display_height:
                score += 2
                font_func(70, ("SCORE:", str(score)), orange)
                gameDisplay.blit(font_msg, (display_width / 2), 70)
            obs_starty_2 = 0 - obs_height_2
            obs_startx_2 = randint(64, display_width - 64)
        if obs_starty_2 > 500:
            if obs_starty_3 > display_height:
                score += 3
                font_func(70, ("SCORE:", str(score)), orange)
                gameDisplay.blit(font_msg, (display_width / 2), 70)
            obs_starty_3 = 0 - obs_height_3
            obs_startx_3 = randint(64, display_width - 64)
        if y <= obs_starty + obs_height:
            if x > obs_startx and x < obs_startx + obs_width or x + man_width > obs_startx and x + man_width < obs_startx + obs_width:
                if y + man_height < obs_starty:
                    pass
                else:
                    score = 0
                    death()
        if y <= obs_starty_2 + obs_height_2:
            if x > obs_startx_2 and x < obs_startx_2 + obs_width_2 or x + man_width > obs_startx_2 and x + man_width < obs_startx_2 + obs_width_2:
                if y + man_height < obs_starty_2:
                    pass
                else:
                    score = 0
                    death()
        if y <= obs_starty_3 + obs_height_3:
            if x > obs_startx_3 and x < obs_startx_3 + obs_width_3 or x + man_width > obs_startx_3 and x + man_width < obs_startx_3 + obs_width_3:
                if y + man_height < obs_starty_3:
                    pass
                else:
                    score = 0
                    death()
        #Updates
        pygame.display.flip()
        clock.tick(60)
#Terminate program
def end_game():
    pygame.quit()
    quit()
game_loop(False)

不要在if块中创建并闪烁得分font_msg。将其渲染为每一帧。

# Some global font objects that you can reuse in the while loop.
FONT = pygame.font.SysFont('freesansbold.tff', 32)
FONT_BIG = pygame.font.SysFont('freesansbold.tff', 70)
    while not gameExit:
        # In the drawing phase draw this every frame. 
        font_msg = FONT.render('SCORE: {}'.format(score), True, orange)
        gameDisplay.blit(font_msg, (display_width//2, 70))

最新更新