Создание границ при использовании pygame.key.get_pressed () - PullRequest
1 голос
/ 24 марта 2019

Я пишу шутер сверху вниз и недавно пытался найти способ непрерывного перемещения моего персонажа, удерживая нажатой клавишу. Я искал в интернете, чтобы найти способ, и нашел 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 Ответ

0 голосов
/ 24 марта 2019

[...], пока вы удерживаете клавиши перемещения, pygame не может проверить координаты x и y вашего игрока, [...]

No.

Пока вы удерживаете клавиши перемещения, никаких событий не происходит.Существует одно событие pygame.KEYDOWN, когда клавиша нажата, и одно событие pygame.KEYUP, когда клавиша отпущена.
Но при нажатии клавиши непрерывных событий не происходит.

Идеально подходит для получения нажатой клавиши в цикле событий с помощью (pygame.key.get_pressed()) и для изменения состояния управляющих переменных movingUP, movingDOWN, movingLEFT movingRIGHT.Значения, возвращаемые pygame.key.get_pressed(), обновляются, когда событие обрабатывается pygame.event.get().

Но проверка bounds должна выполняться в каждом кадре, каждый раз, когда позиция (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...