为什么这个循环 运行 不正确?

Why doesn't this loop run properly?

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()

我预计该循环会 运行,但您遇到了未报告类型不匹配的情况。

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

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

我查看了你的回购协议,相关代码是这样的,在 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,它会再次从事件队列中获取所有事件并清除它。

因此,当 QUIT 事件在事件队列中时 pygame.event.get()Player.move_player 中被调用时,它实际上丢失了,因为您没有在此处理它for 循环。当在 main 中再次调用 pygame.event.get() 时,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

并删除 Player.move_player