【问题标题】:The bottom rectangle gets deleted instead of the top-most底部的矩形被删除而不是最上面的
【发布时间】:2020-10-01 14:15:59
【问题描述】:

我在屏幕上随机显示 25 个矩形(My_rect 的对象)。

rects = []
for i in range(25):
    rects.insert(0, My_rect(canvas))

我的目标是在我点击它们时删除它们。

这就是我处理点击的方式:

if ev.type == pygame.MOUSEBUTTONUP and ev.button == 1:
    click_x, click_y = ev.pos

    for cur_rect in rects:
        if cur_rect.contains_point(click_x, click_y):
            rects.remove(cur_rect)
            break

contains_point 函数定义如下:

def contains_point(self, point_x, point_y):
    rect = Rect(self.x, self.y, self.width, self.width)
    return rect.collidepoint(point_x, point_y)

当我单击一个单独定位的矩形时,它应该会被删除。但是,当我单击与其下方的另一个重叠的矩形时,最底部的矩形消失了,这与我的目标相反。 对我来说,最奇怪的是我专门使用 insert(0, ...) 将矩形添加到 rects 而不是 append() 以防止这种效果。

我没有考虑到什么?

【问题讨论】:

  • 你的矩形不是按照列表的顺序绘制的吗(所以,第一个在底部)?
  • 他们不应该。据我了解插入(0,...),它将较新的对象放在开头,而较旧的对象在列表中向上。然后,当我绘制对象时,我使用 [for cur_rect in rects:] 从头到尾,所以从新到旧。理论上,至少。

标签: python loops pygame


【解决方案1】:

正如您在评论中解释的那样,您按照它们在列表中出现的顺序绘制矩形,因此首先绘制第一个矩形,然后在底部结束。

然后,您还通过以相同顺序在列表上迭代来测试点击,因此您首先测试底部的矩形。

您在列表中插入矩形的方式无关紧要。只需使用 append 即可 - 此外,对于大型列表,使用 insert(0) 效率非常低,因为每次插入时都必须移动所有项目。

在测试点击时只需以相反的顺序迭代列表:

for cur_rect in reversed(rects):
    if cur_rect.contains_point(click_x, click_y):
        rects.remove(cur_rect)
        break

【讨论】:

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