Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么这个循环不能正常运行?_Python_Loops_Pygame_Exit - Fatal编程技术网

Python 为什么这个循环不能正常运行?

Python 为什么这个循环不能正常运行?,python,loops,pygame,exit,Python,Loops,Pygame,Exit,当我运行这个循环时,它会完全跳过for循环,或者只运行一次,速度太快,我无法运行,它会继续运行。如何使循环正常工作? 我希望循环能够运行,但是您遇到了一个类型不匹配的情况,没有报告 class Game: def __init__(self): self.running = True def run(self, player_1): self.border_col(player_1) self.load_text(player_1

当我运行这个循环时,它会完全跳过for循环,或者只运行一次,速度太快,我无法运行,它会继续运行。如何使循环正常工作?
我希望循环能够运行,但是您遇到了一个类型不匹配的情况,没有报告

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

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

我希望循环会运行,但是您遇到了一个类型不匹配的情况,没有报告

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

事件将是一个对象。要检查的退出值可能出现在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
从事件队列中获取所有事件,清除它,然后检查是否退出

然后调用g.run,它将调用self.update\u game,它将调用Player.move\u Player,它将再次从事件队列中获取所有事件并将其清除

因此,当在Player.move\u Player内调用pygame.event.get时,退出事件在事件队列中,它实际上会丢失,因为您不在这个for循环中处理它。然后在main中再次调用pygame.event.get时,退出事件不再在队列中,因为调用event.get会清除队列

基本上,每个主循环迭代只需调用一次“event.get”,pygame.display.flip/pygame.display.update也是如此

可能会将main中的循环更改为以下内容:

while g.running:
    for event in pygame.event.get():
        if (event.type == pygame.QUIT):
            g.running = False
    g.run(Player_1)
将此添加到游戏中:

这是给玩家的:


然后移除玩家。移动玩家我查看了你的回购协议,相关代码如下,在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
从事件队列中获取所有事件,清除它,然后检查是否退出

然后调用g.run,它将调用self.update\u game,它将调用Player.move\u Player,它将再次从事件队列中获取所有事件并将其清除

因此,当在Player.move\u Player内调用pygame.event.get时,退出事件在事件队列中,它实际上会丢失,因为您不在这个for循环中处理它。然后在main中再次调用pygame.event.get时,退出事件不再在队列中,因为调用event.get会清除队列

基本上,每个主循环迭代只需调用一次“event.get”,pygame.display.flip/pygame.display.update也是如此

可能会将main中的循环更改为以下内容:

while g.running:
    for event in pygame.event.get():
        if (event.type == pygame.QUIT):
            g.running = False
    g.run(Player_1)
将此添加到游戏中:

这是给玩家的:


然后移除玩家。移动玩家

你能把它缩小到一个更小的可复制的例子吗?@doctorlove你的意思是什么?就目前而言,你发布的代码没有告诉我g是什么。当然,有些人可以去读你的github代码。但问题并不是完全独立的。如果你在github上修改代码,这个问题对未来的人们来说就没有意义了。你能提供一个游戏类的略读版本来展示同样的行为吗?还有另一个问题-你期待哪些事件?g.run系列是否会被反复调用,但最多只能调用一个事件?或者你是说它通过退出吗?@doctorlove啊,现在我明白了,你能把它缩小到一个更小的可复制的例子吗?@doctorlove你是什么意思?就目前而言,你发布的代码没有告诉我g是什么。当然,有些人可以去读你的github代码。但问题并不是完全独立的。如果你在github上修改代码,这个问题对未来的人们来说就没有意义了。你能提供一个游戏类的略读版本来展示同样的行为吗?还有另一个问题-你期待哪些事件?g.run系列是否会被反复调用,但最多只能调用一个事件?或者你是说它中途退出?@doctorlove啊现在我明白了,sureI添加了一个else语句,并让它打印事件。我发现它的循环非常不规则。换句话说,只有在某个特定的时间点按x按钮才有效,而这个时间是不可能的。我相信sloth找到了我没有彻底翻阅源代码回购的原因。@YannVernier您的答案也是有效的,因为问题中的代码显然有您在答案中描述的错误;但这在github回购协议中是正确的。我添加了一条else语句,并让它打印事件。我发现它的循环非常不规则。换句话说,只有当你在某个特定的时间点按x键时,它才会起作用,而这个时间是不可能的
“不要彻底地翻阅源repo。@YannVernier您的答案也是有效的,因为问题中的代码显然有您在答案中描述的bug;但是它在github repo中是正确的。我改变了这一点,但它给出了这个错误:回溯上一次调用:文件C:/ScrewAround/100DaysOfCodeProject1/main.py,第103行,在主文件C:/ScrewAround/100DaysOfCodeProject1/main.py,第98行,在主文件g.runPlayer\u 1文件C:/ScrewAround/100DaysOfCodeProject1/main.py,第58行,在运行self.update\u gameplayer\u 1文件C:/ScrewAround/100DaysOfCodeProject1/main.py,第50行,在update\u game Player.handleplayer\u 1 TypeError:handle缺少1个必需的位置参数:“event”从更新\u游戏中删除Player.handleplayer\u 1。请看我答案中的代码。主循环调用g.handleevent、Player_1和Game.handle调用Player_1.handleevent。但是精灵不再移动。@Maartenww是的,如果event.type==pygame.QUIT:行也应该从主循环中删除。我的错。我更改了答案。非常感谢,我现在明白答案了。感谢您的努力。@slothI对此进行了更改,但出现了以下错误:回溯上一次调用:文件C:/ScrewAround/100DaysOfCodeProject1/main.py,第103行,在主文件C:/ScrewAround/100DaysOfCodeProject1/main.py,第98行,在主文件g.runPlayer\u 1文件C:/ScrewAround/100DaysOfCodeProject1/main.py,第58行,在运行self.update\u gameplayer\u 1文件C:/ScrewAround/100DaysOfCodeProject1/main.py,第50行,在update\u game Player.handleplayer\u 1 TypeError:handle缺少1个必需的位置参数:“event”从更新\u游戏中删除Player.handleplayer\u 1。请看我答案中的代码。主循环调用g.handleevent、Player_1和Game.handle调用Player_1.handleevent。但是精灵不再移动。@Maartenww是的,如果event.type==pygame.QUIT:行也应该从主循环中删除。我的错。我更改了答案。非常感谢,我现在明白答案了。我感谢你的努力。@sloth
def handle(self, event, player_1):
    if event.type == pygame.QUIT:
        self.running = False
    else:
        player_1.handle(event)
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