Как убрать форму и тело после задержки обратного вызова коллизии (cocos2d-chipmunk)
Может ли кто-нибудь помочь мне удалить форму и тело после задержки обратного вызова столкновения.
Используя 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), поэтому вам не нужно передавать их.