Границы окон в pygame

В основном я пытаюсь добавить некоторые границы в небольшую игру, которую создаю, у меня есть спрайт, который может перемещаться только слева направо, и я пытаюсь предотвратить его перемещение за пределы окна игры, если спрайт достигает края, который они не может идти дальше и может пойти в противоположном направлении. Мой текущий код:

tankSprite = pygame.image.load('Sprites/Tank.png') #fixed apostrophe
tankSprite_width = 28


def tank(x,y):
    gameWindow.blit(tankSprite, (x,y))


def game_loop():
    x = (display_width * 0.45)
    y = (display_height * 0.8)
    x_change = 0

    gameExit = False
    gameMove = True

    while not gameExit and gameMove == True:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                 gameExit = False

            if event.type ==pygame.KEYDOWN:
               if event.key == pygame.K_LEFT:
                   x_change = -5
               if event.key == pygame.K_RIGHT:
                   x_change = 5
           if event.type == pygame.KEYUP:
               if event.key == pygame.K_LEFTor event.key == pygame.K_RIGHT:
                      x_change = 0
       x += x_change

       gameWindow.fill(white)
       tank(x,y)

       if x > display_width - tankSprite_width or x < 0:
            gameMove = False
       elif x < display_width - tankSprite_width or x > 0:
                gameMove = True

       pygame.display.update()
       clock.tick(60)


game_loop()
pygame.quit()
quit()

Мой текущий код частично работает, когда спрайт достигает края, решение закрывается, а не позволяет мне вернуться. Если я удалю:

pygame.quit()
quit()

Затем спрайт просто останавливается, и я не могу его вернуть. Некоторое время назад в одном из проектов я использовал что-то вроде:

if event.key == pygame.K_LEFT and sprite.x < 590:
        sprite.x += 5

Приведенный выше код работал хорошо, насколько я помню, но сейчас я не могу понять его для своего проекта, может ли кто-нибудь мне помочь, пожалуйста? Я хочу сделать так, чтобы спрайт не мог пройти за границу экрана, когда игрок достигает границы, он либо остается, либо возвращается в противоположном направлении. Спасибо

p.s. Извините за хитрое форматирование


person BluTac    schedule 05.02.2016    source источник


Ответы (1)


Просто разделите свой if-оператор и проверьте условие для каждого направления отдельно:

tankSprite = pygame.image.load('Sprites/Tank.png')
tankSprite_width = 28


def tank(x,y):
    gameWindow.blit(tankSprite, (x,y))


def game_loop():
    x = (display_width * 0.45)
    y = (display_height * 0.8)
    x_change = 0

    gameExit = False
    gameMove = True

    while not gameExit and gameMove == True:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                 gameExit = False

            if event.type ==pygame.KEYDOWN:
               if event.key == pygame.K_LEFT:
                   x_change = -5
               if event.key == pygame.K_RIGHT:
                   x_change = 5
           if event.type == pygame.KEYUP:
               if event.key == pygame.K_LEFTor event.key == pygame.K_RIGHT:
                      x_change = 0
        #valid move, add x_change
        if((x+x_change)> 0 and (x+x_change)<(display_width - tankSprite_width):
            x += x_change

        gameWindow.fill(white)
        tank(x,y)

#deleted stuff here

        pygame.display.update()
        clock.tick(60)


game_loop()
pygame.quit()
quit()

С помощью этого метода вам больше не нужно даже использовать переменную gameMove.

Вы также можете полностью избавиться от переменной x_change, просто применив изменения непосредственно к x.

Кроме того, я думаю, что вы могли иметь в виду gameExit = True под оператором if if event.type == pygame.QUIT:, поскольку имеет смысл выйти при запуске события pygame.QUIT.

person River    schedule 05.02.2016
comment
Спасибо за предложение! Я попробовал это, и это предотвращает перемещение спрайта за границу игры, что здорово, но единственная проблема заключается в том, что как только спрайт достигает границы, он не может вернуться, поэтому, например, если я переместу его на левую границу, я могу Затем используйте клавишу со стрелкой вправо, чтобы вернуться. Вы знаете, почему это могло быть? - person BluTac; 05.02.2016
comment
@HarryGray ах, да, это потому, что мой код предотвращает любое движение, когда спрайт достигает границы, позвольте мне исправить это, чтобы предотвратить движение только к границе. - person River; 06.02.2016
comment
Я добавил изменения, и он работает так, что спрайт не может выходить за границу, но вы все равно можете двигаться в противоположном направлении. Единственная проблема заключается в том, что теперь вам нужно нажимать клавиши со стрелками, чтобы переместить спрайт, вы не можете удерживать их, не могли бы вы предложить Гау, чтобы преодолеть это? Спасибо за помощь! - person BluTac; 06.02.2016
comment
О, это проблема с удалением x_change, которая мне не приходила в голову. Я думаю, что просто добавление нескольких else операторов будет работать ... - person River; 06.02.2016
comment
Ой, да ладно, разобрался, спасибо за помощь! - person BluTac; 06.02.2016
comment
@HarryGray, ладно. Я сделал правку, которая, думаю, тоже сработала бы. Рад, что смог помочь. - person River; 06.02.2016