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