Pygame: как заставить спрайты смотреть в одном направлении, когда ни одна клавиша не нажата - PullRequest
1 голос
/ 10 февраля 2020

Мой персонаж может двигаться правильно. Однако, когда ни одна клавиша не нажимается, возникает проблема. Как сделать так, чтобы при нажатии клавиши KEY спрайт не смотрел в том же направлении, в котором он был в последний раз? Например, если я нажму UP , он будет направлен вверх, а затем, когда я не нажму любую другую клавишу, он все еще будет смотреть вверх? То же самое с другими направлениями тоже. Кроме того, как бы я отобразил своего персонажа при первом запуске игры? Например, мой персонаж появляется только при нажатии клавиши и остается невидимым, когда нет.

Вот мой код:

Спрайты:

# Protagonist Sprites
protagR = [pygame.image.load("ASG2_Graphics/JoArrow_R1_1.png"), pygame.image.load("ASG2_Graphics/JoArrow_R1_2.png"), pygame.image.load("ASG2_Graphics/JoArrow_R1_3.png"), pygame.image.load("ASG2_Graphics/JoArrow_R1_2.png"), pygame.image.load("ASG2_Graphics/JoArrow_R1_1.png")]
protagL = [pygame.image.load("ASG2_Graphics/JoArrow_L1_1.png"), pygame.image.load("ASG2_Graphics/JoArrow_L1_2.png"), pygame.image.load("ASG2_Graphics/JoArrow_L1_3.png"), pygame.image.load("ASG2_Graphics/JoArrow_L1_2.png"), pygame.image.load("ASG2_Graphics/JoArrow_L1_1.png")]
protagU = [pygame.image.load("ASG2_Graphics/JoArrow_U1_1.png"), pygame.image.load("ASG2_Graphics/JoArrow_U1_2.png"), pygame.image.load("ASG2_Graphics/JoArrow_U1_3.png"), pygame.image.load("ASG2_Graphics/JoArrow_U1_2.png"), pygame.image.load("ASG2_Graphics/JoArrow_U1_1.png")]
protagD = [pygame.image.load("ASG2_Graphics/JoArrow_D1_1.png"), pygame.image.load("ASG2_Graphics/JoArrow_D1_2.png"), pygame.image.load("ASG2_Graphics/JoArrow_D1_3.png"), pygame.image.load("ASG2_Graphics/JoArrow_D1_2.png"), pygame.image.load("ASG2_Graphics/JoArrow_D1_1.png")]
# Bullet Sprites
bulletsP = [pygame.image.load("ASG2_Graphics/Bullet_1.png"), pygame.image.load("ASG2_Graphics/Bullet_2.png"), pygame.image.load("ASG2_Graphics/Bullet_3.png"), pygame.image.load("ASG2_Graphics/Bullet_4.png")]
bulletsE = [pygame.image.load("ASG2_Graphics/E_Bullet_1.png"), pygame.image.load("ASG2_Graphics/E_Bullet_2.png"), pygame.image.load("ASG2_Graphics/E_Bullet_3.png")]
# Enemy Sprites
enemyR = [pygame.image.load("ASG2_Graphics/Enemy_R1_1.png"), pygame.image.load("ASG2_Graphics/Enemy_R1_2.png"), pygame.image.load("ASG2_Graphics/Enemy_R1_3.png"), pygame.image.load("ASG2_Graphics/Enemy_R1_4.png"), pygame.image.load("ASG2_Graphics/Enemy_R1_5.png")]
enemyL = [pygame.image.load("ASG2_Graphics/Enemy_L1_1.png"), pygame.image.load("ASG2_Graphics/Enemy_L1_2.png"), pygame.image.load("ASG2_Graphics/Enemy_L1_3.png"), pygame.image.load("ASG2_Graphics/Enemy_L1_4.png"), pygame.image.load("ASG2_Graphics/Enemy_L1_5.png")]
enemyU = [pygame.image.load("ASG2_Graphics/Enemy_U1_1.png"), pygame.image.load("ASG2_Graphics/Enemy_U1_2.png"), pygame.image.load("ASG2_Graphics/Enemy_U1_3.png"), pygame.image.load("ASG2_Graphics/Enemy_U1_4.png"), pygame.image.load("ASG2_Graphics/Enemy_U1_5.png")]
enemyD = [pygame.image.load("ASG2_Graphics/Enemy_D1_1.png"), pygame.image.load("ASG2_Graphics/Enemy_D1_2.png"), pygame.image.load("ASG2_Graphics/Enemy_D1_3.png"), pygame.image.load("ASG2_Graphics/Enemy_D1_4.png"), pygame.image.load("ASG2_Graphics/Enemy_D1_5.png")]
# Background Sprite
bg = pygame.image.load("Star_Crusaders_MAP.png")

main ()

def main():
    board = player(30, 45, 64, 64, 0)
    while True:
        movePlayer(board) 

класс игрока ():

class player():
    def __init__(self, x, y, width, height, walkCount):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 5
        self.up = False
        self.down = False
        self.left = False
        self.right = False
        self.up = False
        self.down = False
        self.walkCount = walkCount

movePlayer ()

    def movePlayer(board):
        clock = pygame.time.Clock()
        run = True

        while run:
            clock.tick(15)

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

            arrowKeys = pygame.key.get_pressed()
            if arrowKeys[pygame.K_LEFT] and board.x > 25 + board.vel:
                board.x -= board.vel
                board.left = True
                board.right = False
                board.up = False
                board.down = False
            elif arrowKeys[pygame.K_RIGHT] and board.x < 485 - board.width - board.vel:
                board.x += board.vel
                board.right = True
                board.left = False
                board.up = False
                board.down = False
            elif arrowKeys[pygame.K_UP] and board.y > 40 + board.vel:
                board.y -= board.vel
                board.right = False
                board.left = False
                board.up = True
                board.down = False
            elif arrowKeys[pygame.K_DOWN] and board.y < 450 - board.height - board.vel:
                board.y += board.vel
                board.right = False
                board.left = False
                board.up = False
                board.down = True
            elif arrowKeys[pygame.K_ESCAPE]:  # ESC key
                stopGame()
            else:
                board.right = False
                board.left = False
                board.up = False
                board.down = False
                board.walkCount = 0

            redrawGameWindow(board)

redrawGameWindow ()

def redrawGameWindow(board):
    window.blit(bg, (0,0))
    dest = (board.x, board.y)

    if board.walkCount + 1 >= 30:
        board.walkCount = 0
    if board.left:
        window.blit(protagL[0], dest)
        # currentSprite = protagL[0]
    elif board.right:
        window.blit(protagR[0], dest)
        # currentSprite = protagR[0]
    elif board.up:
        window.blit(protagU[0], dest)
        # currentSprite = protagU[0]
    elif board.down:
        window.blit(protagD[0], dest)
        # currentSprite = protagD[0]
    # stillSprite(currentSprite, board)
    pygame.display.update()

Как видите, Я попытался иметь переменную currentSprite () и функцию stillSprite (), чтобы попытаться сохранить последнюю нажатую клавишу, но безрезультатно. Спасибо за любую помощь в этом, спасибо.

1 Ответ

3 голосов
/ 10 февраля 2020

Проблема в том, что состояния board.left, board.right, board.up, board.down сбрасываются при отпускании клавиши, потому что движение должно быть остановлено. Поскольку изображение должно сохранять направление, эти состояния не могут быть использованы для этого требования. Вы должны добавить дополнительное состояние.

Укажите клавишу, которая была нажата последней в атрибуте (например: board.last_key):

arrowKeys = pygame.key.get_pressed()
if arrowKeys[pygame.K_LEFT] and board.x > 25 + board.vel:
    board.x -= board.vel
    board.left, board.right, board.up, board.down = True, False, False, False
    board.last_key = pygame.K_LEFT
elif arrowKeys[pygame.K_RIGHT] and board.x < 510 - board.width - board.vel:
    board.x += board.vel
    board.left, board.right, board.up, board.down = False, True, False, False
    board.last_key = pygame.K_RIGHT
elif arrowKeys[pygame.K_UP] and board.y > 40 + board.vel:
    board.y -= board.vel
    board.left, board.right, board.up, board.down = False, False, True, False
    board.last_key = pygame.K_UP
elif arrowKeys[pygame.K_DOWN] and board.y < 450 - board.height - board.vel:
    board.y += board.vel
    board.left, board.right, board.up, board.down = False, False, False, True
    board.last_key = pygame.K_DOWN
elif arrowKeys[pygame.K_ESCAPE]:  # ESC key
    stopGame()
else:
    board.left, board.right, board.up, board.down = False, False, False, False
    board.walkCount = 0

Выберите изображение в зависимости от board.last_key:

def redrawGameWindow(board):
    window.blit(bg, (0,0))
    dest = (board.x, board.y)

    if board.walkCount + 1 >= 30:
        board.walkCount = 0
    if board.last_key == pygame.K_LEFT:
        window.blit(protagL[0], dest)
        # currentSprite = protagL[0]
    elif board.last_key == pygame.K_RIGHT:
        window.blit(protagR[0], dest)
        # currentSprite = protagR[0]
    elif board.last_key == pygame.K_UP:
        window.blit(protagU[0], dest)
        # currentSprite = protagU[0]
    elif board.last_key == pygame.K_DOWN:
        window.blit(protagD[0], dest)
        # currentSprite = protagD[0]
    # stillSprite(currentSprite, board)
    pygame.display.update()
...