2014-07-01 8 views
16

Ich habe diese gesucht und ich denke, es muss ein Parameter sein, um das zu beheben, aber ich habe es nicht gefunden.SpriteKit Knoten bleiben an den Kanten der Szene/nicht springen

Ich habe eine Szene in SpriteKit, wo ich einige Kreise/Bälle umherspringen lassen und jede Geschwindigkeit beibehalten möchte, die sie auf unbestimmte Zeit haben. Sie sollten von den Rändern der Szene abprallen.

Dies funktioniert, wenn sie sich schnell genug bewegen oder in einem ziemlich scharfen Winkel treffen, aber wenn sie langsamer gehen und in die Nähe der Kante kommen, bewegen sie sich (was gut ist) aber sie " Stick "an den Rändern. Dieses Kleben ist was ich nicht will. Sie sollten sich erholen, auch wenn sie sehr langsam gehen.

die Ränder einzurichten, habe ich:

SKPhysicsBody *borderBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; 
self.physicsBody = borderBody; 
self.physicsBody.friction = 0.0; 
self.physicsBody.restitution = 1.0; 
self.physicsBody.linerDamping = 0.0; 
self.physicsBody.angularDamping = 0.0; 
self.physicsBody.affectedByGravity = NO; 

Und auf den Kreis Knoten, ich habe ähnliche Einstellungen, wie:

ball.usesPresciseCollisionDetection = YES; 
ball.dynamic = YES; 
ball.restitution = 1.0; 
ball.linearDamping = 0.0; 
ball.angularDamping = 0.0; 
ball.friction = 0.0; 

ich bei Null, um die Schwerkraft in meiner Szene haben. Ich füge den Knoten einen Impuls hinzu und sie beginnen zu hüpfen. Es scheint sehr nahe zu sein, wenn Dinge herumspringen, aber wenn sich dann welche langsam bewegen und in einem flachen Winkel eindringen, "umarmen" sie die Kanten. Ich werde versuchen, eine Abbildung unten zur Veranschaulichung zu verwenden.

http://i.imgur.com/Rpr7luY.png

Ich habe mit vielen der PhysicsBody Einstellungen versucht zu spielen, kann aber nicht die Dinge kleben zu stoppen.

Danke!

+0

wahrscheinlich Nebeneffekt der Physik Simulation Ungenauigkeiten. Versuchen Sie es mit allowRotation aus. Wenn das nicht hilft, müssen Sie vielleicht mit diesem Verhalten leben. – LearnCocos2D

+0

Danke für den Gedanken. Ich habe versucht, allowRotation ein- und auszuschalten. Die Objekte neigen immer noch dazu, an den Kanten zu haften, anstatt bei langsamer Bewegung zu springen. Ich postete hier ein kurzes Video, das dies in Aktion zeigt: [link] (http://youtu.be/TFnBvsSs6Ak) – Jim

+1

Reibung auf Null setzen Reibung verhindert sie an den Rändern Prellen oder Sie können contact.collisionImpulse auf didBeginContact Funktion und Anwenden und wenig Kraft oder Impuls auf jede Kante Kollision – dragoneye

Antwort

0

Falscher Initialisierer. Es gibt 2 Arten von SKPhysicsBody - auf Volumen basierende und Edge-basierte. Sie verwenden genau die falsche Art, die keine Teilnehmerbewegung hat.

Bitte beachten Sie auch SKPhysicsBody Documentation.

+2

Ich glaube nicht, dass dies das ursprüngliche Problem löst. Ich habe mehrmals bemerkt, dass Objekte nicht springen, wenn ihre Geschwindigkeit zu niedrig ist. – sabiland

+2

Diese Antwort ist einfach falsch. – Jurik

3

Da die genannten Jungs, this answer intuitiv als Schritt in der richtigen Richtung gesehen werden könnte, aber das Problem ist mit der ganzen SpriteKit Physik-Engine. Es ist nicht deterministisch und Bruchteile gehen bei der Berechnung verloren, was eine ungenaue Simulation verursacht.

Die kurze Antwort ist stattdessen Box2D zu verwenden. Die hackische Antwort besteht darin, einen Impuls in die entgegengesetzte Richtung zu setzen.

All details are highlighted in my other answer.

@Jurik Froh könnte ich helfen :)

+0

Gibt es eine Möglichkeit, Box2D mit Spritekit anstelle von SpriteKit Physics Engine arbeiten zu lassen? –

+0

@AlexShuraits Es gibt keine Magie, Sie müssen Ihre eigene Physikschleife implementieren, die SpriteKit ersetzt – Mazyod

Verwandte Themen