окно python pygame не закроется «не отвечает»

#python #pygame

Вопрос:

Я пытаюсь создать окно python для своей игры со своего ноутбука в pygame… однако, когда я пытаюсь закрыть окно, я получаю сообщение об ошибке «не отвечает», я не уверен, почему, если бы я думал, что все сделал правильно…. код ниже, требуется любая помощь. Спасибо!

 import pygame
from sys import exit
pygame.init()
screen = pygame.display.set_mode((800,400))

clock = pygame.time.Clock()
sky_surface = pygame.image.load("bg_desert.png").convert()
snail_surface = pygame.image.load("snailWalk1.png").convert_alpha()
player_surf = pygame.image.load("p1_walk01.png")

snail_x_pos = 600



while True:
    pygame.time.set_timer(snail_x_pos, 100)

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

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                print("hello")
        snail_x_pos -=4
        if snail_x_pos < -100: snail_x_pos = 800
        
        screen.blit(sky_surface,(0,0))
        
        screen.blit(snail_surface,(snail_x_pos,350))

        screen.blit(player_surf,(80, 200))
        pygame.display.update()
        clock.tick(60)
       

 

Комментарии:

1. вы запускаете его непосредственно в системе в консоли python script.py или в каком IDE -либо /редакторе? Может быть, в этом и есть проблема IDE .

2. вы должны использовать set_timer только один раз (перед циклом), и он будет отправлять событие снова и снова все время. Теперь вы запускаете его в каждом цикле, чтобы он создавал новый процесс с отправкой события снова и снова. После 100 циклов у вас есть 100 процессов, которые будут отправлять событие снова и снова.

3. похоже, вы используете позицию улитки в set_timer — так что вы не понимаете, как ее использовать. Это должно быть set_time(my_event_ID, milliseconds) и в for event in pygame.event.get(): вас, проверьте if event.type = my_event_ID: ...code... , и это будет повторяться ...code... каждый раз, когда используется в set_timer

Ответ №1:

Все проблемы делают

  pygame.time.set_timer(snail_x_pos, 100)
 

который вы запускаете внутри цикла.

Если я его удалю, он закроется без проблем.

Каждый set_timer создает новый таймер, который отправляет event каждый 100ms (снова и снова). Если вы запустите его в цикле, то создадите сотни таймеров.

Вы должны запустить его только один раз — перед циклом — и он будет повторно отправлять событие, которое вы можете получить в for цикле.

Проблема также в том, что вы используете его неправильно — вы используете положение улитки, но оно должно user_id и время в миллисекундах.

 my_event_id = pygame.USEREVENT   1
pygame.time.set_timer(my_event_id, 500)  # 500ms = 0.5s
 

а позже вы сможете использовать его для перемещения улитки

     elif event.type == my_event_id:
        print('0.5 second')
        snail_x_pos -= 4
 

Вот моя версия с другими изменениями.

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

Я также использую pygame.Rect для сохранения положения и размера — это имеет полезные значения (т. Е. .center для получения/установки центрального положения) и функций (т. е. для обнаружения колик). Я использую .left и .right для перемещения змеи в правую часть окна, когда она покидает окно с левой стороны.

 import pygame

pygame.init()
screen = pygame.display.set_mode((800,400))

sky_surface = pygame.Surface((800, 100))
sky_surface.fill((0,0,255))
sky_surface_rect = sky_surface.get_rect()

snail_surface = pygame.Surface((100, 10))
snail_surface.fill((0,255,0))
snail_surface_rect = snail_surface.get_rect()
snail_surface_rect.x = 600
snail_surface_rect.y = 350

player_surf = pygame.Surface((10, 50))
player_surf.fill((255,0,0))
player_surf_rect = player_surf.get_rect()
player_surf_rect.x = 80
player_surf_rect.y = 200

clock = pygame.time.Clock()

my_event_id = pygame.USEREVENT   1
pygame.time.set_timer(my_event_id, 500)  # 500ms = 0.1s

while True:

    # - events -
    
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                print("hello")
                
        elif event.type == my_event_id:
            print('0.5 second')
            # move snake
            snail_surface_rect.x -= 4
            
            # use this event to slow down player
            pressed = pygame.key.get_pressed()
            if pressed[pygame.K_LEFT]:
                player_surf_rect.x -= 4
            elif pressed[pygame.K_RIGHT]:
                player_surf_rect.x  = 4

    # - updates -
    
    if snail_surface_rect.right < 0:
        snail_surface_rect.left = 800

    # - draw -
    
    screen.fill((0,0,0))  # clear screen
    screen.blit(sky_surface, sky_surface_rect)
    screen.blit(snail_surface, snail_surface_rect)
    screen.blit(player_surf, player_surf_rect)
    pygame.display.update()

    clock.tick(60)