#python #pygame
#python #pygame
Вопрос:
Я пишу шутер сверху вниз и недавно пытался найти способ непрерывно перемещать моего персонажа, удерживая нажатой клавишу. Я искал способ в Интернете и обнаружил pygame.key.get_pressed()
, что это отлично работало, пока я не попытался создать границы, чтобы вы не могли выходить за пределы экрана. Я в основном разобрался с проблемой, заключающейся в том, что пока вы удерживаете клавиши перемещения, pygame не может проверить координаты x и y вашего проигрывателя, поэтому он позволяет игроку выходить за границы, даже если вы добавляете что-то вроде if x >= 0:
.
Я спрашиваю, есть ли способ создать границу для сторон экрана, удерживая кнопку перемещения нажатой с помощью pygame.key.get_pressed()
, или если есть хорошая альтернатива для перемещения.
Часть кода :
if eventHandler == "LEVEL1":
# SEE IF PLAYER QUIT AND PROCEED TO QUIT
for event in pygame.event.get():
if event.type == pygame.QUIT:
loop = False
if event.type == pygame.KEYDOWN:
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
movingUP = True
if keys[pygame.K_DOWN]:
movingDOWN = True
if keys[pygame.K_LEFT]:
movingLEFT = True
if keys[pygame.K_RIGHT]:
movingRIGHT = True
if event.type == pygame.KEYUP:
movingUP = False
movingDOWN = False
movingLEFT = False
movingRIGHT = False
x_change = 0
y_change = 0
if movingUP == True:
y_change -= 5
if movingDOWN == True:
y_change = 5
if movingLEFT == True:
x_change -= 5
if movingRIGHT == True:
x_change = 5
# UPDATES EVERY TIME GAME LOOPS
pygame.display.update()
clock.tick(60)
x = x_change
y = y_change
if eventHandler == "LEVEL1":
w.blit(level1map, (0, 0))
w.blit(player, (x, y))
pygame.display.update()
Я уже пробовал добавлять (с 16 в качестве границы)
if x >= 16:
x_change = 0
movingLEFT = 0
и так далее со всеми указаниями. Я пробовал это практически везде, где это имело бы смысл в коде. Я также пытался поместить
if keys[pygame.K_LEFT] and x >= 16:
movingLEFT = True
«и переменная >= граница» везде, где это может создать границу, но по-прежнему никаких результатов.
Есть какой-нибудь способ создать границу, которая работает, или альтернатива для перемещения?
Ответ №1:
[…] пока вы удерживаете клавиши перемещения, pygame не может проверить координаты x и y вашего проигрывателя, […]
Нет.
Пока вы удерживаете клавиши перемещения, никакого события не происходит. Существует одно pygame.KEYDOWN
событие при нажатии клавиши и одно pygame.KEYUP
событие при отпускании клавиши.
Но при нажатии клавиши не происходит событий continuously.
Он идеально подходит для получения нажатой клавиши в цикле событий с помощью ( pygame.key.get_pressed()
) и для изменения состояния управляющих переменных movingUP
, movingDOWN
, movingLEFT
movingRIGHT
. Значения, которые возвращаются с помощью pygame.key.get_pressed()
, обновляются при обработке события с помощью pygame.event.get()
.
Но проверка границ должна выполняться в каждом кадре, каждый раз, когда позиция ( x
, y
) была изменена. Это должно выполняться в основном игровом цикле, а не в цикле событий:
maxX = # screenWidth - playerWidth
maxY = # screenHeight - playerHeight
while loop:
if eventHandler == "LEVEL1":
# SEE IF PLAYER QUIT AND PROCEED TO QUIT
for event in pygame.event.get():
if event.type == pygame.QUIT:
loop = False
if event.type == pygame.KEYDOWN:
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
movingUP = True
# [...]
if movingUP == True:
y_change -= 5
# [...]
x = x_change
y = y_change
if x < 0:
x = 0
x_change = 0
elif x > maxX
x = maxX
x_change = 0
if y < 0:
y = 0
y_change = 0
elif y > maxY
y = maxY
y_change = 0