添加 SKPhysicsBody 导致 SKSpriteNode 摇晃
Adding SKPhysicsBody causes the SKSpriteNode to shake
我有两个 SkSpriteNodes
,分别是 left-ball
和 right-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 的情况下添加碰撞检测的正确方法是什么?
所以你使用非物理代码移动精灵..但它们仍然是物理模拟的一部分。我猜他们是在对抗地心引力。
将每个 sprite 上的 affectedByGravity
设置为 false
或者您可以在游戏中完全关闭重力
[self.physicsWorld setGravity:CGVectorMake(0, 0)];
不用担心地心引力。你应该设置你的精灵节点:
_leftBall.physicsBody.dynamic=YES;
_leftBall.physicsBody.affectedByGravity=NO;
_rightBall 相同
我有两个 SkSpriteNodes
,分别是 left-ball
和 right-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 的情况下添加碰撞检测的正确方法是什么?
所以你使用非物理代码移动精灵..但它们仍然是物理模拟的一部分。我猜他们是在对抗地心引力。
将每个 sprite 上的 affectedByGravity
设置为 false
或者您可以在游戏中完全关闭重力
[self.physicsWorld setGravity:CGVectorMake(0, 0)];
不用担心地心引力。你应该设置你的精灵节点:
_leftBall.physicsBody.dynamic=YES;
_leftBall.physicsBody.affectedByGravity=NO;
_rightBall 相同