首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpriteKit球失去所有能量击球墙,restitution=1

SpriteKit球失去所有能量击球墙,restitution=1
EN

Stack Overflow用户
提问于 2014-02-27 03:14:52
回答 1查看 908关注 0票数 12

如果我向y方向施加1的冲量,球就会在没有失去任何能量的情况下来回反弹。然而,如果初始冲量为0.5或以下,当球撞到墙上时,它会立即失去所有的能量。为什么会发生这种情况?我对SKPhysicsBody类的属性有很好的理解。试试这段代码,看看你的电脑上是否有同样的行为。

代码语言:javascript
复制
-(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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-27 11:36:52

当碰撞速度足够小时(如您的CGVector of (0, 0.5)),雪碧套件物理引擎下的Box2d将将碰撞计算为非弹性(即,好像restitution为0,消除了任何弹力),并且节点不会弹出。

根据Box2d 文档,这是为了防止抖动。

在Box2d源代码中,甚至有以下一行:

代码语言:javascript
复制
/// A velocity threshold for elastic collisions. Any collision with a relative linear
/// velocity below this threshold will be treated as inelastic.
#define b2_velocityThreshold            

你的冲动应该在这个门槛之上才能得到尊重。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22058292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档