Ошибка Pygame: pygame.error: отображение поверхности завершено - PullRequest
0 голосов
/ 14 января 2020

Итак, я создал Python игру Tetris на основе учебника Youtube: https://www.youtube.com/watch?v=zfvxp7PgQ6c&t=2075s

Но происходит ошибка pygame.error: display Surface.

I пытался добавить "break", "sys.exit ()", "QUIT" после pygame.quit, но не работает.

Кто-нибудь знает, как решить эту проблему? Вот код: (Вы можете перейти к def main_menu)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run == False

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    current_piece.x -= 1
                    if not (valid_space(current_piece, grid)):
                        current_piece.x += 1
                if event.key == pygame.K_RIGHT:
                    current_piece.x += 1
                    if not (valid_space(current_piece, grid)):
                        current_piece.x -= 1
                if event.key == pygame.K_DOWN:
                    current_piece.y += 1
                    if not (valid_space(current_piece, grid)):
                        current_piece.y -= 1
                    if event.key == pygame.K_UP:
                        current_piece.rotation += current_piece.rotation + 1 % len(current_piece.shape)
                    if not (valid_space(current_piece, grid)):
                        current_piece.rotation -= 1

                    shape_pos = convert_shape_format(current_piece)

                    for i in range(len(shape_pos)):
                        x, y = shape_pos[i]
                    if y > -1:
                        grid[y][x] = current_piece.color

                    if change_piece:
                        for pos in shape_pos:
                         p = (pos[0], pos[1])
                    locked_positions[p] = current_piece.color
                    current_piece = next_piece
                    next_piece = get_shape()
                    change_piece = False
                    score += clear_rows(grid, locked_positions) * 10

                    draw_window(win, grid, score, last_score)
                    draw_next_shape(next_piece, win)
                    pygame.display.update()

                    if check_lost(locked_positions):
                        draw_text_middle(win, "You Lost!", 80, (255,255,255))
                        pygame.display.update()
                        pygame.time.delay(1500)
                        run = False
                        update_score(score)
def main_menu(win):
    run = True
    while run:
        win.fill((0,0,0))
        draw_text_middle(win, 'Press any key to play', 60, (255,255,255))
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                pygame.display.quit()
                sys.exit()

            if event.type == pygame.KEYDOWN:
                main(win)

    pygame.display.QUIT()

win = pygame.display.set_mode((s_width, s_height))
pygame.display.set_caption('Tetris')
main_menu(win)

Обновленный код:

def main_menu(win):
    run = True
    while run:
        win.fill((0,0,0))
        draw_text_middle(win, 'Press any key to play', 60, (255,255,255))
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            pygame.quit()
            quit()

            if event.type == pygame.KEYDOWN:
                main(win)

    pygame.quit()

win = pygame.display.set_mode((s_width, s_height))
pygame.display.set_caption('Tetris')
main_menu(win)

1 Ответ

0 голосов
/ 15 января 2020
  1. В вашем main_menu l oop вы указываете его на l oop, а локальный логический запуск == True. Это нормально, но вы должны, поскольку люди, упомянутые в комментариях, делают pygame.quit() и, необязательно, quit() (закрывает окно) вместо pygame.display.quit() и sys.exit(), которые у вас есть прямо сейчас.

  2. Вторая проблема возникает, если вы запускаете игру, заходя в основной l oop. Я предполагаю, что основной l oop выполняет вашу функцию событий, показанную вверху?

    В зависимости от того, как вы написали код, логический запуск в функции события является локальным. Это означает, что он не изменит значение прогона, который вы используете в вашем основном l oop (и не изменит его в main_menu l oop). Я бы предложил перенести в OOP и вместо этого создать логическое значение self.run, иначе вам нужно, чтобы логическое значение выполнялось глобально.

    И вы должны в функции события написать это вместо того, что у вас сейчас вверху:

    for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                pygame.quit()
                quit()
    

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...