2016-07-17 8 views
0

Ich habe derzeit zwei SKSpriteNodes, denen ich SKPhysicsBodies hinzugefügt habe. Wenn sie keinen SKJ-Punkt haben, kollidieren sie wie erwartet. Sobald ich den SKPhysicsJoint hinzufüge, gehen sie einfach durcheinander. Jede Verbindung, die ich hinzufüge, funktioniert richtig, aber SKPhysicsJointLimit begrenzt nur das Ausmaß, in dem die Knoten voneinander abweichen können, und nicht, wie nahe sie kommen können. Wie kann ich das beheben?SKPhysicsBodies kollidieren nicht nach dem Hinzufügen von SKPhysicsJointLimit

Hier sind Code, den ich für die gemeinsame bin mit:

let joint = SKPhysicsJointLimit.joint(withBodyA: object1.physicsBody!, bodyB: object2.physicsBody!, anchorA: CGPoint(x: object1.position.x + iconController.position.x, y: object1.position.y + iconController.position.y), anchorB: CGPoint(x: object2.position.x + iconController.position.x, y: object2.position.y + iconController.position.y)) 
    joint.maxLength = screen.height * 0.4 

physicsWorld.add(joint) 

PhysicsBody beiden Knoten:

self.physicsBody = SKPhysicsBody(circleOfRadius: self.size.width/2) 
self.physicsBody?.allowsRotation = false 
self.physicsBody?.friction = 0 
self.physicsBody?.mass = 0.1 

Ich habe es mit verschiedenen Werten für die oben genannten Modifikationen des SKPhysicsBody getestet und es führt das Gleiche.

Antwort

0

Ein SKPhysicsJoint Objekt verbindet zwei Physikkörper, so dass sie zusammen von der Physikwelt simuliert werden. Sie können auch SKPhysicJointPin verwenden:

Ein Stift Gelenk erlaubt die beiden Körper unabhängig um den Ankerpunkt zu drehen, als ob zusammen geheftet.

Wenn Ihre Objekte gut funktionieren, bevor die SKPhysicsJoint zusätzlich mit der Physik-Engine, so dass sie die didBeginContact gefeuert, wie Sie wollen und wie Sie gefasste haben, ich glaube, Ihr Problem ist einfach ein falscher Anker. Versuchen Sie hinzuzufügen:

let skView = self.view as! SKView skView.showsPhysics = true

in die Szene Initialisierungscode: Sie wird einen Überblick über die Physik Körper sehen, und vielleicht sehen Sie das Problem sofort sehen.

Ihnen dabei helfen Ich werde versuchen, ein Beispiel von Elementen kollidieren miteinander konfiguriert zu machen:

enum CollisionTypes: UInt32 { 
    case Boundaries = 1 
    case Element = 2 
} 

class GameScene: SKScene,SKPhysicsContactDelegate { 
    private var elements = [SKNode]() 
    override func didMoveToView(view: SKView) { 
     physicsWorld.gravity = CGVector(dx: 0, dy: 0) 
     self.physicsWorld.contactDelegate = self 
     let boundariesFrame = CGRectMake(20, 20, 200, 400) 
     let boundaries = SKShapeNode.init(rect: boundariesFrame) 
     boundaries.position = CGPointMake(350,150) 
     let boundariesBody = SKPhysicsBody.init(edgeLoopFromRect: boundariesFrame) 
     boundariesBody.dynamic = false 
     boundariesBody.categoryBitMask = CollisionTypes.Boundaries.rawValue 
     boundariesBody.contactTestBitMask = CollisionTypes.Element.rawValue 
     boundaries.physicsBody = boundariesBody 
     addChild(boundaries) 
     for index in 0..<5 { 
      let element = SKShapeNode(circleOfRadius: 10) 
      let body = SKPhysicsBody(circleOfRadius: 10) 
      body.linearDamping = 0 
      // body.mass = 0 
      body.dynamic = true 
      body.categoryBitMask = CollisionTypes.Element.rawValue 
      body.contactTestBitMask = CollisionTypes.Boundaries.rawValue | CollisionTypes.Element.rawValue 
      body.collisionBitMask = CollisionTypes.Boundaries.rawValue | CollisionTypes.Element.rawValue 
      element.physicsBody = body 
      element.position = CGPoint(x: size.width/2, y: size.height/2 - 30 * CGFloat(index)) 
      elements.append(element) 
      addChild(element) 
     } 
    } 
} 

Hoffe, dass es Sie Ihr Problem finden helfen.

+0

Ich hatte zuvor untersucht, was passieren könnte, indem ich die Physik wie vorgeschlagen zeige; Allerdings zeigte die Physik nur, was ich dachte, dass es zeigen sollte. Beide Anker waren korrekt in der Mitte jedes Knotens positioniert, mit einer Linie, die das Gelenk zwischen ihnen anzeigt. Wiederum funktioniert das Gelenk so, wie ich es nach außen möchte, aber wenn die Knoten sich nach innen bewegen, kollidieren sie einfach nicht. – mhillsman

+1

Also kollidierte dein Objekt gut vor der SKPhysicsJoint-Erweiterung? Ich frage es, weil Sie in Ihrer Frage keinen Code melden. –

+0

Ja, sie kollidierten gut. Sogar wenn das Gelenk hinzugefügt wird, kollidieren sie normalerweise mit allen Knoten außer einander. Ich füge meiner Frage einen Teil meines Codes hinzu. – mhillsman