Как дать каждому узлу одинаковую начальную позицию на экране, даже если родительский элемент движется?

Я разрабатываю игру с помощью SpriteKit. У меня есть куб, который является родительским для всех остальных узлов. Если пользователь нажимает на экран, Узел 1 начинает падать с середины экрана. После того, как Узел 1 приземляется на куб, куб немного опускается. Когда пользователь нажимает еще раз, узел 2 начинает падать, но узел 2 занимает более низкое положение, чем узел 1, потому что родительский узел переместился вниз.

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

Родительский узел:

Cube.setScale(0.85)
Cube.zPosition = 3
Cube.position.x = self.size.width / 2
Cube.physicsBody = SKPhysicsBody(texture: CubeTexture,size: CGSize(width: CubeTexture.size().width * 0.9, height: CubeTexture.size().height * 0.82)) 
    Cube.physicsBody?.isDynamic = false
    Cube.physicsBody?.affectedByGravity = false
    self.addChild(Cube)

Дочерние узлы:

    node1.setScale(0.95)
    node1.position = CGPoint(x: -350, y: 310)  //<-- I want this position to be a constant value on the screen
    node1.zPosition = 1

    node1.physicsBody = SKPhysicsBody(texture: node1Texture,size: CGSize(width: node1Texture.size().width * 1.1, height: node1Texture.size().height * 0.85)) 
    node1.physicsBody?.isDynamic = true
    node1.physicsBody?.affectedByGravity = false
    node1.physicsBody?.usesPreciseCollisionDetection = true
    node1.physicsBody?.restitution = 0
    Cube.addChild(node1):


    lazy var node2 = node1.copy() as! SKSpriteNode
    lazy var node3 = node1.copy() as! SKSpriteNode
    lazy var node4 = node1.copy() as! SKSpriteNode
    lazy var node5 = node1.copy() as! SKSpriteNode
    lazy var node6 = node1.copy() as! SKSpriteNode
    lazy var node7 = node1.copy() as! SKSpriteNode
    lazy var node8 = node1.copy() as! SKSpriteNode
    lazy var node9 = node1.copy() as! SKSpriteNode
    lazy var node10 = node1.copy() as! SKSpriteNode

Движение куба каждый раз, когда узел падает:

  func addMovement3(Cube:SKSpriteNode) {
    var actionArray = [SKAction]()

    actionArray.append(SKAction.moveTo(y: Cube.position.y - 61.8, duration: 0.1))

    Cube.run(SKAction.sequence(actionArray))
}

person Joy Lucas    schedule 03.08.2018    source источник


Ответы (1)


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

person ekscrypto    schedule 03.08.2018
comment
Но для игры важно, чтобы узлы были дочерними элементами куба. Потому что, если куб движется, дети движутся вместе с кубом. Если бы узлы не были дочерними элементами куба, они бы просто ускользнули. @ekscrypto - person Joy Lucas; 03.08.2018
comment
Но вы только что сказали, что хотите, чтобы узлы имели статическое положение и не перемещались вместе с кубом ... У вас всегда может быть пустой узел, содержащий куб и падающие узлы, и перемещать этот пустой узел, когда вам нужно переместить и куб, и узлы, перемещайте только куб, если вы хотите, чтобы падающие узлы оставались в том же положении - person ekscrypto; 03.08.2018