2016-09-22 8 views
2

Я пытаюсь обнаружить первую фигуру вдоль сегмента, начиная с позиции моего плеера, но я не хочу определять игрока.pymunk update shape filter usage

В предыдущей версии pymunk функция pymunk.Space.segment_query_first принимала целое число как shape_filter и обнаруживала только формы внутри группы этого целого. Это сработало отлично, но теперь оно принимает список или словарь. Я попытался положить целое число в список, и это не сработало. Я понятия не имею, что он хочет со словарем. Я пробовал все, что мог придумать. Кажется, ничего не мешает обнаружить моего игрока. Документация совсем не помогает. Заранее спасибо.

+0

Я понял это outshape.filter = [Int] –

+0

я случайно разместил, что последнее замечание, и я наклоняюсь, кажется, удалите его:/Я понял, я просто установил player_shape.filter в [1] и передал [1] аргументу shape_filter. Если между этими двумя списками есть общие номера, это, как представляется, игнорирует столкновение. Если кто-то хочет объяснить, как использовать словарь здесь вместо списка, мне все равно интересно. –

ответ

0

Да фильтр формы стал более мощным в pymunk 5 (и в результате также немного сложнее). Фильтр формы должен быть ShapeFilter объекта (но см АНИ документы http://www.pymunk.org/en/latest/pymunk.html#pymunk.ShapeFilter для получения подробной информации об этом объекте фильтра

ShapeFilter имеет 3 свойство:... categories, mask и group В вашем случае я думаю, что вы хотите (по умолчанию объект фильтра формы соответствует всем категориям и не маскирует что-либо).

Итак, вы хотите сделать что-то вроде этого примера:

>>> 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