2016-09-22 61 views
2

我試圖從我的玩家的位置開始檢測沿着一段的第一個形狀,但我不想檢測到玩家。pymunk更新了形狀過濾器的使用

在以前版本的pymunk中,pymunk.Space.segment_query_first函數接受一個整數作爲shape_filter,它只能檢測到該整數組中的形狀。這工作完美,但現在它接受一個列表或字典。我試圖把整數放入一個列表中,但沒有奏效。我不知道它用字典需要什麼。我嘗試了所有我能想到的。似乎沒有任何東西阻止它檢測到我的播放器。該文檔根本沒有幫助。提前致謝。

+0

我想它outshape.filter = [INT] –

+0

我無意中張貼最後的評論,我似乎無法刪除它:/我想通了,我只是將player_shape.filter設置爲[1],並將[1]傳遞給shape_filter參數。如果兩個列表之間有任何共同的數字,它似乎忽略了碰撞。如果有人想解釋如何在這裏使用字典而不是列表,我仍然感興趣。 –

回答

0

是的形狀過濾器在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