如何修复我的代码,只在每次迭代时访问列表中的一个项目?

时间:2018-03-07 17:18:55

标签: python-3.x pygame

过去几天我一直在使用pygame for Python,但我遇到了一个我似乎无法克服的问题。首先让我谈谈这个问题并提供代码。有问题的代码在我的仓库的WIP分支中。这是在部署之前测试的新功能。

https://github.com/Aeryes/Demented/blob/WIP/menu_testing.py

我一直试图将我的游戏菜单放在类似结构的类中,以便通过创建菜单的通用类来更容易创建菜单。除了访问位于菜单类中的按钮列表的各个成员之外,这已经起作用了。当我检查按钮是否被悬停以改变颜色时,检查有效,但新颜色应用于列表中的所有按钮,而不仅仅是悬停在其上的按钮。

到目前为止,我尝试了很多方面,包括以下内容:

  1. 我试图像这样引用单个项目:

    - > main_menu.buttons [0] .hovered = True

  2. 当我这样做时,代码不起作用,也不会破坏程序。它根本不会改变颜色。

    1. 我尝试从Menu()类中删除buttons = []列表,并通过执行以下操作将每个按钮创建为单个实例:

      play_button = main_menu.add_button(此处有按钮信息)

    2. 当我调用hovered = True时,这只会给我一个NullType错误。

      我一直在使用此作为参考来帮助解决此问题:  https://python-forum.io/Thread-PyGame-Creating-a-state-machine

      以下是我的直接问题:如何将鼠标悬停在单个按钮上而不是同时按下所有按钮?

      感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

你的问题在这里:

if main_menu.buttons[0].rect.collidepoint(pygame.mouse.get_pos()):
            Button.hovered = True
        else:
            Button.hovered = False

你没有在实际按钮上将hovered标志设置为true,而是将类(据我所知,通常不提供函数)

要纠正它,你应该使用

if main_menu.buttons[0].rect.collidepoint(pygame.mouse.get_pos()):
            main_menu.buttons[0].hover = True
        else:
            main_menu.buttons[0].hover = False

更大的问题是您在更新后永远不会重绘按钮。我解决这个问题的方法(使用您之前存在的代码)是将条件更新为:

if main_menu.buttons[0].rect.collidepoint(pygame.mouse.get_pos()):
            main_menu.buttons[0].hovered = True
            main_menu.buttons[0].draw()
        else:
            main_menu.buttons[0].hovered = False
            main_menu.buttons[0].draw()

有几件事要考虑。

  • 迭代索引的for循环可能比三个单独的条件更好。
  • 您的菜单类中有一个错误,您可以在其中编写“for button in buttons:”而不是“for self.buttons中的按钮:”
  • 最后,你可能想看看你的其他情况。鉴于您目前正在不断重新创建菜单,可能没有必要将鼠标悬停在按钮上,但我会将其留给您