【问题标题】:Pygame - How do I check if my rect has already been clicked?Pygame - 如何检查我的矩形是否已被点击?
【发布时间】:2016-11-30 23:59:32
【问题描述】:

我想要做的是如果一个矩形被点击,它被选中并显示文本,但如果再次点击它,那么它被取消选择并且文本消失。

list_of_rect 是一个坐标列表(x、y、宽度、高度),表示矩形的位置和大小。

render_display 只显示带有文本的屏幕。

if event.type == pygame.MOUSEBUTTONUP and event.button == 1:
    x, y = event.pos
    for i in range(len(list_of_rect)):
        j = list_of_rect[i]
        if j[0][0] <= x <= (j[0][0] + j[0][2]) and j[0][1] <= y <= \
                (j[0][1] + j[0][3]):
                render_display(screen, text)

编辑:我想到的一个想法是跟踪被点击的矩形。但我不确定如何实现这个

【问题讨论】:

    标签: python user-interface pygame rectangles


    【解决方案1】:

    尝试列出一个列表,如下所示:

    rects_clicked = []
    

    然后,在您的事件代码中:

    if j not in rects_clicked:
        #undisplay text
        rects_clicked.append(j)
    else:
        #display text
        rects_clicked.remove(j)
    

    【讨论】:

    • 我使用了一个名为 selected_rect 的变量,并使用了您的想法。完美运行,谢谢!
    • 这仅在@Theo 将矩形存储在列表中时才有效。他(对不起,如果代词错误)已经说过唯一存储的信息是 list_of_rect,它包含坐标,而不是矩形对象
    • @PMARINA 假设list_of_rect[[x, y, width, height], [x2, y2, width2, height2],...[xn, yn, widthn, heightn]] 一样存储它的数据,rects_clicked 不需要跟踪矩形对象,而是检查子列表是否在rects_clicked 中。所以rects_clicked 可能看起来像[[x, y, width, height], [x3, y3, width3, height3]],这很适合 OP 的要求
    • @PMARINA 基本上每组坐标都可以被视为一个对象
    • @PMARINA 是的,但 Theo 没有使用对象,它可能不会那么重要。如果你真的想要我,我可以添加一个基础课程。
    【解决方案2】:

    我会使用一个包含布尔值的二维列表。单击矩形时,我会说list[xCoordOfRectangle][yCoordOfRectangle] = !list[xCoordOfRectangle][yCoordOfRectangle]。那么,在绘图方法中,我会说:

    for i in list:
        for j in i: 
            if(j): 
                #information drawing function goes here
            else:
                #Solid/Empty Rectangle drawing function goes here
    

    请注意,您需要初始化 list 以使每个矩形都具有 false。另请注意,如果矩形不是以矩形方式排列的,则需要按以下方式使用数字:分配 1,true; 2 被赋值,假; 3 未分配(有点像 null)。要么这样,要么你可以只用一个一维列表来存储布尔值,然后跟踪列表中的哪个元素是哪个元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      相关资源
      最近更新 更多