pymunk更新了形状过滤器的用法

时间:2016-09-22 01:36:12

标签: python filter shape segment pymunk

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

在以前版本的pymunk中,pymunk.Space.segment_query_first函数接受一个整数作为shape_filter,它只检测整数组内的形状。这完美地运作,但现在它接受列表或字典。我已经尝试将整数放入列表中,但这不起作用。我不知道用字典想要什么。我已经尝试了所有我能想到的东西。似乎没有什么能阻止它检测我的播放器。文档根本没用。提前谢谢。

1 个答案:

答案 0 :(得分:2)

是的,形状滤镜在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