这是问 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/

10-14 21:45