2016-07-08 3 views
1

Я создаю проект (Fishing Game), который включает в себя длинную линию с крючком в конце, который должен ловить объекты (рыбу), перемещающиеся через экран. Когда рыба сталкивается с крюком, я хочу, чтобы функция запускалась. Однако я хочу, чтобы функция запускалась только тогда, когда к крюку связывается не остальная часть строки. Крючок является частью того же SKSpriteNode, что и линия. Как я могу заставить физическое тело линии находиться на самом дне, так что функция вызывается только тогда, когда рыба попадает в крючок или нижнюю часть линии? Я уже знаю, как изменить размер физического тела, а не место.Создание физического тела определенного размера и положения на объекте. (SpriteKit)

ответ

0

Сделайте свою линию 2 «Спрайты», «Линия» и «крюк», и у вас есть крючок, являющийся дочерью линии. Дайте каждому спрайту свой физический организм с его собственной категорией. Делая это таким образом, вы можете создать некоторые аккуратные эффекты, если вы используете SKPhysicsJoint, чтобы придать ему вид крюка, свисающего с линии. Если вы все еще хотите сохранить его как 1 спрайт, тогда, когда вы создаете физическое тело, некоторые из конструкторов имеют центр, с которым вы можете манипулировать. Другим вариантом является использование SKNode, добавление к нему физического тела, добавление этого нового узла в ваш спрайт и перенос узла на крючок.

1

При использовании didBeginContact(contact: SKPhysicsContact) функции, вы можете иметь contact.bodyA.node е contact.bodyB.node, два объекта, связанные с контактом, но вы должны также contact.contactPoint, точка, где два объекта прикоснулось.

О крючок, Я preefer сделать два разных объекта:

  • крюк (в SKShapeNode с точным CGPath)
  • леске

, но это не ваш случай.

Итак, у вас есть кадр спрайта со свойствами происхождения, размера и положения. Предположим, у вас есть крючок внизу вашего спрайта, рядом с точками происхождения. Когда вы знаете, что произошел контакт, вы просто подсчитаете расстояние между contact.contactPoint и точками вашего спрайта, чтобы узнать, что является самым коротким расстоянием, и какова часть вашей лески, которая была задействована в этом контакте.

func getDistance(p1:CGPoint,p2:CGPoint)->CGFloat { 
    let xDist = (p2.x - p1.x) 
    let yDist = (p2.y - p1.y) 
    return CGFloat(sqrt((xDist * xDist) + (yDist * yDist))) 
} 
+0

У меня возникли проблемы с SKShapeNodes, я нахожу это лучше, если они необходимы чтобы преобразовать узел в текстуру во время фазы загрузки и просто использовать SKSpriteNodes, пока яблоко не исправляет ошибки – Knight0fDragon

+0

Жаль, что Apple еще не настроила библиотеку SKShapeNode. Знаете ли вы некоторые новости о iOS 10, хорошие новости или всегда ту же ситуацию? –

+0

нет, не смотрел WWDC в этом году – Knight0fDragon

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