pymunk обновил использование фильтра формы
Я пытаюсь определить первую фигуру вдоль сегмента, начиная с позиции моего игрока, но я не хочу определять игрока.
В предыдущей версии pymunk функция pymunk.Space.segment_query_first принимала целое число в качестве shape_filter и обнаруживала фигуры только внутри группы этого целого числа. Это сработало отлично, но теперь он принимает список или словарь. Я попытался поместить целое число в список, и это не сработало. Я понятия не имею, что он хочет со словарем. Я перепробовал все, что мог придумать. Кажется, ничто не мешает обнаружить мой плеер. Документация не помогает вообще. Заранее спасибо.
1 ответ
Да, фильтр формы стал более мощным в Pymunk 5 (и в результате также немного сложнее). Фильтр формы должен быть ShapeFilter
объект (но. См. api docs http://www.pymunk.org/en/latest/pymunk.html для получения подробной информации об этом объекте фильтра.
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