为什么此循环无法正常运行?

时间:2018-07-16 11:09:38

标签: python loops pygame exit

while g.running:
    for event in pygame.event.get():
        if event == pygame.QUIT:
            g.running = False
    g.run(Player_1)

quit()

当我运行此循环时,它会完全跳过for循环,或者只执行一次,对我来说运行太快而无法继续运行。如何使循环工作正常? https://github.com/maartenww/100daysOfCode_projectOne <<,以获取完整代码。

此外,g.run基本上所做的只是更新游戏。因此它绘制和/或移动所有精灵,将文本绘制到屏幕上并进行一些计算

class Game:
    def __init__(self):
        self.running = True

    def run(self, player_1):
        self.border_col(player_1)
        self.load_text(player_1)
        self.update_game(player_1)

    def update_game(self, player_1):
        clock.tick(FPS)
        gameDisplay.fill(black)
        gameDisplay.blit(self.xcolon, (0, 0))
        gameDisplay.blit(self.actual_x, (25, 0))
        gameDisplay.blit(self.ycolon, (0, 30))
        gameDisplay.blit(self.actual_y, (25, 30))
        gameDisplay.blit(self.acolon, (0, 60))
        gameDisplay.blit(self.actual_a, (25, 60))
        gameDisplay.blit(self.vcolon, (0, 90))
        gameDisplay.blit(self.actual_v, (25, 90))
        all_sprites.draw(gameDisplay)
        Player.move_player(player_1)
        Player.update_player(player_1)
        pygame.display.update()

2 个答案:

答案 0 :(得分:3)

我调查了您的存储库,在player.py中显示了相关代码:

def move_player(self):
    for event in pygame.event.get():
        # Player movement
        if (event.type == pygame.KEYDOWN):
            if (event.key == pygame.K_d):
                self.player_acc = PLAYER_ACC

            if (event.key == pygame.K_a):
                self.player_acc = -PLAYER_ACC

        if (event.type == pygame.KEYUP):
            if (event.key == pygame.K_d):
                self.player_acc = 0

            if (event.key == pygame.K_a):
                self.player_acc = 0

考虑一下主循环中发生的事情:

while g.running:
    for event in pygame.event.get():
        if (event.type == pygame.QUIT):
            g.running = False
    g.run(Player_1)

您从事件队列中获取了所有事件,将其清除,然后检查QUIT

然后您调用g.run,这将调用self.update_game,这将调用Player.move_player,这将再次从事件队列中获取所有事件并清除它。

因此,当QUITpygame.event.get()内部被调用时,Player.move_player事件在事件队列中时,它实际上丢失了,因为您不在此{{ 1}}循环。然后在for中再次调用pygame.event.get()时,main事件不再在队列中(因为调用QUIT会清除队列)。

基本上,每个主循环迭代应只调用一次“ event.get”(对于event.get / pygame.display.flip也是如此)。

也许将pygame.display.update中的循环更改如下:

main

将此添加到while g.running: for event in pygame.event.get(): g.handle(event, Player_1) g.run(Player_1)

Game

并将其发送到def handle(self, event, player_1): if event.type == pygame.QUIT: self.running = False else: player_1.handle(event)

Player

并删除def handle(self, event): # Player movement if (event.type == pygame.KEYDOWN): if (event.key == pygame.K_d): self.player_acc = PLAYER_ACC if (event.key == pygame.K_a): self.player_acc = -PLAYER_ACC if (event.type == pygame.KEYUP): if (event.key == pygame.K_d): self.player_acc = 0 if (event.key == pygame.K_a): self.player_acc = 0

答案 1 :(得分:1)

我希望循环能够运行,但是您遇到了一种类型不匹配的情况,没有得到报告。

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

event将是pygame.event.Event对象。您要检查的QUIT值是可能出现在event.type属性中的值。由于没有事件是整数值QUIT,因此所有事件都将被忽略。您可能想添加一个else子句以诊断接收到但未处理的事件。