Избавьтесь от множества четных петель обработки.Используйте один цикл для обработки всех событий.
Далее достаточно один раз инициировать отображение (pygame.display.init()
)
Создать переменную speed
, которая определяет числопикселей, положение изображения меняется с каждым шагом
Сначала оцените событие pygame.QUIT
и прекратите запуск основного цикла, когда событие произойдет:
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
Затем обработайте другие событиякак pygame.KEYDOWN
и pygame.KEYUP
.
Для непрерывного движения манипулирование позицией игрока должно выполняться вне цикла событий.Если бы он был в цикле, положение игрока изменилось бы только в случае события.Примечание: используйте небольшую «скорость» (speed = 1
), в противном случае игрок быстро переместился бы из окна.
for event in pygame.event.get():
# event handling
if keys[0]:
playerpos[1]-=speed
elif keys[2]:
playerpos[1]+=speed
if keys[1]:
playerpos[0]-=speed
elif keys[3]:
playerpos[0]+=speed
Выполните отрисовку сцены в конце основного цикла:
speed = 1
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
elif event.type == pygame.KEYDOWN:
if event.key==pygame.K_RETURN:
done = True
for i in range(4):
if event.key == (K_w, K_a, K_s, K_d)[i]:
keys[i]=True
elif event.type == pygame.KEYUP:
for i in range(4):
if event.key == (K_w, K_a, K_s, K_d)[i]:
keys[i]=False
if keys[0]:
playerpos[1]-=speed
elif keys[2]:
playerpos[1]+=speed
if keys[1]:
playerpos[0]-=speed
elif keys[3]:
playerpos[0]+=speed
screen.fill(0)
screen.blit(background,(0,0))
screen.blit(player,playerpos)
pygame.display.flip()
Обратите внимание, в качестве альтернативы вы можете использовать pygame.key.get_pressed()
, чтобы получить все состояния всех кнопок клавиатуры одновременно.Таким образом, вам не нужно оценивать ключевые события отдельно:
speed = 1
done = False
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
done = True
allKeys = pygame.key.get_pressed()
playerpos[0] += -speed if allKeys[K_a] else speed if allKeys[K_d] else 0
playerpos[1] += -speed if allKeys[K_w] else speed if allKeys[K_s] else 0
screen.fill(0)
screen.blit(background,(0,0))
screen.blit(player,playerpos)
pygame.display.flip()