2016-09-05 2 views
2

У меня есть несколько незавершенных кругов, постоянно вращающихся, и пользователь переходит от круга к кругу. я удалил всю серьезность, силы и т.д. из моей сценыSpriteKit: enumerateBodiesAtPoint не показывает правильные тела

Изображение Image A

Изображение B Image B

Проблема: Я пытаюсь сделать хит обнаружения, где я просто проверить, где находится пользователь, и если на этом этапе в физическом мире моей сцены есть тела SKNode. Если это удар с фигурой, пользователь может продолжить (изображение A), но сработает, если он находится снаружи (изображение B)

Хотя формы довольно сложны, сцена.showPhysics, похоже, точно соответствует моим формам. (См изображения A и B)

let updatedOrigin = user.calculateAccumulatedFrame().origin 
     user.scene?.physicsWorld.enumerateBodiesAtPoint(updatedOrigin, usingBlock: { (body, stop) in 
      print(" Shape contains \(body.node!.name)") 
}) 

который печатает

Shape contains Optional("User") 
Shape contains Optional("circle") 
Shape contains Optional("circle") 
Shape contains Optional("circle") 
Shape contains Optional("circle") 
Shape contains Optional("Scene") 

Он печатает пользователя и сцену правильно, но и печатает все формы круга, вокруг, когда должен быть только один в данный момент, или нет. Узлы есть, но физика тел не должна ударяться.

Любые идеи, почему это показывает хит для всех этих кругов, когда он должен соответствовать только 1 или никому? Благодаря!

Edit: дополнительная информация - Я имел аналогичные результаты при использовании user.physicsBody?.allContactedBodies() - Я использую CGPath создать PhysicsBody моего вращающегося узла

+0

Вы собираетесь подать отчет об ошибке или я? – 0x141E

+0

Знаете ли вы, что это все еще имеет место в iOS 10 GM? Отметьте ответ как разрешенный, как только я его попробую. –

ответ

2

Я создал простой тестовый проект со сценой, содержащей 3 дугу с физикой тела и 3 прямоугольных фигурных узла, которые определяют ограничительную рамку для каждой дуги. Затем я добавил обработчик касания, который помещает небольшой круг в точку перехода и метку, которая идентифицирует узлы, возвращенные enumerateBodiesAtPoint, с местоположением касания в качестве параметра. На рисунке ниже показаны результаты нажатия в разных местах сцены.

enter image description here

Из результатов испытаний, это не очевидно, как enumerateBodiesAtPoint определяет, является ли физика тела содержит указанную точку или нет. Ясно, однако, что этот метод не согласуется с его documentation. Я предлагаю вам не использовать его в своем приложении.

В качестве альтернативы, вы можете использовать встроенный детектор контакта SpriteKit в:

class GameScene: SKScene, SKPhysicsContactDelegate { 
    override func didMoveToView(view: SKView) { 
     self.physicsWorld.contactDelegate = self 
    } 

    func didBeginContact(contact: SKPhysicsContact) { 
     // Handle contacts between physics bodies here 
    } 
} 

Вы также можете проверить, если точка находится в пределах CGPath с помощью CGPathContainsPoint. Здесь вам нужно будет перебирать пути, которые вы использовали для создания дугообразных физических тел. На приведенном ниже рисунке показан результат моего тестового проекта, который использует CGPathContainsPoint вместо enumerateBodiesAtPoint. Возможно, вам нужно будет преобразовать контрольную точку с convertPoint в соответствующее пространство координат, прежде чем передать его CGPathContainsPoint.

enter image description here

Смежные вопросы