#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)