pymunk обновил использование фильтра формы

Я пытаюсь обнаружить первую фигуру на отрезке, начинающемся с позиции моего игрока, но я не хочу обнаруживать игрока.

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


person Ivan Hoffmann    schedule 22.09.2016    source источник
comment
Я понял, что outshape.filter = [int]   -  person Ivan Hoffmann    schedule 22.09.2016
comment
Я случайно опубликовал этот последний комментарий и, похоже, не могу его удалить :/ Я понял это, я просто установил player_shape.filter в [1] и передал [1] в аргумент shape_filter. Если между двумя списками есть какие-либо общие числа, кажется, что коллизия игнорируется. Если кто-то хочет объяснить, как использовать здесь словарь вместо списка, мне все равно интересно.   -  person Ivan Hoffmann    schedule 22.09.2016


Ответы (1)


Да, в pymunk 5 фильтр формы стал мощнее (и, как следствие, немного сложнее). Предполагается, что фильтр формы является объектом ShapeFilter (но см. документацию по API 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

person viblo    schedule 22.09.2016