如果我向y方向施加1的冲量,球就会在没有失去任何能量的情况下来回反弹。然而,如果初始冲量为0.5或以下,当球撞到墙上时,它会立即失去所有的能量。为什么会发生这种情况?我对SKPhysicsBody类的属性有很好的理解。试试这段代码,看看你的电脑上是否有同样的行为。
-(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;
}发布于 2014-02-27 11:36:52
当碰撞速度足够小时(如您的CGVector of (0, 0.5)),雪碧套件物理引擎下的Box2d将将碰撞计算为非弹性(即,好像restitution为0,消除了任何弹力),并且节点不会弹出。
根据Box2d 文档,这是为了防止抖动。
在Box2d源代码中,甚至有以下一行:
/// A velocity threshold for elastic collisions. Any collision with a relative linear
/// velocity below this threshold will be treated as inelastic.
#define b2_velocityThreshold 你的冲动应该在这个门槛之上才能得到尊重。
https://stackoverflow.com/questions/22058292
复制相似问题