Pygame рендеринг текста, ничего не показывает - PullRequest
1 голос
/ 04 апреля 2020

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

При чтении кода я бы посоветовал искать конец и функцию потерь.

import pygame
pygame.init()
pygame.font.init()
screen = pygame.display.set_mode([1000, 1000])
pygame.display.set_caption("TicTac")

x, y = 490, 500
width, height = 25, 25
vol = 25
run = True
left = False
right = False
up = False
down = False

font = pygame.font.Font('freesansbold.ttf', 32) 

def loss(msg, color):
    screen_text = font.render(msg, False, color)
    screen.blit(screen_text, [500, 500])

def redraw():
    # clear dispalydisplay_surface = pygame.display.set_mode((X, Y )) 
    screen.fill((0, 0, 0))  
    # draw the scene
    pygame.draw.rect(screen, (0, 255, 0), (x, y, width, height))

    # update display
    pygame.display.flip() 
start_ticks=pygame.time.get_ticks()

while run:
    pygame.time.delay(100)
    seconds=(pygame.time.get_ticks()-start_ticks)/1000
    # handle events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        events = pygame.event.get()
       if event.type == pygame.KEYDOWN:

            if event.key == pygame.K_LEFT:
                x -= vol
                left = True
                right = False
                up = False
                down = False
                width += 25

            elif event.key == pygame.K_RIGHT:
                x += vol
                left = False
                right = True
                up = False
                down = False
                width += 25

            elif event.key == pygame.K_UP:
                y -= vol
                left = False
                right = False
                up = True
                down = False
                height += 25

            elif event.key == pygame.K_DOWN:
                y += vol
                height += 25                
                left = False
                right = False
                up = False
                down = True 


    #Loss Zone
    if x >= 1000 or y >= 1000 or x <= 0 or y <= 0:
        loss("GAME OVER", (250, 0, 0))
        pygame.time.delay(5000)
        run = False 
    redraw()
    vol = 25
    width, height = 25, 25
    print(seconds)
pygame.quit()

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Не используйте pygame.time.delay() в игре l oop. Добавить состояние game_over. Установите состояние по окончании игры:

game_over = x >= 1000 or y >= 1000 or x <= 0 or y <= 0

И делайте разные вещи в основном приложении l oop в зависимости от состояния:

if not game_over:
    # draw game scene
else:
    # draw game over screen

См. Пример:

game_over = False
while run:
    pygame.time.delay(100)
    seconds=(pygame.time.get_ticks()-start_ticks)/1000
    # handle events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            if not game_over:
                if event.key == pygame.K_LEFT:
                    x -= vol; width += 25
                    left, right, up, down = True, False, False, False
                elif event.key == pygame.K_RIGHT:
                    x += vol; width += 25
                    left, right, up, down = False, True, False, False
                elif event.key == pygame.K_UP:
                    y -= vol; height += 25
                    left, right, up, down = False, False, True, False
                elif event.key == pygame.K_DOWN:
                    y += vol; height += 25                
                    left, right, up, down = False, False, False, True

    if not game_over:
        game_over = x >= 1000 or y >= 1000 or x <= 0 or y <= 0
        if game_over:
            game_over_time = pygame.time.get_ticks()
        redraw()
        vol, width, height = 25, 25, 25

    else: 
        if pygame.time.get_ticks() > game_over_time + 5000:
            run = False       
        screen.fill((0, 0, 0)) 
        loss("GAME OVER", (250, 0, 0))
        pygame.display.flip() 
1 голос
/ 04 апреля 2020

Вы рисуете текст на экране, затем очищаете экран. Просто переместите redraw() выше, где вы звоните loss()

redraw()
if x >= 1000 or y >= 1000 or x <= 0 or y <= 0:
        loss("GAME OVER", (250, 0, 0))
        pygame.time.delay(5000)
        run = False 
vol = 25
width, height = 25, 25
print(seconds)
...