Создание границ при использовании pygame.key.get_pressed()

#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