如何在Pygame中弹出放射状菜单



我想知道是否有人能给我一些建议,告诉我如何创建一个带有选项的放射状菜单,例如"攻击"、"对话",当你点击游戏中的对象时会自动弹出。。。有点像在许多战略/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。

将每个选项闪电式传输到popupSurf后,您需要将popupSurv闪电式传输至您的主表面,该主表面是在程序开始时使用"pygame.display.set_mode"创建的。根据您提供的所有信息,假设您希望弹出窗口出现在屏幕中心,所以我取了中心x和中心y,并将它们放在屏幕中心。然后,剩下要做的就是将其闪电式地显示到屏幕上并更新显示。如果您不完全理解,请发表评论。

要做到这一点,只需让while循环不断检查鼠标的位置,然后检查要单击的鼠标。单击鼠标后,检查选择了什么选项,如果该选项是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

相关内容

  • 没有找到相关文章

最新更新