【问题标题】:pymunk updated shape filter usagepymunk 更新了形状过滤器的使用
【发布时间】:2017-01-30 10:25:15
【问题描述】:

我正在尝试从我的玩家位置开始沿线段检测第一个形状,但我不想检测玩家。

在之前的 pymunk 版本中,pymunk.Space.segment_query_first 函数接受一个整数作为 shape_filter,它只检测该整数组中的形状。这工作得很好,但现在它接受一个列表或字典。我尝试将整数放入列表中,但没有成功。我不知道它想要什么字典。我已经尝试了我能想到的一切。似乎没有什么能阻止它检测到我的播放器。该文档根本没有帮助。提前致谢。

【问题讨论】:

  • 我认为它是 outshape.filter = [int]
  • 我不小心发布了最后一条评论,我似乎无法删除它:/ 我想通了,我只是将 player_shape.filter 设置为 [1] 并将 [1] 传递给 shape_filter 参数。如果两个列表之间有任何共同的数字,它似乎忽略了碰撞。如果有人想在这里解释如何使用字典而不是列表,我仍然很感兴趣。

标签: python filter shape segment pymunk


【解决方案1】:

是的,形状过滤器在 pymunk 5 中变得更加强大(因此也变得更加复杂)。形状过滤器应该是 ShapeFilter 对象(但是。有关此过滤器对象的详细信息,请参阅 api 文档 http://www.pymunk.org/en/latest/pymunk.html#pymunk.ShapeFilter

ShapeFilter 有 3 个属性:categoriesmaskgroup。在您的情况下,我认为您想将播放器放在一个单独的类别中,并将其从过滤器查询中屏蔽掉。 (默认情况下,形状过滤器对象匹配所有类别并且不屏蔽任何内容)。

所以,你想在这个例子中做一些类似的事情:

>>> import pymunk
>>> s = pymunk.Space()
>>> player_b = pymunk.Body(1,1)
>>> player_c = pymunk.Circle(player_b, 10)
>>> s.add(player_b, player_c)
>>>
>>> player_c.filter = pymunk.ShapeFilter(categories=0x1)
>>> s.point_query_nearest((0,0), 0, pymunk.ShapeFilter())
PointQueryInfo(shape=<pymunk.shapes.Circle object at 0x03C07F30>, point=Vec2d(nan, nan), distance=-10.0, gradient=Vec2d(0.0, 1.0))
>>> s.point_query_nearest((0,0), 0, pymunk.ShapeFilter(mask=pymunk.ShapeFilter.ALL_MASKS ^ 0x1))
>>>
>>> other_b = pymunk.Body(1,1)
>>> other_c = pymunk.Circle(other_b, 10)
>>> s.add(other_b, other_c)
>>>
>>> s.point_query_nearest((0,0), 0, pymunk.ShapeFilter(mask=pymunk.ShapeFilter.ALL_MASKS ^ 0x1))
PointQueryInfo(shape=<pymunk.shapes.Circle object at 0x03C070F0>, point=Vec2d(nan, nan), distance=-10.0, gradient=Vec2d(0.0, 1.0))

test_space.py 文件中有测试形状过滤器的不同组合的测试,这可能有助于解释它们的工作原理:https://github.com/viblo/pymunk/blob/master/tests/test_space.py#L175

【讨论】:

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