【问题标题】:Wondering if there is a way to go to a def function that comes after a def function [duplicate]想知道是否有办法进入 def 函数之后的 def 函数 [重复]
【发布时间】:2021-12-31 05:54:06
【问题描述】:

所以我对 python 还很陌生,但我想知道是否有办法退出已定义的函数并返回在我试图退出的函数之后出现的已定义函数

我已经尝试学习一些功能,但还没有找到一些功能

我正在尝试创建一个选项功能,当我按下 C 键时它会返回到后面的游戏循环

这是我的代码我有问题-

def options():
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_b:
                    paused = False
                    playing = True
                    return
                if event.key == pygame.K_c:
                    playing = True
                    print("Continue")
                    game()
                if event.key == pygame.K_ESCAPE:
                    return
                
                    

                elif event.key == pygame.K_q:
                    print("Quitting game...")
                    time.sleep(3)
                    pygame.quit()
                    quit()
                elif event.key == pygame.K_f:
                    choices()

             

            screen.fill(white)
            pygame.mixer.music.pause()
            totalText = set_text("Options", 400, 250, 60)
            
            pausecon = controls2("Press C to continue", black)
            b = controlsr("Press B to go back to previous screen",black)
            newpa = controls3("Press F to go back to choices or Press Q to quit",black)
            screen.blit(totalText[0], totalText[1])
            pygame.display.update()
        


        pygame.display.update()

当用户单击“def option():”之后的 C 键时,我试图进入游戏循环

def game():
    while not paused:
        
        clock = pygame.time.Clock()
        #circles = pygame.sprite.Group(Circle((600, 0), screen))

        for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    quit()
                if event.type == pygame.VIDEORESIZE:
                    print("Resized window")
                    screen = pygame.display.set_mode((event.w, event.h), pygame.RESIZABLE)


                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_p:
                        paused == True
                        playing == False
                        print("Paused")
                        pygame.mixer.music.play(1)

                        pause()
                    if event.key == pygame.K_ESCAPE:
                        paused == True
                        playing == False
                        print("Paused")
                        pause()
                    if event.key == pygame.K_SPACE:
                       print("shot")
                       attacking.play()
                       screen.blit(attack, (x,y) )

                    if event.key == pygame.K_LEFT:
                        x_change = -1
                        y_change = 0
                    if event.key == pygame.K_RIGHT:
                        x_change = 1
                        y_change = 0
                    if event.key == pygame.K_UP:
                        x_change = 0
                        y_change = -1
                    if event.key == pygame.K_DOWN:
                        x_change = 0
                        y_change = 1
                    if event.key == pygame.K_a:
                        x_change = -1
                        y_change = 0
                    if event.key == pygame.K_d:
                        x_change = 1
                        y_change = 0 
                    if event.key == pygame.K_w:
                        x_change = 0
                        y_change = -1
                    if event.key == pygame.K_s:
                        x_change = 0
                        y_change = 1
                elif event.type == pygame.KEYUP:
                    if event.key == pygame.K_LEFT:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_RIGHT:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_UP:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_DOWN:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_a:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_d:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_w:
                        x_change = 0
                        y_change = 0
                    if event.key == pygame.K_s:
                        x_change = 0
                        y_change = 0
                if x_change >= 800:
                    x_change < 800


        if x >= width or x < 0 or y >= height or y < 0:
            print("Barrier")
            message("Barrier",red)
            pygame.display.update()
        
        x += x_change
        y += y_change


        #makes var music be repeated thru game
        #pygame.mixer.music.play(-1)
        screen.fill((135, 206, 235))

            

        
        
        #pygame.draw.circle(screen, (0, 0, 150), (x, y), r)

        #SPRITES AND CONTROL TEXT IN GAME
        controls("P/Esc = pause",green)
        
        attacksprite = screen.blit(attack, (randx, randy))
        sprite = screen.blit(image, (x, y))
        topRight("Dodged: ", black)


        pygame.display.flip()
        clock.tick(60)
        pygame.display.update()

我收到错误消息 -

游戏()

NameError:名称“游戏”未定义。你的意思是:'pygame'?

感谢您的宝贵时间

【问题讨论】:

  • 顺便说一句,这个词只是function

标签: python pygame


【解决方案1】:

函数定义的顺序在 python 中并不重要。您的错误与它无关。这个简单的测试证明了这一点。

def test1():
    return test2()
def test2():
    return 1
test1()

您正在寻找的是state machines。在您的情况下,您可以执行以下操作:

currentState = OPTIONS
OPTIONS, PLAYING, PAUSE = range(3)

def options(events):
    for event in events:
        if event.key == pygame.K_c:
            playing = True
            currentState = PLAYING

def game(events):
        for event in events:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_p:
                    playing = not playing
                #maybe add on options to set the state to OPTIONS

        currentState = PLAYING if playing else PAUSE
            
        #logic and stuff
        #clear display
        #drawing code
        #update display



while True:
    events = pygame.event.get()
     if currentState == OPTIONS:
         options(events)
     if currentState == PLAYING:
         game(events)
     if currentState == PAUSED:
         #and so on
     

         

另外,像上面的代码一样,只调用一次pygame.event.get()。在整个应用程序中只调用一次pygame.display.update()pygame.display.flip()

【讨论】:

  • 感谢您抽出宝贵时间并在最后添加该信息,也感谢您回答我的问题
  • @TipsyDev 请将其标记为答案,如果它回答了您的问题,请在左侧打勾!
  • 这行不通,顺便说一句。
  • @juanpa.arrivillaga 我错过了什么吗?
  • @user16038533 你永远不会改变currentState,所以while循环将永远是OPTIONS(顺便说一句,这将是枚举而不是魔法常量的一个很好的用例...... )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 2015-08-24
  • 2020-12-19
相关资源
最近更新 更多