精灵套件断言失败:(typeA==b2|u dynamicBody | typeB==b2_dynamicBody)
有人问了这个问题,但最初的询问者不需要更改动态属性,所以他通过取消询问来回答自己的问题 我在iOS7中使用Sprite工具包,我希望能够在运行时更改SKPhysicsBody的动态属性。最初,我在触摸中改变了这一点。开始:方法。苹果开发者论坛上有人建议将更改转移到didSimulatePhysics:方法,但这也没有帮助 此代码导致错误:精灵套件断言失败:(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
-(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有。