我正在使用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的更高版本中完成。我想停止重力和其他力量,所以它不会移动。我想让它看起来像是粘在表面上。
在后步骤回调中阅读一些内容,但我不熟悉如何使用它们。
任何帮助都将不胜感激。
答案 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