Python 如何在Pygame中创建弹出式径向菜单?

Python 如何在Pygame中创建弹出式径向菜单?,python,menu,popup,pygame,radial,Python,Menu,Popup,Pygame,Radial,我想知道是否有人能给我一些建议,告诉我如何创建一个径向菜单,当你点击游戏中的某个对象时,会自动弹出“攻击”、“交谈”等选项。。。有点像许多策略/RPG游戏中使用的放射状菜单等 我是Python/Pygame新手,所以请尽可能详细地解释 提前感谢,, Ilmiont我最近在我正在编程的一个游戏中实际使用了它。 因此,您通常需要检查精灵/对象的单击 #example def make_popup(self): popupSurf = pygame.Surface(width, height)

我想知道是否有人能给我一些建议,告诉我如何创建一个径向菜单,当你点击游戏中的某个对象时,会自动弹出“攻击”、“交谈”等选项。。。有点像许多策略/RPG游戏中使用的放射状菜单等

我是Python/Pygame新手,所以请尽可能详细地解释

提前感谢,,
Ilmiont

我最近在我正在编程的一个游戏中实际使用了它。 因此,您通常需要检查精灵/对象的单击

#example
def make_popup(self):
    popupSurf = pygame.Surface(width, height)
    options = ['Attack',
               'Talk']
    for i in range(len(options)):
        textSurf = BASICFONT.render(options[i], 1, BLUE)
        textRect = textSurf.get_rect()
        textRect.top = self.top
        textRect.left = self.left
        self.top += pygame.font.Font.get_linesize(BASICFONT)
        popupSurf.blit(textSurf, textRect)
    popupRect = popupSurf.get_rect()
    popupRect.centerx = SCREENWIDTH/2
    popupRect.centery = SCREENHEIGHT/2
    DISPLAYSURFACE.blit(popupSurf, popupRect)
    pygame.display.update()
好,现在来解释一下这一切,以及它是如何运作的

带有popupSurf=pygame.Surface的线创建popupSurf作为绘制对象的曲面

选项是不言自明的。然后我们有一个for循环,它将接受所有选项并单独显示每个选项。接下来是textSurf=BASICFONT。。。BASICFONT是您在一开始创建的字体,我个人最喜欢使用SysFont,因为它很容易与py2exe一起使用

然后是textRect,它创建了一个rect,用于在屏幕上快速显示文本。然后将顶部坐标更改为当前顶部坐标。然后在左边做同样的动作。但是,下一行“self.top+=…”将针对之前在屏幕上显示的文本进行调整,这样您就不会以文本对文本的方式结束。 然后你就把它放到popupSurf


在每个选项被blit到popupSurf后,您需要将popupSurf blit到主曲面,该主曲面是使用程序开头的“pygame.display.set_mode”创建的。根据您提供的所有信息,假设您希望弹出窗口显示在屏幕中央,因此我将centerx和centery放在屏幕中央。然后,剩下要做的就是将其显示在屏幕上并更新显示。如果您不完全理解,请发表评论。

要做到这一点,只需在
循环时不断检查鼠标的位置,然后检查鼠标是否被单击。单击鼠标后,检查选择的选项,如果选项为
None
,则退出弹出菜单

#example
def doPopup(self):
    #popup loop
    while True:
        #draw the popup
        make_popup(self)
        #check for keyboard or mouse events
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == MOUSEMOTION:
                #update mouse position
                self.mousex, self.mousey = event.pos
            #check for left click
            elif event.type == MOUSEBUTTONDOWN and event.button == 1:
                OPTION = option_selected(self)
                if OPTION != None:
                    return OPTION'
                else:
                    return None
        FPSCLOCK.tick(FPS)

def option_selected(self):
    popupSurf = pygame.Surface(width, height)
    options = ['Attack',
               'Talk']
    #draw up the surf, but don't blit it to the screen
    for i in range(len(options)):
        textSurf = BASICFONT.render(options[i], 1, BLUE)
        textRect = textSurf.get_rect()
        textRect.top = self.top
        textRect.left = self.left
        self.top += pygame.font.Font.get_linesize(BASICFONT)
        popupSurf.blit(textSurf, textRect)
        if textSurf.collidepoint(self.mousex, self.mousey):
            return options[i]
    popupRect = popupSurf.get_rect()
    popupRect.centerx = SCREENWIDTH/2
    popupRect.centery = SCREENHEIGHT/2

在Pygame中,没有制作GUI和任何菜单的功能,因此您必须自己完成所有事情-绘制菜单、捕捉鼠标单击等。可能一些外部库(如)可以帮助您,但我不确定。非常感谢,但是您如何检测何时关闭弹出窗口。。。i、 e.当您单击窗口上的其他位置时?