Cocos2d iphone 如何在Cocos2d v3.0中使用花栗鼠使动态身体保持静态

Cocos2d iphone 如何在Cocos2d v3.0中使用花栗鼠使动态身体保持静态,cocos2d-iphone,callback,game-physics,chipmunk,Cocos2d Iphone,Callback,Game Physics,Chipmunk,我正在使用cocos2dv3,希望在与另一个实体碰撞后将一个实体从动态更改为静态。目前我有: -(void)ccPhysicsCollisionPostSolve:(CCPhysicsCollisionPair *)pair static:(CCNode *)nodeA wildcard:(CCNode *)nodeB { _player.physicsBody.type = CCPhysicsBodyTypeStatic; } 或 但两者都不起作用。我得到一个错误: 由于Chipmun

我正在使用cocos2dv3,希望在与另一个实体碰撞后将一个实体从动态更改为静态。目前我有:

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

但两者都不起作用。我得到一个错误:

由于Chipmunk错误而中止:在调用cpSpaceStep()或查询期间无法安全完成此操作。将这些调用放入步骤后回调。 失败条件:!空间->锁定

然后我试着在碰撞点做一个接头,但它不能正常工作

有没有一种方法可以在物体在v3中碰撞时立即将其更改为动态的?我可以在更高版本中使用Box2D来实现。我想阻止重力和其他力,这样它就不会移动了。我想让它看起来像粘在表面上一样

阅读一些关于步骤后回调的内容,但我不熟悉如何使用它们


任何帮助都将不胜感激。

如错误消息所述,您需要实现步骤后回调。 要在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];
}
注意,我假设您可以访问
\u physicsNode
在计算a物理步长时,
ccphysisnode
的花栗鼠空间被锁定。在台阶计算过程中,会解决碰撞问题并移动对象-在计算过程中更改主体类型可能会导致意外行为

因此,添加
postStepBlock
回调。这是一个可以安全更改车身类型的地方

传递到回调中的
值用于确保只调用一次代码(在删除对象时特别有用,但在这种情况下也有意义)


如果还添加了一个示例实现:

,如错误消息所述,您需要实现一个步骤后回调。 要在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];
}
注意,我假设您可以访问
\u physicsNode
在计算a物理步长时,
ccphysisnode
的花栗鼠空间被锁定。在台阶计算过程中,会解决碰撞问题并移动对象-在计算过程中更改主体类型可能会导致意外行为

因此,添加
postStepBlock
回调。这是一个可以安全更改车身类型的地方

传递到回调中的
值用于确保只调用一次代码(在删除对象时特别有用,但在这种情况下也有意义)


如果还添加了一个示例实现:

,如错误消息所述,您需要实现一个步骤后回调。 要在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];
}
注意,我假设您可以访问
\u physicsNode
在计算a物理步长时,
ccphysisnode
的花栗鼠空间被锁定。在台阶计算过程中,会解决碰撞问题并移动对象-在计算过程中更改主体类型可能会导致意外行为

因此,添加
postStepBlock
回调。这是一个可以安全更改车身类型的地方

传递到回调中的
值用于确保只调用一次代码(在删除对象时特别有用,但在这种情况下也有意义)


如果还添加了一个示例实现:

,如错误消息所述,您需要实现一个步骤后回调。 要在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];
}
注意,我假设您可以访问
\u physicsNode
在计算a物理步长时,
ccphysisnode
的花栗鼠空间被锁定。在台阶计算过程中,会解决碰撞问题并移动对象-在计算过程中更改主体类型可能会导致意外行为

因此,添加
postStepBlock
回调。这是一个可以安全更改车身类型的地方

传递到回调中的
值用于确保只调用一次代码(在删除对象时特别有用,但在这种情况下也有意义)



If还添加了一个示例实现:

非常感谢。我试过这个代码,它很有效。虽然由于通配符,我需要一个if语句。如果我将If语句放在步骤后回调中,那么输出到控制台并计算其中的内容需要很长时间,但如果回调在If语句中,则一切正常。也谢谢你的解释。搜索时,我只能找到一些信息。不客气!您还可以为第二个碰撞对象定义
碰撞类型
,而不是使用通配符。如果你满意的话,你也可以接受我的回答。哈哈,我没想到。无论如何,回答被接受,再次感谢。@Ben-G cocos2d-xv3.x怎么样。当
contact.getShapeA()->getBody()->setDynamic(false)时,我会遇到同样的错误
onContactPostSolve
事件中。我现在该怎么办?@Ben-G你能帮我解决同样的问题吗。非常感谢你。我试过这个代码,它很有效。虽然由于通配符,我需要一个if语句。如果我把If语句放在post-s中