添加 SKPhysicsBody 会导致 SKSpriteNode 抖动

Posted

技术标签:

【中文标题】添加 SKPhysicsBody 会导致 SKSpriteNode 抖动【英文标题】:Adding SKPhysicsBody causes the SKSpriteNode to shake 【发布时间】:2015-11-30 18:27:48 【问题描述】:

我有两个SkSpriteNodes,分别称为left-ballright-ball。它们从屏幕两侧流出。

我为这两个球实现了collision detection。但是我注意到,在我添加碰撞检测之前,球运动平稳,没有任何晃动效果,但在我添加碰撞检测后,球在晃动并在其路径中移动。

我对这两个球使用相同的位类别:

   static const int ballHitCategory = 1;

不摇晃:

摇晃:

这是我在代码中尝试过的:

_leftBall.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:_leftBall.frame.size];
_leftBall.physicsBody.categoryBitMask=ballHitCategory;
_leftBall.physicsBody.contactTestBitMask=ballHitCategory;
_leftBall.physicsBody.collisionBitMask=ballHitCategory;
_leftBall.physicsBody.dynamic=YES;
_leftBall.physicsBody.usesPreciseCollisionDetection=YES;

 _rightBall.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:_rightBall.frame.size];
_rightBall.physicsBody.categoryBitMask=ballHitCategory;
_rightBall.physicsBody.contactTestBitMask=ballHitCategory;
_rightBall.physicsBody.collisionBitMask=ballHitCategory;
_rightBall.physicsBody.dynamic=YES;
_rightBall.physicsBody.usesPreciseCollisionDetection=YES;




-(void)didBeginContact:(SKPhysicsContact *)contact


    _leftBall = (SKSpriteNode*)contact.bodyA.node;
    _rightBall = (SKSpriteNode *)contact.bodyB.node;

    if(_leftBall.physicsBody .categoryBitMask == ballHitCategory ||  _rightBall.physicsBody.categoryBitMask == ballHitCategory)
    

        NSLog(@" hit the ");
        //setup your methods and other things here
        [_leftBall removeFromParent];
        [_rightBall removeFromParent];


    

请注意,只有在我添加碰撞检测后才会发生抖动,如果我删除上面的代码,一切都很好。

在不影响 skspritenode 的情况下添加碰撞检测的正确方法是什么?

【问题讨论】:

【参考方案1】:

所以你使用非物理代码移动精灵。但它们仍然是物理模拟的一部分。我猜他们是在与重力作斗争。

将每个精灵上的 affectedByGravity 设置为 false

或者您可以在游戏中完全关闭重力

[self.physicsWorld setGravity:CGVectorMake(0, 0)];

【讨论】:

那么我们什么时候需要重力? 让我们说当两个球互相撞击时,我希望它们掉下来,在这种情况下我需要重力吗? @hamobi 你可以手动设置他们的速度下降..或者如果你想让它看起来更自然你可以使用重力。也许让你的物理世界有重力。使球在相互碰撞之前不受重力影响【参考方案2】:

不用担心重力。你应该设置你的 spritenode:

_leftBall.physicsBody.dynamic=YES;
_leftBall.physicsBody.affectedByGravity=NO;

_rightBall 上也一样

【讨论】:

以上是关于添加 SKPhysicsBody 会导致 SKSpriteNode 抖动的主要内容,如果未能解决你的问题,请参考以下文章

iOS -- SpriteKit框架之SKPhysicsBody的移动和连接

将精灵附加到 SKPhysicsBody

为啥 SKPhysicsBody -bodyWithEdgeLoopF​​romRect 不对碰撞做出反应?

SKPhysicsBody的奇怪行为

SKPhysicsBody 改变动画/物理速度

具有相同 SKPhysics 身体对象的多个精灵