Проблема заключается в нескольких циклах событий. Обратите внимание, pygame.event.get()
удаляет события из квеста. Таким образом, только первый l oop получит события, второй l oop не получит никакого события. Получайте события только один раз за кадр:
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameExit = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
gameExit = True
gameOver = False
if event.key == pygame.K_RIGHT:
lead_x_change = block_size
lead_y_change = 0
# [...]
Более того, никогда не называйте игру l oop рекурсивно и никогда не реализуйте игру l oop в игре l oop. У вас есть игра l oop, используйте ее. Если игра окончена, тогда установите gameOver = True
. Нарисуйте сцену в зависимости от состояния gameOver
:
if gameOver == True:
gameDisplay.fill(white)
message_to_screen("Game over press c to play again or Q to quit",red)
else:
# [...]
gameDisplay.fill(white)
pygame.draw.rect(gameDisplay,red,[lead_x,lead_y,block_size,block_size])
Сброс состояния игры, когда игра окончена и нажата c
if event.key == pygame.K_c and gameOver :
gameOver = False
lead_x = display_width/2
lead_y = display_height/2
lead_x_change = 0
lead_y_change = 0
gameloop
:
def gameLoop():
gameExit = False
gameOver = False
lead_x = display_width/2
lead_y = display_height/2
lead_x_change = 0
lead_y_change = 0
while not gameExit:
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameExit = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
gameExit = True
gameOver = False
if event.key == pygame.K_c and gameOver:
gameOver = False
lead_x = display_width/2
lead_y = display_height/2
lead_x_change = 0
lead_y_change = 0
if event.key == pygame.K_RIGHT:
lead_x_change = block_size
lead_y_change = 0
elif event.key == pygame.K_LEFT:
lead_x_change = -block_size
lead_y_change = 0
elif event.key == pygame.K_UP:
lead_y_change = -block_size
lead_x_change = 0
elif event.key == pygame.K_DOWN:
lead_y_change = block_size
lead_x_change = 0
if gameOver == True:
gameDisplay.fill(white)
message_to_screen("Game over press c to play again or Q to quit",red)
else:
if lead_x <=0 or lead_x >= display_width or lead_y <= 0 or lead_y >= display_height:
gameOver = True
lead_x += lead_x_change
lead_y += lead_y_change
gameDisplay.fill(white)
pygame.draw.rect(gameDisplay,red,[lead_x,lead_y,block_size,block_size])
pygame.display.update()
clock.tick(FPS)
pygame.quit()
quit()