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 播放器():
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)
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() 函数来尝试存储最后按下的键,但无济于事。如有任何帮助,我们将不胜感激,谢谢。
问题是,当释放键时状态 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()
我的角色可以正常移动了。但是,当没有按键被按下时,问题就出现了。当没有按下 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 播放器():
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)
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() 函数来尝试存储最后按下的键,但无济于事。如有任何帮助,我们将不胜感激,谢谢。
问题是,当释放键时状态 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()