这是问 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;
}
}
调试器中出现的错误是:
我在别处环顾四周,但这似乎是 Sprite Kit 对 Box2D 的实现(和覆盖)的一个问题。
也许?
最佳答案
您可以来回更改 dynamic
属性,但是,如果您使用碰撞/接触检测,则应该非常小心。
在两个物体之间的碰撞/接触期间,断言其中至少一个必须是动态物体。如果您在运行时将该属性更改为 NO,并且另一个接触的物体也是静态的(非动态的),并且正在发生碰撞/接触回调,它将抛出此特定断言错误 - 将在 2 个静态物体中间检测到接触-执行,Box2d 不喜欢。
一个可能的解决方法 - 对我有用,甚至直接在 didBeginContact:
方法中:
SKPhysicsBody *temp = node.physicsBody;
temp.dynamic = NO;
node.physicsBody = temp;
关于dynamic - Sprite Kit 断言失败 : (typeA == b2_dynamicBody || typeB == b2_dynamicBody),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20462295/