在pygame中重新启动游戏时,计时器未正确启动且未重置

在pygame中重新启动游戏时,计时器未正确启动且未重置,pygame,Pygame,我在游戏中添加了一个计时器,当我按下“播放”按钮时,它会启动,当我死了,我点击“重新启动”按钮时,它会重新启动。以下是我面临的两个问题: 问题:单击“重新启动”时计时器未重置 问题:计时器在我运行程序时启动,即使我在游戏的while循环中编写了计时器代码 下面是游戏循环的函数 def menu(): ... while True: for event in pygame.event.get(): if event.type == pygame.QUIT:

我在游戏中添加了一个计时器,当我按下“播放”按钮时,它会启动,当我死了,我点击“重新启动”按钮时,它会重新启动。以下是我面临的两个问题:

  • 问题:单击“重新启动”时计时器未重置
  • 问题:计时器在我运行程序时启动,即使我在游戏的while循环中编写了计时器代码
  • 下面是游戏循环的函数

    def menu():
    ...
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit_game()
    
    
        print(int(pygame.time.get_ticks()/1000))
        output = "Time: {0}".format(pygame.time.get_ticks()/1000)
    
    
        keys = pygame.key.get_pressed()
    
        ...
    
        if player.colliderect(finish_line):
            print("You beat the game")
            print("You beat the game in", output, "seconds")
            return victory_screen
    
        # Drawing everything
        screen.fill(WHITE)
    
        text = font.render(output, True, BLACK)
        screen.blit(text, [1070, 30])
    
        pygame.draw.rect(screen, YELLOW, finish_line)
    
        for wall in walls:
            pygame.draw.rect(screen, BLACK, wall)
    
        for rect in rightredrects:
            pygame.draw.rect(screen, RED, rect)
    
        for rect in leftredrects:
            pygame.draw.rect(screen, RED, rect)
    
        for rect in upanddownredrects:
            pygame.draw.rect(screen, RED, rect)
    
        pygame.draw.rect(screen, GREEN, player)
    
    
        clock.tick(60)
        pygame.display.flip()
    
    以下是完整的代码(如果需要):

    import pygame
    import sys
    import time
    
    
    pygame.init()
    pygame.display.set_caption("Protostar")
    screen_width, screen_height = 1200, 600
    screen = pygame.display.set_mode((screen_width, screen_height))
    clock = pygame.time.Clock()
    BLUE = pygame.Color('dodgerblue3')
    ORANGE = pygame.Color('sienna3')
    BLACK = (0, 0, 0)
    WHITE = (255, 255, 255)
    RED = (255, 0, 0)
    GREEN = (13, 255, 0)
    DARK_GREEN = (0, 225, 0)
    BRIGHT_GREEN = (0, 255, 0)
    YELLOW = (255, 255, 0)
    font = pygame.font.Font(None, 25)
    frame_rate = 60
    image1 = pygame.image.load("/Users/xy/Desktop/menupy2.png")
    frame_count = 0
    start_time = 90
    
    
    class Walls(pygame.Rect):
    
        def __init__(self, x, y, w, h):
            super().__init__(x, y, w, h)
    
    
    class LeftRedRect(pygame.Rect):
    
        def __init__(self, x, y, w, h, vel):
            # Calling the __init__ method of the parent class
            super().__init__(x, y, w, h)
            self.vel = vel
    
        def update(self):
            self.x += self.vel  # Moving
            if self.right > 600 or self.left < 320:  # If it's not in this area
                self.vel = -self.vel  # Inverting the direction
    
    
    class RightRedRect(pygame.Rect):
    
        def __init__(self, x, y, w, h, vel):
            super().__init__(x, y, w, h)
            self.vel = vel
    
        def update(self):
            self.x += self.vel
            if self.right > 1180 or self.left < 620:
                self.vel = -self.vel
    
    
    class UpAndDownRedRect(pygame.Rect):
    
        def __init__(self, x, y, w, h, vel):
            super().__init__(x, y, w, h)
            self.vel = vel
    
        def update(self):
            self.y += self.vel
            if self.top < 20 or self.bottom > 535:
                self.vel = -self.vel
    
    def quit_game():
        pygame.quit()
        sys.exit()
    
    def message_display(text):
        largeText = pygame.font.Font(None, 115)
        screen.blit(largeText.render(text, True, BLUE), (370, 250))
        pygame.display.update()
    
        pygame.time.wait(1000)
    
    def text_objects(text, font):
        textSurface = font.render(text, True, BLACK)
        return textSurface, textSurface.get_rect()
    
    def button(msg, x, y, w, h, ic, ac, action = None):
        mouse = pygame.mouse.get_pos()
        click = pygame.mouse.get_pressed()
    
    
        if x + w > mouse[0] > x and y + h  > mouse[1] > y:
            pygame.draw.rect(screen, ac, (x, y, w, h))
            if click[0] == 1 and action is not None:
                action()
        else:
            pygame.draw.rect(screen, ic, (x, y, w, h))
    
        smallText = pygame.font.Font("freesansbold.ttf",35)
        textSurf, textRect = text_objects(msg, smallText)
        textRect.center = ((x+(w/2)), (y+(h/2)))
        screen.blit(textSurf, textRect)
    
    def restart():
        next_scene = None
    
        def start_game():
            nonlocal next_scene
            next_scene = menu
    
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    quit_game()
    
                if next_scene is not None:
                    return next_scene
    
            screen.fill(WHITE)
    
            largeText = pygame.font.Font(None, 115)
            screen.blit(largeText.render("You lost", True, BLUE), (445, 75))
    
            button("Restart", 525, 250, 150, 60, DARK_GREEN, BRIGHT_GREEN, start_game)
            button("Quit", 525, 350, 150, 60, DARK_GREEN, BRIGHT_GREEN, quit_game)
    
    
            pygame.display.flip()
            clock.tick(60)
    
    def victory_screen():
        next_scene = None
    
        def start_game():
            nonlocal next_scene
            next_scene = menu
    
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    quit_game()
    
                if next_scene is not None:
                    return next_scene
    
    
            screen.fill(WHITE)
    
            largeText = pygame.font.Font(None, 115)
            screen.blit(largeText.render("Congratulations!", True, BLUE), (270, 80))
            largeText = pygame.font.Font(None, 60)
            screen.blit(largeText.render("You beat the game!", True, BLUE), (410, 180))
    
            button("Restart", 525, 300, 150, 60, DARK_GREEN, BRIGHT_GREEN, start_game)
            button("Quit", 525, 400, 150, 60, DARK_GREEN, BRIGHT_GREEN, quit_game)
    
            pygame.display.flip()
            clock.tick(frame_rate)
    
    def instructions_screen():
        next_scene = None
    
        def start_game():
            nonlocal next_scene
            next_scene = menu
    
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    quit_game()
    
                if next_scene is not None:
                    return next_scene
    
            screen.fill(WHITE)
    
            largeText = pygame.font.Font(None, 115)
            smallText = pygame.font.Font(None, 60)
            screen.blit(largeText.render("Instructions", True, BLUE), (362, 50))
            screen.blit(smallText.render("Goal of the game: Reach the yellow rectangle", True, BLACK), (148, 150))
            screen.blit(smallText.render("How to move: Upper arrow - up", True, BLACK), (148, 210))
            screen.blit(smallText.render("Lower arrow - down", True, BLACK), (429, 250))
            screen.blit(smallText.render("Left arrow - left", True, BLACK), (429, 290))
            screen.blit(smallText.render("Right arrow - right", True, BLACK), (429, 330))
    
            button("Play", 525, 430, 150, 60, DARK_GREEN, BRIGHT_GREEN, start_game)
    
            pygame.display.flip()
            clock.tick(60)
    
    def front_page():
        next_scene = None
    
        def start_game():
            nonlocal next_scene
            next_scene = menu
    
        def show_instructions_screen():
            nonlocal next_scene
            next_scene = instructions_screen
    
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    quit_game()
    
            if next_scene is not None:
                return next_scene
    
            screen.fill(WHITE)
    
            screen.blit(image1, (0,0))
    
            largeText = pygame.font.Font(None, 140)
            screen.blit(largeText.render("Protostar", True, BLUE), (389, 50))
    
            button("Play", 525, 200, 150, 60, DARK_GREEN, BRIGHT_GREEN, start_game)
            button("Quit", 525, 400, 150, 60, DARK_GREEN, BRIGHT_GREEN, quit_game)
            button("Info", 525, 300, 150, 60, DARK_GREEN, BRIGHT_GREEN, show_instructions_screen)
    
            pygame.display.flip()
            clock.tick(frame_rate)
    
    
    def menu():
        vel = 4
        vel_left = 5
        vel_right = -5
        vel_up = 7
    
        player = pygame.Rect(40, 45, 30, 30)
    
        finish_line = pygame.Rect(620, 535, 560, 45)
    
        walls = [
            Walls(0, 0, 1200, 20), Walls(0, 0, 20, 600),
            Walls(0, 580, 1200, 20), Walls(1180, 0, 20, 600),
            Walls(300, 0, 20, 530), Walls(20, 100, 230, 20),
            Walls(70, 200, 230, 20), Walls(20, 300, 230, 20),
            Walls(70, 400, 230, 20), Walls(600, 100, 20, 500)
        ]
    
        leftredrects = [
            LeftRedRect(320, 120, 30, 30, vel_left),
            LeftRedRect(320, 240, 30, 30, vel_left),
            LeftRedRect(320, 360, 30, 30, vel_left),
            LeftRedRect(570, 180, 30, 30, vel_right),
            LeftRedRect(570, 300, 30, 30, vel_right),
            LeftRedRect(570, 420, 30, 30, vel_right)
        ]
    
        rightredrects = [
            RightRedRect(1140, 120, 30, 30, vel_left),
            RightRedRect(1140, 240, 30, 30, vel_left),
            RightRedRect(1140, 360, 30, 30, vel_left),
            RightRedRect(620, 180, 30, 30, vel_right),
            RightRedRect(620, 300, 30, 30, vel_right),
            RightRedRect(620, 420, 30, 30, vel_right),
        ]
    
        upanddownredrects = [
            UpAndDownRedRect(620, 20, 30, 30, vel_up),
            UpAndDownRedRect(752, 505, 30, 30, vel_up),
            UpAndDownRedRect(885, 20, 30, 30, vel_up),
            UpAndDownRedRect(1016, 505, 30, 30, vel_up),
            UpAndDownRedRect(1150, 20, 30, 30, vel_up)
        ]
    
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    quit_game()
    
    
            print(int(pygame.time.get_ticks()/1000))
            output = "Time: {0}".format(pygame.time.get_ticks()/1000)
    
    
            keys = pygame.key.get_pressed()
    
            # Player coordinates
            if keys[pygame.K_LEFT] and player.x > 0:
                player.x -= vel
            if keys[pygame.K_RIGHT] and player.x < 1200 - player.width:
                player.x += vel
            if keys[pygame.K_UP] and player.y > 0:
                player.y -= vel
            if keys[pygame.K_DOWN] and player.y < 600 - player.height:
                player.y += vel
    
            # Game logic
            for wall in walls:
                # Check if the player rectangle collides with a wall rectangle
                if player.colliderect(wall):
                    print("Game over")
                    message_display("Game Over")
                    return restart
    
            for rect in rightredrects:
                rect.update()  # Movement and bounds checking
                if player.colliderect(rect):
                    print("Game over")
                    message_display("Game Over")
                    return restart
    
            for rect in leftredrects:
                rect.update()
                if player.colliderect(rect):
                    print("Game over")
                    message_display("Game Over")
                    return restart
    
            for rect in upanddownredrects:
                rect.update()
                if player.colliderect(rect):
                    print("Game over")
                    message_display("Game Over")
                    return restart
    
            if player.colliderect(finish_line):
                print("You beat the game")
                print("You beat the game in", output, "seconds")
                return victory_screen
    
            # Drawing everything
            screen.fill(WHITE)
    
            text = font.render(output, True, BLACK)
            screen.blit(text, [1070, 30])
    
            pygame.draw.rect(screen, YELLOW, finish_line)
    
            for wall in walls:
                pygame.draw.rect(screen, BLACK, wall)
    
            for rect in rightredrects:
                pygame.draw.rect(screen, RED, rect)
    
            for rect in leftredrects:
                pygame.draw.rect(screen, RED, rect)
    
            for rect in upanddownredrects:
                pygame.draw.rect(screen, RED, rect)
    
            pygame.draw.rect(screen, GREEN, player)
    
    
            clock.tick(60)
            pygame.display.flip()
    
    
    def main():
        scene = front_page
        while scene is not None:
            scene = scene()
    
    
    main()
    pygame.quit()
    
    导入pygame
    导入系统
    导入时间
    pygame.init()
    pygame.display.set_标题(“原始星”)
    屏幕宽度,屏幕高度=1200600
    screen=pygame.display.set_模式((屏幕宽度、屏幕高度))
    clock=pygame.time.clock()
    蓝色=pygame.Color('dodgerblue3')
    橙色=pygame.Color('sienna3'))
    黑色=(0,0,0)
    白色=(255,255,255)
    红色=(255,0,0)
    绿色=(13255,0)
    深绿色=(0,225,0)
    亮绿色=(0,255,0)
    黄色=(255,255,0)
    font=pygame.font.font(无,25)
    帧速率=60
    image1=pygame.image.load(“/Users/xy/Desktop/menupy2.png”)
    帧计数=0
    开始时间=90
    类墙(pygame.Rect):
    定义初始值(self,x,y,w,h):
    super().\uuuu init\uuuu(x,y,w,h)
    类LeftRedRect(pygame.Rect):
    定义初始值(self,x,y,w,h,vel):
    #调用父类的uuu init_uuuu方法
    super().\uuuu init\uuuu(x,y,w,h)
    self.vel=vel
    def更新(自我):
    self.x+=self.vel#移动
    如果self.right>600或self.left<320:#如果不在该区域
    self.vel=-self.vel#反转方向
    类RightRedRect(pygame.Rect):
    定义初始值(self,x,y,w,h,vel):
    super().\uuuu init\uuuu(x,y,w,h)
    self.vel=vel
    def更新(自我):
    self.x+=self.vel
    如果自右>1180或自左<620:
    self.vel=-self.vel
    类UpAndDownRedRect(pygame.Rect):
    定义初始值(self,x,y,w,h,vel):
    super().\uuuu init\uuuu(x,y,w,h)
    self.vel=vel
    def更新(自我):
    self.y+=self.vel
    如果self.top<20或self.bottom>535:
    self.vel=-self.vel
    def退出游戏():
    pygame.quit()
    sys.exit()
    def信息_显示(文本):
    largeText=pygame.font.font(无,115)
    blit(largeText.render(text,True,BLUE),(370250))
    pygame.display.update()
    pygame.time.wait(1000)
    def text_对象(文本、字体):
    textSurface=font.render(文本,真,黑色)
    返回textSurface,textSurface.get_rect()
    def按钮(消息、x、y、w、h、ic、ac、操作=无):
    mouse=pygame.mouse.get_pos()
    click=pygame.mouse.get_pressed()
    如果x+w>鼠标[0]>x和y+h>鼠标[1]>y:
    pygame.draw.rect(屏幕,ac,(x,y,w,h))
    如果单击[0]==1且操作不是无:
    行动()
    其他:
    pygame.draw.rect(屏幕,ic,(x,y,w,h))
    smallText=pygame.font.font(“freesansbold.ttf”,35)
    textSurf,textRect=text\u对象(msg,smallText)
    textRect.center=((x+(w/2)),(y+(h/2)))
    screen.blit(textSurf,textRect)
    def restart():
    下一个场景=无
    def start_game():
    非局部下一场景
    下一个场景=菜单
    尽管如此:
    对于pygame.event.get()中的事件:
    如果event.type==pygame.QUIT:
    退出游戏()
    如果下一个场景不是“无”:
    返回下一个场景
    屏幕填充(白色)
    largeText=pygame.font.font(无,115)
    blit(largeText.render(“你输了”,真的,蓝色),(44575))
    按钮(“重启”,525250,150,60,深绿色,亮绿色,开始游戏)
    按钮(“退出”,525350,150,60,深绿色,亮绿色,退出游戏)
    pygame.display.flip()
    时钟滴答(60)
    def victory_屏幕():
    下一个场景=无
    def start_game():
    非局部下一场景
    下一个场景=菜单
    尽管如此:
    对于pygame.event.get()中的事件:
    如果event.type==pygame.QUIT:
    退出游戏()
    如果下一个场景不是“无”:
    返回下一个场景
    屏幕填充(白色)
    largeText=pygame.font.font(无,115)
    blit(largeText.render(“恭喜!”,True,蓝色),(270,80))
    largeText=pygame.font.font(无,60)
    blit(largeText.render(“你打败了游戏!”,真的,蓝色),(410180))
    按钮(“重启”,525,300,150,60,深绿色,亮绿色,开始游戏)
    按钮(“退出”,525,400,150,60,深绿色,亮绿色,退出游戏)
    pygame.display.flip()
    时钟滴答声(帧速率)
    def说明屏幕()
    下一个场景=无
    def start_game():
    非局部下一场景
    下一个场景=菜单
    尽管如此:
    对于pygame.event.get()中的事件:
    如果event.type==pygame.QUIT:
    退出游戏()
    如果下一个场景不是“无”:
    返回下一个场景
    屏幕填充(白色)
    largeText=pygame.font.font(无,115)
    smallText=pygame.font.font(无,60)
    blit(largeText.render(“指令”,真,蓝色),(362,50))
    blit(smallText.render(“游戏目标:到达黄色矩形”,真,黑色),(148150))
    blit(smallText.render(“如何移动:上箭头向上”,真,黑色),(148210))
    blit(smallText.render(“向下箭头”,真,黑色),(429250))
    blit(smallText.render(“左箭头-左”,真,黑色),(429290))
    blit(smallText.render(“右箭头-右”,真,黑色),(429330))
    按钮(“播放”,525430150,60,深绿色,亮绿色,开始游戏)
    pygame.display.flip()
    时钟滴答(60)
    def首页()
    下一个场景=无
    def start_game():
    非局部下一场景
    下一个场景=菜单
    def显示说明屏幕()
    非局部下一场景
    下一个场景=说明屏幕
    尽管如此:
    对于pygame.event.get()中的事件:
    如果event.type==p
    
    start_time = pygame.time.get_ticks()
    while True:
        # ...
        passed_time = pygame.time.get_ticks() - start_time
        output = "Time: {0}".format(passed_time/1000)