SpriteKit добавляет пружинное соединение к каждому узлу

Я использую SpriteKit для создания забавного пользовательского интерфейса Hotspot для проекта. Это должно быть очень просто! Просто фоновое изображение с множеством точек. Когда вы нажимаете на точку, она увеличивается. При повторном нажатии он возвращается к своему нормальному размеру и положению. Но, что более важно, каждая точка имеет физику, поэтому, когда она увеличивается, другие временно сдвигаются в сторону. Когда точки вернутся к своему обычному масштабу, они вернутся в исходное положение.

Для этого у меня есть несколько узлов SKShapeNodes, расположенных на странице. Я также создаю SKPhysicsJointSpring, который прикреплен к физическому телу сцены и SKShapeNode.

Вот код сцены:

override func didMoveToView(view: SKView) {

    name = "Hotspot test"
    physicsWorld.gravity = CGVectorMake(0, 0)

    let physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
    self.physicsBody = physicsBody


    for i in 1...10 {

        let j:__uint32_t = 0x1 << UInt32(i) // <- IGNORE THIS. IRRELEVANT
        let shape = DotNode(circleOfRadius: 60, name: "Ball"+String(i), id: i, bitmask: j)

        // Position objects in a circle around the center
        let degrees = (360/10)*i
        let radians = degrees.degreesToRadians
        let radius = CGFloat(300)
        let cosR = cos(radians)
        let sinR = sin(radians)
        let xPos = radius*cosR+frame.size.width/2
        let yPos = radius*sinR+frame.size.height/2

        let pos = CGPoint(x: xPos, y: yPos)
        shape.position = pos

        addChild(shape)

        let spring = SKPhysicsJointSpring.jointWithBodyA(self.physicsBody!, bodyB: shape.physicsBody!, anchorA: pos, anchorB: pos)
        spring.damping = 0.01
        physicsWorld.addJoint(spring)
    }

DotNode - это подкласс SKShapeNode. Вот как это выглядит на экране:

статические узлы

и вот как это выглядит при увеличении масштаба:

введите здесь описание изображения

Видите проблему? Теперь они не взаимодействуют друг с другом. Я вижу, что соединение Spring прикреплено, когда перетаскиваю одно из них:

введите здесь описание изображения

Есть ли причина, по которой объекты больше не взаимодействуют друг с другом?

Вот что произойдет, если вы просто удалите сустав:

введите здесь описание изображения

Объекты толкают друг друга. Это должно быть достижимо. Что я делаю неправильно?


person Lee Probert    schedule 26.04.2016    source источник
comment
Установите одинаковые значения битовой маски, например let j:__uint32_t = 0x1. См. Документы Apple, чтобы узнать о битовых масках. На двух нижних снимках экрана я вижу тонкую синюю линию вверху, но не на двух других, были ли другие изменения в сцене?   -  person Gliderman    schedule 26.04.2016
comment
Они вообще не используют битовые маски. Это был унаследованный код, когда я пытался добавить поле для каждого узла. Каждый из узлов имеет пружинный шарнир. Если я перетащу один из узлов (как на скриншоте), вы увидите его стык в виде тонкой синей линии. Вы видите это только тогда, когда кого-то тащат. Я уверен, что пружины существуют и подключены к сцене и узлу. Дело в том, что они теперь не взаимодействуют друг с другом.   -  person Lee Probert    schedule 26.04.2016


Ответы (1)


К сожалению, со SpriteKit это невозможно. Это сообщение: SKPhysicsJoint: Контакты и коллизии не работают подтверждает это.

Должен сказать, это кажется безумием. Почему бы вам не создать шарниры и пружины, а затем соединенные вами узлы столкнуться и отреагировать в физическом мире?

Кажется, мне придется потерять пружину и просто закодировать узлы, чтобы они постоянно возвращались в исходное положение. Таким образом, когда один из них масштабируется и отталкивает других, они всегда будут пытаться вернуться домой.

person Lee Probert    schedule 28.04.2016
comment
Да, я думаю, что Sprite-Kit довольно сломан. - person trojanfoe; 28.04.2016
comment
Это должен был быть такой простой интерфейс для создания. Вы знаете, возможно ли использование физики UIKit? - person Lee Probert; 28.04.2016
comment
Я не знаю, что такое UIKit Physics, но полагаю, вы могли бы легко сделать это с помощью UIKit. Я не слишком знаком с тем, что вы пытаетесь сделать, но я думаю, что знаю и могу представить, что будет нетрудно приступить к работе. Вероятно, вы планируете использовать слой для каждой кнопки и управлять их перемещением в пользовательском классе представления. - person trojanfoe; 28.04.2016
comment
Вам следует взглянуть на UIKit Dynamics: raywenderlich.com/50197/uikit-dynamics-tutorial - person Lee Probert; 28.04.2016
comment
Это тоже отличная статья: teehanlax.com/blog/introduction-to- uikit-Dynamics - person Lee Probert; 28.04.2016