2014-02-27 4 views
11

Wenn ich einen Impuls von 1 in der y-Richtung anwende, springt der Ball vor und zurück, ohne Energie zu verlieren. Wenn der Anfangsimpuls jedoch 0,5 oder niedriger ist, verliert der Ball sofort die gesamte Energie, wenn er auf die Wand trifft. Warum passiert dies? Ich habe ein ziemlich gutes Verständnis der Eigenschaften der SKPhysicsBody-Klasse. Probieren Sie diesen Code aus, um zu sehen, ob Sie das gleiche Verhalten auf Ihrem Computer haben.SpriteKit Ball verliert alle Energie schlagende Wand, Restitution = 1

-(id)initWithSize:(CGSize)size { 
if (self = [super initWithSize:size]) { 
    /* Setup your scene here */ 
    self.physicsWorld.gravity = CGVectorMake(0.0f, 0.0f); 
    SKPhysicsBody* borderBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; 
    self.physicsBody = borderBody; 
    self.physicsBody.friction = 0.0f; 
    self.backgroundColor = [SKColor colorWithRed:0.7 green:0.7 blue:0.7 alpha:1.0]; 

    SKShapeNode *ball = [SKShapeNode node]; 
    CGMutablePathRef pathToDraw = CGPathCreateMutable(); 
    [ball setStrokeColor:[UIColor blackColor]]; 
    CGPathMoveToPoint(pathToDraw, NULL, 0, 0); 
    CGPathAddEllipseInRect(pathToDraw, NULL, CGRectMake(-16, -16, 32, 32)); 
    ball.path = pathToDraw; 

    ball.position = CGPointMake(size.width/2, size.height/2); 
    ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ball.frame.size.width/2]; 
    ball.physicsBody.friction = 0.0f; 
    ball.physicsBody.restitution = 1.0f; 
    ball.physicsBody.linearDamping = 0.0f; 
    ball.physicsBody.allowsRotation = NO; 

    [self addChild:ball]; 

    [ball.physicsBody applyImpulse:CGVectorMake(0, 0.5)]; 
} 
return self; 
} 
+0

Ja. Ich bekomme das gleiche Verhalten. – ZeMoon

Antwort

1

Wenn die Kollisionsgeschwindigkeit ist klein genug, um (wie Ihre CGVector von (0, 0.5)), Box2D den Kit-Physik-Engine Spriten zugrunde liegen wird die Kollision als unelastisch (dh, als ob die restitution 0 war, jeden bounciness Entfernung) berechnen, und der Knoten springt nicht zurück.

Dies ist per Box2d documentation, Jitter zu verhindern.

Im Box2D Quellcode, haben Sie auch diese Zeile:

/// A velocity threshold for elastic collisions. Any collision with a relative linear 
/// velocity below this threshold will be treated as inelastic. 
#define b2_velocityThreshold    

Ihr Impuls oberhalb dieser Schwelle sein sollte für die Restitution zu respektieren.

+0

Ich kann das Problem mit einem Impuls von (10,0,3,27), ca. 18 Grad, oder flacheren Winkel reproduzieren. Was macht eine niedrige lineare Geschwindigkeit aus, weil es in diesem Winkel eine ziemlich gute Rate schneidet? Und wie würdest du b2_velocityThreshold in SpriteKit überschreiben (da dies die empfohlene Antwort auf Box2D-Foren zu sein scheint)? –

Verwandte Themen