2010-11-10 60 views
1

谁能帮助我在碰撞回调的延迟后删除形状和身体延迟一段时间后取出的形状和身体。如何在碰撞回调(的cocos2d-花栗鼠)

通过使用cpSpaceAddPostStepCallback(sapce,(cpPostStepFunc)postStepRemove,blockShape,NULL); 我可以安全地删除形状。 但我在调用函数之前需要一些延迟。 一旦检测到碰撞,我就会播放动画。 在代码的末尾我需要除去的形状。 任何人都可以请帮我一些示例代码。 我写的代码如下。

int collisionSapusBlock(cpArbiter *arb, struct cpSpace *sapce, void *data) 
{ 

cpShape *sapusShape, *blockShape; 
cpArbiterGetShapes(arb, &sapusShape, &blockShape); 

cpBody *BlockBody = blockShape->body; 
cpBody *sapusBody = sapusShape->body; 

CCNode *parent = (CCNode*)data; 

if (cpvlength(sapusBody->v) > 45) 
{ 
NSLog(@"Collision2 called %f",cpvlength(sapusBody->v)); 
CCSprite *sprite = blockShape->data; 
[parent removeChild:sprite cleanup:YES]; 

/////// 
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Block2.plist"]; 
CCSpriteBatchNode *sheet1 = [CCSpriteBatchNode batchNodeWithFile:@"Block2.png" capacity:2]; 
[parent addChild:sheet1]; 

CCSpriteFrameCache *cache = [CCSpriteFrameCache sharedSpriteFrameCache]; 
CCSprite *sapusSprite1 = [[CCSprite alloc] initWithSpriteFrameName:@"Block2001.png"]; 
CCAnimation *sapusAnim = [[CCAnimation alloc] initWithName:@"select" delay:0.15f]; 
[sapusAnim addFrame:[cache spriteFrameByName:@"Block2001.png"]]; 
[sapusAnim addFrame:[cache spriteFrameByName:@"Block2002.png"]]; 
[sapusAnim addFrame:[cache spriteFrameByName:@"Block2003.png"]]; 
[sapusAnim addFrame:[cache spriteFrameByName:@"Block2004.png"]]; 
[sapusAnim addFrame:[cache spriteFrameByName:@"Block2005.png"]]; 
[sapusAnim addFrame:[cache spriteFrameByName:@"Block2006.png"]]; 
[sapusSprite1 addAnimation: sapusAnim]; 
[sheet1 addChild:sapusSprite1]; 

CCAnimate *animate = [CCAnimate actionWithAnimation: sapusAnim restoreOriginalFrame:NO]; 
[sapusSprite1 runAction:animate]; 

blockShape->data = sapusSprite1; 

/////here after playing the animation i need to delete the blockShape. Help plzzz 
} 

return 1; 
} 

任何人都可以请帮我一些示例代码。 感谢

回答

1

我没有试过,但它应该工作。在冲突处理,打完折的动画作为一个序列的一部分,然后执行postStepCallback作为序列中的最后一个项目:

CCSequence *finalSeq = [CCSequence actions:[CCAnimate actionWithAnimation:sapusAnim restoreOriginalFrame:NO], 
    [CCCallFunc actionWithTarget:self selector:@selector(removeCpShapeAndBody)], nil]; 
[sapusSprite1 runAction:finalSeq]; 

然后你会创建一个名为removeCPShapeAndBody方法,它会调用cpSpaceAddPostStepCallback。理想情况下,你不得不所有这一切都在一个对象,将持有参照形状和体(例如CCSprite的一个子类),所以你不必来回传递的。