Поверхность текста Pygame не отрисовывается

Я пытаюсь отобразить текст, когда игрок проигрывает, но ничего не отображается и игра сразу же перезапускается. Он может перейти к оператору else, потому что он может печатать что-либо, но он, похоже, не «мигает» поверхности или делает это слишком быстро, чтобы увидеть.

Рассматриваемый код виден внизу, но я решил, что также включу основную функцию. Я не знаю, прав ли я, но рисует ли фон поверх текстового поля, как только они нарисованы? Если да, то как я могу это исправить?

def main():
    global FPSCLOCK, DISPLAYSURF, BASICFONT, \
           TILESIZE, floorx, floory, \
           floorCovered, tilesNeeded, OUTSIDEDECOMAPPING, \
           L_Monster, R_Monster, BGIMAGE, \
           bounceHeight, playerObj, R_Bird, \
           L_Bird, direction, birdx, \
           birdDir

    pygame.init()
    DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
    FPSCLOCK = pygame.time.Clock()
    BASICFONT = pygame.font.Font('freesansbold.ttf', 32)

    pygame.display.set_caption('Alpha One')
    # Set up the background image.
    boardImage = pygame.image.load('bg.png')
    # Use smoothscale() to stretch the board image to fit the entire board:
    boardImageRect = boardImage.get_rect()
    boardImageRect.topleft = (0, 0)
    BGIMAGE = pygame.image.load('bg.png')
    # Use smoothscale() to stretch the background image to fit the entire window:
    BGIMAGE = pygame.transform.smoothscale(BGIMAGE, (WINDOWWIDTH, WINDOWHEIGHT))
#     BGIMAGE.blit(boardImage, boardImageRect)
#     #Draw the background    
#     DISPLAYSURF.blit(BGIMAGE, BGIMAGE.get_rect())
#     #Draw the Floor
#     drawFloor()

    L_Monster = pygame.image.load('ghost.png')
    R_Monster = pygame.transform.flip(L_Monster, True, False)
    R_Bird = pygame.image.load('bird.png')
    L_Bird = pygame.transform.flip(R_Bird, True, False)


#     pygame.display.flip()







    #Main Game Loop
    while True:

        runGame()








def runGame():
    invulnerableMode = False
    invulnerableStartTime = 0
    gameOverMode = False
    gameOverStartTime = 0
    winMode = False
    bounceHeight = 30
    BOUNCEHEIGHT = 30
    camerax = 0
    cameray = 0
    birdx = WINDOWWIDTH - 50
    birdDir = 'right'

    gameOverSurf = BASICFONT.render('Game Over', True, WHITE)
    gameOverRect = gameOverSurf.get_rect()
    gameOverRect.center = (WINDOWWIDTH, WINDOWHEIGHT)






    #declares the player object
    playerObj = {'surface': pygame.transform.scale(L_Monster,(STARTSIZE, STARTSIZE)),
                 'facing': LEFT,
                 'size': STARTSIZE,
                 'x': WINDOWWIDTH,
                 'y': WINDOWHEIGHT,
                 'bounce':0,
                 'health': MAXHEALTH}
    #declares the bird object
    birdsObj = {'surface': pygame.transform.scale(R_Bird,(STARTSIZE, STARTSIZE)),
                'facing': RIGHT,
                'size': STARTSIZE,
                'x': (0 - STARTSIZE*2),
                'y': STARTSIZE * 2}




    #declare the current position of keys
    moveLeft = False
    moveRight = False
    moveUp = False
    moveDown = False
    spaceDown = False
    shiftDown = False







    while True:
        #redraw the background
        DISPLAYSURF.blit(BGIMAGE, BGIMAGE.get_rect())
        #redraw the floor
        drawFloor()        


        if invulnerableMode and time.time() - invulnerableStartTime > INVULNTIME:
            invulnerableMode = False


        playerCenterx = playerObj['x'] + int(playerObj['size'] / 2)
        playerCentery = playerObj['y'] + int(playerObj['size'] / 2)
        if (camerax + HALF_WINDOWWIDTH) - playerCenterx > CAMERASLACK:
            camerax = playerCenterx + CAMERASLACK - HALF_WINDOWWIDTH
        elif playerCenterx - (camerax +HALF_WINDOWWIDTH) > CAMERASLACK:
            camerax = playerCenterx - CAMERASLACK - HALF_WINDOWWIDTH
        if (cameray + HALF_WINDOWHEIGHT) - playerCentery > CAMERASLACK:
            cameray = playerCentery + CAMERASLACK - HALF_WINDOWHEIGHT
        elif playerCentery - (cameray +HALF_WINDOWHEIGHT) > CAMERASLACK:
            cameray = playerCentery - CAMERASLACK - HALF_WINDOWHEIGHT

        #Initial player positions and facing and making rect
        flashIsOn = round(time.time(), 1) * 10 % 2 == 1
        if not gameOverMode and not (invulnerableMode and flashIsOn):
            playerObj['rect'] = pygame.Rect((playerObj['x'] - (WINDOWWIDTH),
                                             playerObj['y'] - (STARTSIZE + FLOORSIZE - 5 ) - getBounceAmount(playerObj['bounce'] , BOUNCERATE, BOUNCEHEIGHT),
                                             playerObj['size'],
                                             playerObj['size']))
            DISPLAYSURF.blit(playerObj['surface'], playerObj['rect'])


        #detect when the keys are press and set their vars to True   
        for event in pygame.event.get():
            if event.type == QUIT:
                terminate()

            elif event.type == KEYDOWN:
                if event.key in (K_UP, K_w):
                    moveDown = False
                    moveUp = True
                elif event.key in (K_DOWN, K_s):
                    moveUp = False
                    moveDown = True
                elif event.key in (K_LEFT, K_a):
                    moveRight = False
                    moveLeft = True
                    if playerObj['facing'] == RIGHT:
                        playerObj['surface'] = pygame.transform.scale(L_Monster, (playerObj['size'], playerObj['size']))
                    playerObj['facing'] = LEFT
                elif event.key in (K_RIGHT, K_d):
                    moveLeft = False
                    moveRight = True
                    if playerObj['facing'] == LEFT:
                        playerObj['surface'] = pygame.transform.scale(R_Monster, (playerObj['size'], playerObj['size']))
                    playerObj['facing'] = RIGHT
                elif event.key in (K_SPACE, K_BACKSPACE):
                    spaceDown = True
                elif event.key in (K_LSHIFT, K_RSHIFT):
                    shiftDown = True
                elif winMode and event.key == K_r:
                    return

            #Detect when the key comes up and set the var to false   
            elif event.type == KEYUP:
                if event.key in (K_LEFT, K_a):
                    moveLeft = False
                elif event.key in (K_RIGHT, K_d):
                    moveRight = False
                elif event.key in (K_UP, K_w):
                    moveUp = False
                elif event.key in (K_DOWN, K_s):
                    moveDown = False 
                elif event.key in (K_SPACE, K_BACKSPACE):
                    spaceDown = False
                elif event.key in (K_LSHIFT, K_RSHIFT):
                    shiftDown = False     
                elif event.key == K_ESCAPE:
                    terminate()

    #declares the bird rect from the bird object
        birdsObj['rect'] = pygame.Rect((birdsObj['x'],
                                        birdsObj['y'],
                                        birdsObj['size'],
                                        birdsObj['size']))                   



        #Decide what way the bird has to go
        if birdsObj['x'] >= (WINDOWWIDTH +(STARTSIZE*2)):
            birdDir = 'left'
        elif birdsObj['x'] <= (0 - (STARTSIZE*2)):
            birdDir = 'right'
        #go that way    
        if birdDir == 'left':
            birdsObj['x'] -= 5
            if birdsObj['facing'] == RIGHT:
                birdsObj['surface'] = pygame.transform.scale(L_Bird, (playerObj['size'], playerObj['size']))
                birdsObj['facing'] = LEFT
        elif birdDir == 'right':
            birdsObj['x'] += 5
            if birdsObj['facing'] == LEFT:
                birdsObj['surface'] = pygame.transform.scale(R_Bird, (playerObj['size'], playerObj['size']))
                birdsObj['facing'] = RIGHT
        #draw the bird    
        DISPLAYSURF.blit(birdsObj['surface'], birdsObj['rect'])


        if playerObj['rect'].colliderect(birdsObj['rect']):
            gameOverMode = True



        #actually move the player            
        if not gameOverMode:
            if moveLeft and playerObj['x'] > (WINDOWWIDTH):
                playerObj['x'] -= MOVERATE
            if moveRight and playerObj['x'] <= ((WINDOWWIDTH*2) - STARTSIZE):
                playerObj['x'] += MOVERATE
#            if moveUp and playerObj['y'] > (0 + STARTSIZE * 2):
#                playerObj['y'] -= MOVERATE
            if moveDown and playerObj['y'] < WINDOWHEIGHT:
                playerObj['y'] += MOVERATE 
            if (moveLeft or moveRight or moveUp or moveDown) or playerObj['bounce'] != 0:
                playerObj['bounce'] += 1
            if moveLeft and spaceDown:
                BOUNCEHEIGHT = 400
            elif moveRight and spaceDown:
                 BOUNCEHEIGHT = 400
            else:
                BOUNCEHEIGHT = 30
            if moveLeft and shiftDown:
                MOVERATE = 18
            elif moveRight and shiftDown:
                MOVERATE = 18
            else:
                MOVERATE = 9

            if playerObj['bounce'] > BOUNCERATE:
                playerObj['bounce'] = 0 



        *else:
            # game is over, show "game over" text
            DISPLAYSURF.blit(gameOverSurf, gameOverRect)
            print (gameOverMode)          
            if time.time() - gameOverStartTime > GAMEOVERTIME:
                return*




        if winMode:
            DISPLAYSURF.blit(winSurf, winRect)
            DISPLAYSURF.blit(winSurf2, winRect2)


        pygame.display.update()
        FPSCLOCK.tick(FPS)

person ddaniels    schedule 17.04.2013    source источник
comment
Вам действительно нужно делать отступы, если вы хотите, чтобы кто-нибудь ответил.   -  person ThisIsAQuestion    schedule 17.04.2013
comment
Код с отступом. Это именно то, как это работает   -  person ddaniels    schedule 17.04.2013
comment
Все, что я сделал, это оставил то, что не повлияет на работу игры. как функции   -  person ddaniels    schedule 17.04.2013
comment
Должно быть, меня это беспокоит. Все строки начинаются с одного и того же места, но я вошел в режим редактирования, и все выглядит нормально.   -  person ThisIsAQuestion    schedule 17.04.2013


Ответы (1)


Вы рисуете текст окончания игры, но затем не обновляете отображение до тех пор, пока цикл не начнется заново (так что текст окончания игры, вероятно, отображается только для 1 кадра). Попробуйте что-то вроде этого:

else:
    # game is over, show "game over" text
    gameOverStartTime = time.time()
    DISPLAYSURF.blit(gameOverSurf, gameOverRect)
    pygame.display.update()
    print (gameOverMode)          
    while time.time() - gameOverStartTime < GAMEOVERTIME:
        pass

Это нарисует текст окончания игры, обновит экран, а затем зациклится, пока вы не превысите количество времени, определенное GAMEOVERTIME (что я не думаю, что вы на самом деле где-то делаете, по крайней мере, не в опубликованном вами коде) . Обратите внимание, что этот цикл, который я вам дал, не позволит вам обрабатывать какие-либо входные события или что-либо еще до истечения отведенного времени, но он гарантирует, что текст завершения игры будет отображаться на экране в течение того времени, которое вы хотеть.

person Haz    schedule 17.04.2013