添加SKPhysicsBody会导致SKSpriteNode抖动。

3
我有两个名为“left-ball”和“right-ball”的SkSpriteNodes,它们从屏幕的两侧移动。 我为这两个球实现了碰撞检测。但是我注意到,在添加碰撞检测之前,球可以平稳地移动而没有任何晃动效果,但是在添加碰撞检测之后,球会晃动并沿其路径移动。 对于这两个球,我使用相同的位类别。
   static const int ballHitCategory = 1;

不抖动的:

enter image description here

有抖动的:

enter image description here

这是我在代码中尝试的内容:

_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的情况下添加碰撞检测的正确方法?
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
2

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

你可以将每个精灵的 affectedByGravity 设置为false。

或者你可以完全关闭游戏中的重力。

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

那么我们什么时候需要重力呢? - Teja Nandamuri
假设两个球撞在一起时,我希望它们掉落,那么在这种情况下我需要重力吗?@hamobi - Teja Nandamuri
1
你可以手动设置它们的速度向下移动。或者,如果你想让它看起来更自然,你可以使用重力。也许允许你的物理世界有重力。直到球互相碰撞之前,使它们不受重力影响。 - hamobi

0

不要担心重力。你应该设置你的精灵节点:

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

在_rightBall上相同


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,