精灵套件断言失败:(typeA==b2|u dynamicBody | typeB==b2_dynamicBody)

精灵套件断言失败:(typeA==b2|u dynamicBody | typeB==b2_dynamicBody),dynamic,ios7,box2d,sprite-kit,skphysicsbody,Dynamic,Ios7,Box2d,Sprite Kit,Skphysicsbody,有人问了这个问题,但最初的询问者不需要更改动态属性,所以他通过取消询问来回答自己的问题 我在iOS7中使用Sprite工具包,我希望能够在运行时更改SKPhysicsBody的动态属性。最初,我在触摸中改变了这一点。开始:方法。苹果开发者论坛上有人建议将更改转移到didSimulatePhysics:方法,但这也没有帮助 此代码导致错误: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (!heyWe

有人问了这个问题,但最初的询问者不需要更改动态属性,所以他通过取消询问来回答自己的问题

我在iOS7中使用Sprite工具包,我希望能够在运行时更改SKPhysicsBody的动态属性。最初,我在触摸中改变了这一点。开始:方法。苹果开发者论坛上有人建议将更改转移到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的实现(和覆盖)的一个问题


也许?

您可以前后更改
动态
属性,但是,如果使用碰撞/接触检测,您应该非常小心

在两个物体之间的碰撞/接触过程中,至少有一个物体必须是动态物体。如果在运行时将该属性更改为“否”,并且另一个已联系的实体也是静态的(非动态),并且正在发生碰撞/联系回调,则会抛出此特定的断言错误-在执行过程中会在两个静态实体之间检测到联系,而Box2d不喜欢这种情况

一个可能的解决方法-对我有效,甚至直接在
didBeginContact:
方法中:

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

如果原始海报的目的是在直接操作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,则在使用触摸操作场景时,可以使用类似的逻辑禁用该功能。

尝试创建一个新的实体来替换前一个实体,或者您不需要它是静态的,但您不希望它与任何东西发生碰撞。在这种情况下,请使用“接触类别”并将“重力比例”(gravityscale)设置为0,这将具有与静态实体相同的效果。在bix2d中,你不能将一个实体从静态更改为动态,反之亦然,我想这对于sprite kit也是一样的。可能相关:+1我还注意到iOS 8没有对此抱怨,但iOS 7有。