2015-08-18 3 views
0

Есть ли способ дать SKNode собственную физику? У меня есть вызов SKShapeNode «backGround», который я использую для родительского узла большинства других моих узлов. Я постоянно перемещаю «фон» влево, чтобы представить иллюзию, что игрок движется вперед. Однако один из объектов, которые имеют «backGround» в качестве родительского узла, - это штырь с веревкой, висящей от него. Когда фон ускоряется влево, есть ли способ сделать это так, чтобы веревка не качалась туда и обратно, поскольку веревки имеют тенденцию делать, когда они ускоряются или замедляются?Дайте SKNode собственную физику

EDIT: Вот мой код:

func createRopeNode(pos: CGPoint) -> SKSpriteNode{ 
    let ropeNode = SKSpriteNode(imageNamed: "Ball") 
    ropeNode.size = CGSize(width: 5, height: 5) 
    ropeNode.physicsBody = SKPhysicsBody(rectangleOfSize: ropeNode.size) 
    ropeNode.physicsBody?.affectedByGravity = true 
    ropeNode.physicsBody?.collisionBitMask = 0 
    ropeNode.alpha = 1 
    ropeNode.position = CGPoint(x: pos.x + 0, y: pos.y) 
    ropeNode.name = "RopePiece" 
    let text = SKSpriteNode(imageNamed: "RopeTexture") 
    ropeNode.zPosition = -5 
    text.runAction(SKAction.rotateByAngle(atan2(-dx!, dy!), duration: 0)) 
    ropeNode.addChild(text) 
    return ropeNode 
} 
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
    /* Called when a touch begins */ 

    if (!playerIsConnected){ 
     playerIsConnected = true 
    for touch in (touches as! Set<UITouch>) { 
     let location = touch.locationInNode(self) 
     dx = pin.position.x - playerPoint!.x 
     dy = pin.position.y - playerPoint!.y 
     let length = sqrt(pow(dx!, 2) + pow(dy!, 2)) 
     let distanceBetweenRopeNodes = 5 
     let numberOfPieces = Int(length)/distanceBetweenRopeNodes 
     var ropeNodes = [SKSpriteNode]() 

     //adds the pieces to the array at respective locations 
     for var index = 0; index < numberOfPieces; ++index{ 
      let point = CGPoint(x: pin.position.x + CGFloat((index) * distanceBetweenRopeNodes) * sin(atan2(dy!, -dx!) + 1.5707), y: pin.position.y + CGFloat((index) * distanceBetweenRopeNodes) * cos(atan2(dy!, -dx!) + 1.5707)) 
      let piece = createRopeNode(point) 
      ropeNodes.append(piece) 
      world.addChild(ropeNodes[index]) 
     } 
     let firstJoint = SKPhysicsJointPin.jointWithBodyA(ropeNodes[0].physicsBody, bodyB: pin.physicsBody, anchor: 
      CGPoint(x: (ropeNodes[0].position.x + pin.position.x)/2, y: (ropeNodes[0].position.y + pin.position.y)/2)) 
     firstJoint.frictionTorque = 1 
     self.physicsWorld.addJoint(firstJoint) 
     for var i = 1; i < ropeNodes.count; ++i{ 
      let nodeA = ropeNodes[i - 1] 
      let nodeB = ropeNodes[i] 
      let middlePoint = CGPoint(x: (nodeA.position.x + nodeB.position.x)/2, y: (nodeA.position.y + nodeB.position.y)/2) 
      let joint = SKPhysicsJointPin.jointWithBodyA(nodeA.physicsBody, bodyB: nodeB.physicsBody, anchor: middlePoint) 
      joint.frictionTorque = 0.1 
      self.physicsWorld.addJoint(joint) 
     } 
     finalJoint?.frictionTorque = 1 
     finalJoint = SKPhysicsJointPin.jointWithBodyA(ropeNodes[ropeNodes.count - 1].physicsBody, bodyB: player.physicsBody, anchor: 
      CGPoint(x: (ropeNodes[ropeNodes.count - 1].position.x + playerPoint!.x)/2, y: (ropeNodes[ropeNodes.count - 1].position.y + playerPoint!.y)/2)) 
     self.physicsWorld.addJoint(finalJoint!) 
     } 
    } 
    else{ 
     physicsWorld.removeJoint(finalJoint!) 
     playerIsConnected = false 
    } 
} 
+0

Если вы переместите узел 'world', все должно двигаться без ускорения или замедления. – 0x141E

+0

@ 0x141E Я создал свою веревку, используя серию SKJointPins, которые я добавил в сцену с помощью 'self.PhysicsWorld.addJoint (myJoint)'. Разве это не приведет к тому, что веревка ускорится, когда «мир» ускорится? – Lahav

+0

Ваш мир меняет скорость с течением времени или двигается с постоянной скоростью? – 0x141E

ответ

1

Якорные точки, что вы ищете. Переместите опорную точку сцены только для перемещения «камеры» сцены (что отображается на экране). Это не будет толкать штырь и веревку. Имейте в виду, что опорная точка находится в слегка отличном от сцены месте.

В случае, если ширина сцены может быть 1024, «ширина» из точки привязки для одной длины сцены равна 1 (в основном рассчитывают как один ширину узла). То же самое для высоты, где она может быть 768, «высота» все равно будет 1 в координатном пространстве якорной точки. Таким образом, чтобы сдвинуть половину ширины экрана, переместите опорную точку 0,5

Якорная точка - это CGPoint, поэтому вы можете двигаться вертикально. Вот простой пример:

var xValue : Float = 0.75 
var yValue : Float = 0.0 
self.scene?.anchorPoint = CGPointMake(xValue, yValue); 

И для дальнейшего чтения, here's a link to the documentation на опорных точек для спрайтов.

+1

Обновлен мой ответ для Swift, только что заметил, что вы использовали этот язык. Извини за это! – Gliderman

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