如何使用Chipmunk在Cocos2d v3.0中使动态体静态化

时间:2014-02-06 03:37:53

标签: cocos2d-iphone callback game-physics chipmunk

我正在使用Cocos2d v3并希望在与另一个物体碰撞后将物体从动态更改为静态。目前我已经:

-(void)ccPhysicsCollisionPostSolve:(CCPhysicsCollisionPair *)pair static:(CCNode *)nodeA wildcard:(CCNode *)nodeB
{
   _player.physicsBody.type = CCPhysicsBodyTypeStatic;
}

-(BOOL)ccPhysicsCollisionPreSolve:(CCPhysicsCollisionPair *)pair static:(CCNode *)nodeA wildcard:(CCNode *)nodeB
{
   _player.physicsBody.type = CCPhysicsBodyTypeStatic;
   return YES;
}

但不起作用。我收到错误:

由于Chipmunk错误导致中止:在调用cpSpaceStep()或查询期间无法安全地执行此操作。将这些调用放入后步骤回调中。 失败的条件:!space->已锁定

然后我试图在碰撞点做一个关节,但它不能正常工作。

有没有办法在v3碰撞后立即将身体变为动态?我可以在使用Box2D的更高版本中完成。我想停止重力和其他力量,所以它不会移动。我想让它看起来像是粘在表面上。

在后步骤回调中阅读一些内容,但我不熟悉如何使用它们。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

如错误消息所述,您需要实现后步骤回调。 要在Cocos2d 3.0和Objective Chipmunk上执行此操作,首先需要导入新的头文件以访问高级的chipmunk属性:

#import "CCPhysics+ObjectiveChipmunk.h"

然后在碰撞处理程序中添加回调:

-(void)ccPhysicsCollisionPostSolve:(CCPhysicsCollisionPair *)pair static:(CCNode *)nodeA wildcard:(CCNode *)nodeB
{
    [[_physicsNode space] addPostStepBlock:^{
        _player.physicsBody.type = CCPhysicsBodyTypeStatic;
    } key:_player];
}

请注意,我假设您可以访问_physicsNode中的CCPhysicsNode。 在计算物理步骤时,CCPhysicsNode的花栗鼠空间被锁定。在计算步骤期间,会解决碰撞并移动对象 - 在此计算过程中更改正文类型可能会导致意外行为。

因此,您添加了postStepBlock回调。这是一个可以安全地改变体型的地方。

传递给回调的key值用于确保代码仅被调用一次(在删除对象时尤其有用,但在这种情况下也很有用)。

如果还添加了示例实现:https://www.makegameswith.us/gamernews/367/make-a-dynamic-body-static-in-cocos2d-30-with-chi