Как заставить изображение прыгать только по земле? - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь сделать скачок изображения. I, когда я нажимаю стрелку вверх, он идет вверх, пока не достигнет определенного положения на оси Y, и начнет спускаться. Но у меня проблема, изображение может бесконечно прыгать в воздухе, как летящая птица. Я бы хотел, чтобы он мог прыгать только тогда, когда он достигнет прыжка. Вот мой код на данный момент:

#Variables
display_width = 900
display_height = 800
gameName = 'Slash'

#Settings
gameTitle = pygame.display.set_caption(gameName)
wn = pygame.display.set_mode((display_width, display_height))
clock = pygame.time.Clock()

#Game Loop
def gameLoop():
   #stick man
    manImg = pygame.image.load('blueStickman.png')
    man_width = 58
    man_height = 146
    Xchange = 0
    Ychange = 0
    x = (display_width/2) - (man_width/2) + 1
    y = display_height - man_height
    def man(x,y):
        wn.blit(manImg, (x,y))
    while True:
        wn.fill(white)
        man(x,y)
        pygame.display.update()

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

            if event.type == pygame.KEYDOWN:   
                if event.key == pygame.K_x:
                    pygame.display.quit()
                    pygame.quit()

                if event.key == pygame.K_UP:
                        Ychange = -5
                if event.key == pygame.K_LEFT:
                    Xchange = -4
                if event.key == pygame.K_RIGHT:
                    Xchange = 4

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP:
                        Ychange = -5
                if event.key == pygame.K_LEFT:
                    Xchange = 0
                if event.key == pygame.K_RIGHT:
                    Xchange = 0           

        x += Xchange
        y += Ychange
        if y <= 385:
            Ychange = 5
        if y >= display_height - man_height:
            Ychange = 0

        clock.tick(60)

gameLoop()

Надеюсь, вы можете помочь, и спасибо, если сможете!

1 Ответ

1 голос
/ 29 мая 2020

Прежде всего я рекомендую использовать pygame.key.get_pressed() для перемещения игрока влево и вправо, а не события KEYDOWN и KEYUP:

keys = pygame.key.get_pressed()
Xchange = 0
if keys[pygame.K_LEFT]:
    Xchange -= 4
if keys[pygame.K_RIGHT]:
    Xchange += 4 

Определите уровень земли плательщика:

y = display_height - man_height
ground_y = y

Оцените, находится ли игрок на земле в основном приложении l oop и отмените прыжок, если игрок не на земле:

while True:
    # [...]

    on_ground = y == ground_y

    for event in pygame.event.get():
            # [...]

            if event.type == pygame.KEYDOWN:   
                # [...]

                if event.key == pygame.K_UP and on_ground:
                    Ychange = -5

См. Пример:

import pygame

white = (255, 255, 255)

#Variables
display_width = 900
display_height = 800
gameName = 'Slash'

#Settings
gameTitle = pygame.display.set_caption(gameName)
wn = pygame.display.set_mode((display_width, display_height))
clock = pygame.time.Clock()

#Game Loop
def gameLoop():
    #stick man
    manImg = pygame.image.load('blueStickman.png')
    man_width, man_height = 58, 156
    Xchange, Ychange = 0, 0
    x = (display_width/2) - (man_width/2) + 1
    y = display_height - man_height
    ground_y = y

    def man(x,y):
        wn.blit(manImg, (x,y))

    while True:
        wn.fill(white)
        man(x,y)
        pygame.display.update()

        on_ground = y == ground_y

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

            if event.type == pygame.KEYDOWN:   
                if event.key == pygame.K_x:
                    pygame.display.quit()
                    pygame.quit()

                if event.key == pygame.K_UP and on_ground:
                    Ychange = -5

        keys = pygame.key.get_pressed()
        Xchange = 0
        if keys[pygame.K_LEFT]:
            Xchange -= 4
        if keys[pygame.K_RIGHT]:
            Xchange += 4 

        x += Xchange
        y += Ychange
        if y <= 385:
            Ychange = 5
        if y >= display_height - man_height:
            Ychange = 0

        clock.tick(60)

gameLoop()
...