簡體   English   中英

Pygame:如何在不按下任何鍵時使精靈面向同一方向

[英]Pygame: How to make sprites face the same direction when no key is pressed

我的角色能夠正常移動。 然而,當沒有按鍵被按下時,就會出現問題。 如何在沒有按下 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")

主要的()

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

移動播放器()

    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)

重繪游戲窗口()

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() 函數來嘗試存儲最后按下的鍵,但無濟於事。 對此的任何幫助將不勝感激,謝謝。

問題是,當釋放鍵時,狀態board.leftboard.rightboard.upboard.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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM