【问题标题】:Looking for a concise way to check for point collision in a list of Rects寻找一种简洁的方法来检查 Rects 列表中的点碰撞
【发布时间】:2014-06-05 08:18:26
【问题描述】:

我正在尝试找到一种方法来检查一个点是否位于 Rect 列表中的任何 Rect 中,并获取列表中该 Rect(或第一个,如果有多个)的索引。

我目前的解决方案是使用我要检查的点制作一个单像素 Rect,然后使用 collidelist 将该点与我要搜索的列表进行比较。

看起来像这样:

tgtrect = pygame.Rect(coords, (1,1)).collidelist(rectlist)

...其中coords 是检查点(通常,不总是,鼠标位置),rectlist 是要评估的矩形列表。 tgtrect 接收碰撞 Rect 的索引号,如果没有,则为 -1。 我需要这个索引值来解析其他地方的碰撞 Rect 的身份。

我觉得有更好的方法来获取此信息(即,根据列表检查 coords,返回索引(如果没有命中,则返回 False/None/-1),而无需创建Rect 每次),但我不知道它是什么(或者它是否存在)。

基本上,我需要的是<Rect>.collidelist(rectlist),但是对于一个 (x,y) 元组而不是一个 Rect,或者<Rect>.collidepoint(coords),但对于一个 Rect 列表而不是一个。 (我可以将第二种方法与 rectlist 的迭代器一起使用,但获取碰撞 Rect 的索引会更加困难。)

我环顾四周,发现了这个, Pygame action when mouse 'click' on .rect?, 它提供了一种检查单个 Rects 的方法,但不是许多列表。意义在于我的目标 Rects 列表是动态的; Rects 的数量和它们的位置经常变化。

我也读过这个, Pygame .Rect won't "collide" with mouse, 由于同样的原因,它给出了一个并不真正适合这种情况的解决方案。

谢谢!

(((Auth. note:这是我的第一个问题,所以如果它有点难看,请原谅我。如果它没有提供足够的信息,请告诉我,或者我可以做些什么来改进它。))

【问题讨论】:

  • 请不要使用标题作为问题标签的前缀;使用标记系统。
  • @Burhan Khalid - 我不确定这是否正确。现在我知道了!
  • 阅读help section,其中包含information on tagging 以及许多其他好的提示。
  • 抛开标签,在这里问这个问题是否与这里的指导方针一致是否合理:stackoverflow.com/help/mcve?我试图将相关代码从更广泛的背景中剔除,以使其更适用于未来的情况,但我不确定我是否在描述它时持续时间过长。尽我所能将其安装到单个屏幕上。这感觉像是成功的,因为我在第一次回复时就得到了我需要的结果,而且几乎是在提出问题后立即得到的。但是,输入仍然很棒。也许以私人信息的形式;我不知道。它只是元相关的。

标签: python-2.7 optimization pygame collision-detection rect


【解决方案1】:

你可以使用一个简单的生成器表达式和collidepoint(),比如

>>> rects = [pygame.Rect(0,0,100,100), pygame.Rect(30,30,30,30)]
>>> next((r for r in rects if r.collidepoint(10, 10)), None)
<rect(0, 0, 100, 100)>
>>> next((r for r in rects if r.collidepoint(200, 200)), None)
>>>

或者,如果你真的想要索引而不是 Rect 本身:

>>> rects = [pygame.Rect(0,0,100,100), pygame.Rect(30,30,30,30)]
>>> next((i for (i, r) in enumerate(rects) if r.collidepoint(10, 10)), -1)
0
>>> next((i for (i, r) in enumerate(rects) if r.collidepoint(100, 200)), -1)
-1
>>>

【讨论】:

  • 第二部分正是我需要的;谢谢你!我还试图弄清楚next 是如何工作的;这是一个巨大的帮助。这段代码的具体应用其实就是一个Rect-object对的列表。我不需要索引,因为我需要一种返回配对元素的方法(我可以很容易地将其换成ienumerate)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
  • 2015-01-04
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多