Тест на сдерживание SKPhysicsBody?

Любой простой способ проверить, содержит ли SKPhysicsBody полностью другой?

Что-то вроде bodyA содержит все точки bodyB или около того.

Просто хотел попросить вас, прежде чем внедрять некоторые помощники по 2D-математике, сделать это с дополнительными «мета»-CGPaths, прикрепленными к данному узлу или чему-то еще.


person Geri Borbás    schedule 19.02.2014    source источник
comment
Контактный делегат сообщит вам, находятся ли два органа в контакте. Вы можете заставить два тела генерировать контактные события без обратной связи с помощью битовых масок категории и т.д.   -  person LearnCocos2D    schedule 19.02.2014
comment
Верно, но я хочу знать, содержит ли одно тело другое целиком. Для этого должен быть математический термин, которого я не знаю. Вы знаете, что bodyA содержит все точки bodyB.   -  person Geri Borbás    schedule 19.02.2014
comment
тестирование двух прямоугольных или двух круглых тел на предмет удержания просто, но любая другая форма или их комбинации нетривиальны - какую из них вы ищете, т.е. с какими формами вы работаете?   -  person LearnCocos2D    schedule 19.02.2014


Ответы (3)


Прямого метода нет, но есть некоторые, которые могут оказаться полезными. Если ваши тела прямоугольные и соответствуют рамкам их узлов, возможно, стоит попробовать:

BOOL isContained = CGRectContainsRect(bodyA.node.frame, bodyB.node.frame); // bodyA is the container, bodyB is examined for being contained

Если ваши тела представляют собой многоугольники, созданные с совершенно произвольными путями, то поиск их содержания будет сложной задачей. Это долгий путь, но вы можете получить некоторое начальное приближение, используя описанный выше метод в сочетании с CGPathGetBoundingBox — это вернет прямоугольники вокруг ваших полигонов, которые вы затем можете проверить на перекрытие (используйте CGRectInset по мере необходимости).

Существует также метод SKPhysicsWorld, который близок: -(SKPhysicsBody *)bodyInRect:(CGRect)rect, но он возвращает только SKPhysicsBody, пересекающий прямоугольник.

person Batalia    schedule 19.02.2014
comment
Горизонтальные ограничивающие рамки для этого довольно неточны, я могу только приблизиться к ним. - person Geri Borbás; 19.02.2014
comment
Я создам мета-описание пути для каждого тела, которое нужно повернуть, и сверить каждую точку с этим путем, если он есть. Я просто хотел сделать это проще. - person Geri Borbás; 19.02.2014

Я знаю, что эта ветка очень старая, но сейчас 2017 год, и я искал ответ и в итоге нашел свой собственный, покопавшись в своем коде. Надеюсь, это кому-нибудь поможет! Он работает с кругами и овалами.

-(void)didBeginContact:(SKPhysicsContact *)contact {

// get the path of the physics body ( contact bodyA )
CGPathRef path = CGPathCreateWithEllipseInRect(CGRectMake(contact.bodyA.node.position.x - contact.bodyA.node.frame.size.width/2, contact.bodyA.node.position.y - contact.bodyA.node.frame.size.height/2, contact.bodyA.node.frame.size.width, contact.bodyA.node.frame.size.height), nil);

// check if that path contains the physics body point of BodyB
if (CGPathContainsPoint(path, NULL, contact.bodyB.node.position, FALSE)) {

    NSLog(@"CONTAINS POINT player body B");

}

}`

person Barry Wyckoff    schedule 17.11.2017
comment
Вы можете внести свой вклад в эту категорию SKPhysicsBody+Containment. Вы можете расширить это containsBody: метод. - person Geri Borbás; 24.11.2017

Сделал для этого категорию.

BOOL putInto = [bodyA containsBody:bodyB];

Получите категорию SKPhysicsBody+Containment from GitHub, она работает только для сдерживания пути-пути для теперь скоро закончу и для кругов.

Решение двоякое.

Первая часть CGPath работает. Вы получаете CGPathRef представление bodyA преобразованного состояния, затем выполняете итерацию по каждой точке bodyB и проверяете сдерживание. Это отлично работает для тестов типа путь-путь, но не для круга-круга и тем более для круга-пути.

Вторая часть заключается в объединении этого в SKPhysicsBody категорию, чтобы инкапсулировать все детали реализации. Это удивительно болезненно.

Когда вы запрашиваете экземпляр SKPhysicsBody из класса SKPhysicsBody, вы ожидаете взамен объект SKPhysicsBody. Согласно некоторому дизайнерскому решению в Apple, он выдаст вам PKPhysicsBodyэкземпляр (часть внутреннего PhysicsKit), в котором, конечно, не будет ни одного метода экземпляра из категории, которую вы создали для SKPhysicsBody. Расширение этого класса может быть выполнено только с помощью swizzlings метода/свойства, поэтому эта проблема придает вес этой категории сдерживания.

person Geri Borbás    schedule 20.02.2014