2016-03-28 9 views
1

ich zur Zeit zwei SKSpriteNodes auf die jeweils andere habe wie so (Der weiße Teil ist ein und der braune runde Kreis Teil ist die andere):Prevent SKPhysicsBody Von Pushing SKSpriteNode Nach oben

enter image description here

Die weiße Der Teil befindet sich 1/3 auf dem runden braunen Sprite-Knoten. Auf dem Bild hat der braune runde Teil bereits einen SKPhysicsBody, wie es von der hellblauen Kontur um ihn herum gesehen wird. Wenn ich einen SKPhysicsBody um den oberen ovalischen weißen Teil hinzufüge, schiebt er es nach oben und nicht in die Position, die ich wollte.

enter image description here

Wie kann ich einen SKPhysics Körper beide Körper von Sprites coving haben aber nicht die Physik Körper schieben aufeinander, die der weiße Teil nach oben bewegen macht? Ich möchte, dass der weiße Teil in der Position bleibt, in der er sich im ersten Bild befand.

Danke für alle Hilfe!

Hier ist der Code, den ich für den SKPhysicsBody der verwendet:

// create, position, scale & add the round body 
roundBody = SKSpriteNode(imageNamed: "roundBody") 
roundBody.position  = CGPoint(x: 207, y: 70) 
roundBody.zPosition = 1 
roundBody.xScale  = 0.3 
roundBody.yScale  = 0.3 
// add sprite node to view 
self.addChild(roundBody) 

// create, position, scale & add the head 
theHead!.position = CGPoint(x: 207, y: roundBody.frame.maxY/1.15) 
theHead!.zPosition = 2 
theHead!.xScale  = 0.3 
theHead!.yScale  = 0.3 

// setting up a SKPhysicsBody for the round body 
roundBody.physicsBody = SKPhysicsBody(circleOfRadius: roundBody.size.width/4) 
roundBody.physicsBody!.dynamic = true 
roundBody.physicsBody!.affectedByGravity = true 
roundBody.physicsBody!.allowsRotation = false 
roundBody.physicsBody!.pinned = false 

// setting up a SKPhysicsBody for the head 
theHead!.physicsBody = SKPhysicsBody(circleOfRadius: theHead!.size.width/2) 
theHead!.physicsBody!.dynamic = true 
theHead!.physicsBody!.affectedByGravity = false 
theHead!.physicsBody!.allowsRotation = false 
theHead!.physicsBody!.pinned = false 

Antwort

1

Wenn Sie es nie verschieben möchten, setzen Sie es .dynamic Eigenschaft auf false. Dann können andere Objekte mit ihr kollidieren (oder kollidieren) (abhängig von ihrer KollisionBitMask), aber sie wird sich als Reaktion auf diese Kollisionen nicht bewegen.

+0

Ich habe versucht, die dynamische Eigenschaft von physicsBody auf false zu setzen und ja, das hat mein Problem behoben, dass es richtig positioniert wurde, aber jetzt kann ich keine Geschwindigkeit auf diese SKSpriteNodes anwenden. Irgendwelche Gedanken darüber, wie ich die Positionierung beibehalten kann, aber die Sprites über Geschwindigkeit, Impuls usw. bewegen kann? –

+0

@AlanGuilfoyle - wäre es sinnvoll, theHead ein Kind von roundBody zu machen, damit sie sich zusammen bewegen? Sind sie immer zusammen, um ein größeres Sprite zu bilden? –

+0

Ich bin nicht sicher, wie Vererbung in Spritekit zu tun ist. Der 'theHead' wäre ein Kind des 'runden Körpers', da sie immer zusammen sein würden.Allerdings konnte ich mein Problem mit einem SKPhysicsJointPin beheben –

1

Ich konnte herausfinden, dass, wenn Sie SKPhysicsJointPin verwenden, es genau das tut, was ich brauchte! (Das war im Grunde ein Sprite Kopfpin auf seinen Körper und teilen sich ein Physik Körper)

let joinTogether = SKPhysicsJointPin.jointWithBodyA(
        roundBody.physicsBody!, 
        bodyB:theHead!.physicsBody!, 
        anchor: GPointMake(CGRectGetMidX(roundBody.frame), 
        CGRectGetMinY(theHead!.frame))) 

scene!.physicsWorld.addJoint(joint) 

Hope this jemand in der Zukunft hilft!

1

Ihre eigene Antwort ist richtig und eine bessere Lösung, aber nur weiter zu erklären.

Der Grund für die Kollision der Körper ist, dass die Kollisions-Bitmaske eines Physikkörpers standardmäßig auf alle Kategorien eingestellt ist, was bedeutet, dass es mit allem kollidiert. In Ihrem Code rufen Sie nicht an

weshalb es die Standardwerte verwendet.

Um das zu ändern, könnten Sie Ihrem Körper und Kopf eine andere KollisionBitMask geben. Ich bin sicher, Sie mit diesem früher befassen wird oder später, wenn Sie Kollisionen behandeln

auch als Tipp ist es eine bessere Idee, um nicht die Physik Körper zu zwingen, auspacken, wenn Sie zu haben, auch wenn Sie sie wissen, existieren. Also solltest du dein ersetzen! mit? wenn möglich.