Pygame中不同屏幕上的按钮

时间:2020-02-04 14:58:30

标签: pygame pygame-surface

我正在制作一个带有开始和帮助菜单以及其他功能的程序。 “主菜单”上的按钮可以正常工作,但是一旦进入“帮助”菜单,为屏幕导航编程的按钮将无法正常工作。请随时查看下面的代码。我不断收到错误消息,提示“未定义BackHelpRect”。 BackHelpRect是我在图像按钮周围绘制的矩形(对于所有其他按钮),以检测鼠标何时触摸它们。它适用于主菜单按钮,但是一旦进入帮助菜单,这些按钮的矩形就会“消失”。如果您有解决方案,请回复,我们将不胜感激。 :)

对不起,我已经附加了完整的代码,但是所有内容都在其他函数中调用,并且它们彼此之间都同步工作。抱歉,如果很长。

const pattern = /(\*\*)([^\*\*]*)(\*\*)/g;

let str = `* abc **
* **def****yo**
*`

const replacer = function(match, first, inner, last){
  return "<b>"+inner+"</b>"
}

str = str.replace(pattern, replacer)
console.log(str)

谢谢。

1 个答案:

答案 0 :(得分:0)

问题在于主循环在定义之前先引用BackHelpRect。复制此代码很容易,只需在第一个屏幕上选择“后退”菜单选项即可。为了调试此问题,我在print( "BackHelp Defined HERE" )函数中添加了BackHelp()。并非总是事先调用它。

要解决此问题,也许您的代码可以在菜单处理开始之前立即定义所有这些Image和Rect。像这样:

def preloadButtons():
    global HelpButton, HelpButtonRect
    global BackHelpButton, BackHelpRect
    # etc. etc.

    HelpButton     = pygame.image.load('button.jpg') # Open the custom button design.
    HelpButton     = pygame.transform.scale(HelpButton, (151, 51))
    HelpButtonRect = HelpButton.get_rect()
    HelpButtonRect.topleft = (335, 415)

    BackHelpButton     = pygame.image.load('button.jpg') # Open the custom button design.
    BackHelpButton     = pygame.transform.scale(BackHelpButton, (235, 84))
    BackHelpButtonRect = BackHelpButton.get_rect()
    BackHelpButtonRect.topleft = (45, 490)

将所有这些按钮存储为单独的全局变量并不是一个很好的设计,并且已经在整个程序的其余部分引起了绘图和事件测试的复杂性。最好将按钮的所有属性(图像,大小,位置,矩形)打包到数据结构中。不必一定是Python class,只需将每个按钮的属性放到list中就可以了,然后将所有这些列表放到一个all_buttons列表中。

例如,在这里我们定义按钮属性列表,然后遍历这些属性以创建按钮名称/图像/矩形的更简单列表。

help_button      = [ 'help', 'help_button.jpg', (151, 51), (335, 415) ]
back_help_button = [ 'back', 'back_button.jpg', (235, 84), ( 45, 490) ]
# ... TODO: rest of buttons
all_buttons_properties = [ help_button, back_help_button ]

# Initialise buttons
all_buttons = []
for butt in all_button_properties:
    button_image = pygame.image.load( butt[1] )                     # load
    button_image = pygame.transform.scale( button_image, butt[2] )  # resize
    button_rect  = button_image.get_rect()
    button_rect.topleft = butt[3]                                   # move
    all_buttons.append( butt[0], button_image, button_rect )

这为您提供了一个简单的all_buttons列表列表[按钮名称,调整大小的按钮图像,预定位置的按钮矩形]。

也许您想要if ... elif ...用于这些按钮测试,而不是if ... if ...:

        if event.type == pygame.MOUSEBUTTONDOWN:
            if NextHelpRect.collidepoint(event.pos): # Button navigaton.
                if MenuStatus == "Help menu 1":
                    MenuStatus = "Help menu 2"
                    Help()
                if MenuStatus == "Help menu 2":
                    MenuStatus = "Help menu 3"
                    Help()

MenuStatus等于“帮助菜单1”时,会发生什么->它变成“帮助菜单2”,但是接下来的if再次将此 更改为“帮助”菜单3”