Sprite Kit断言失败:(typeA == b2_dynamicBody || typeB == b2_dynamicBody)

时间:2013-12-09 02:51:30

标签: dynamic ios7 box2d sprite-kit skphysicsbody

这被问到earlier,但原始提问者不需要改变动态属性,所以他通过疏忽来回答他自己的问题。

我在iOS7中使用Sprite Kit,我希望能够在运行时更改SKPhysicsBody的动态属性。最初我正在改变我的touchesBegan:方法。 Apple Dev论坛中有人建议将更改移至didSimulatePhysics:方法,但这也无济于事。

此代码导致错误:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
  if (!heyWereSwappingDynamismHere) 
  {
    heyWereSwappingDynamismHere = YES;
    SKNode * rope = [self childNodeWithName:@"rope"];
    SKNode * anchor = [rope childNodeWithName:@"anchor"];
    [listOfObjectsToSwapDynamic addObject:anchor];
  }
}

-(void) didSimulatePhysics 
{
  if (heyWereSwappingDynamismHere) 
  {
    for (SKNode * node in listOfObjectsToSwapDynamic) 
    {
        bool isItDynamic = node.physicsBody.isDynamic;
        node.physicsBody.dynamic = !isItDynamic;
    }
    [listOfObjectsToSwapDynamic removeAllObjects];
    heyWereSwappingDynamismHere = NO;
}

}

调试器中出现的错误是:

  

断言失败:(typeA == b2_dynamicBody || typeB == b2_dynamicBody),函数SolveTOI,文件/SourceCache/PhysicsKit/PhysicsKit-4.6/PhysicsKit/Box2D/Dynamics/b2World.cpp,第670行。

我在其他地方环顾四周,但这似乎是Sprite Kit实现(并覆盖)Box2D的一个问题。

也许?

2 个答案:

答案 0 :(得分:8)

您可以来回更改dynamic属性,但是,如果您使用碰撞/接触检测,则应该非常小心。

在两个物体碰撞/接触期间,声称它们中的至少一个必须是动态物体。如果在运行时将该属性更改为NO,并且另一个联系的主体也是静态的(非动态的),并且发生了碰撞/联系回调,则会抛出此特定的断言错误 - 将在2个静态主体之间检测到联系 - 执行,Box2d不喜欢。

可能的解决方法技巧 - 对我有用,甚至直接用didBeginContact:方法:

SKPhysicsBody *temp = node.physicsBody;
temp.dynamic = NO;
node.physicsBody = temp;

答案 1 :(得分:0)

如果原始海报的意图是在直接操纵SKNode时禁用碰撞,可以按如下方式进行:

@property (nonatomic, strong) SKNode *node;
@property (nonatomic, assign) uint32_t previousCollisionBitMask;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  // Disable collisions & gravity
  self.previousCollisionBitMask = self.node.physicsBody.collisionBitMask;
  self.node.physicsBody.collisionBitMask = 0;
  self.node.physicsBody.affectedByGravity = NO;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  // Enable collisions & gravity
  self.node.physicsBody.collisionBitMask = self.previousCollisionBitMask;
  self.node.physicsBody.affectedByGravity = YES;
}

这会使对象无法计算碰撞。在移动物体时,禁用重力会使物体不会掉落。

如果您还关注contactTextBitMask,您可以使用类似的逻辑来禁用当您使用触摸操作场景时。