cocos2d автоудаление спрайта после анимации - PullRequest
3 голосов
/ 13 ноября 2010

Я новичок в cocos2d и разработке для iphone вообще. Я хочу создать анимацию, когда какой-то физический объект с его спрайтом будет уничтожен (например, чтобы показать всплеск) И я хочу сделать какой-то объект, о котором я скажу: запустить анимацию и уничтожить себя, когда закончите. Тогда я хочу забыть об этом объекте - он должен быть уничтожен автоматически после завершения анимации. Каков наилучший способ сделать это?

Ответы [ 2 ]

8 голосов
/ 14 ноября 2010

Вы можете использовать CCSequence для создания списка действий. Первое действие, которое вы делаете, должно быть вашим обычным действием (или последовательностью). Второе действие должно быть действием CCCallFuncND, где вы можете вызвать функцию очистки и передать заданный спрайт.

С макушки головы я бы сделал что-то вроде этого:

CCSprite* mySpriteToCleanup = [CCSprite spriteWithFile:@"mySprite.png"];
[self addChild:mySpriteToCleanup];

// ... do stuff

// start the destroy process
id action1 = [CCIntervalAction actionWithDuration:0];  // the action it sounds like you have written above.
id cleanupAction = [CCCallFuncND actionWithTarget:self selector:@selector(cleanupSprite:) data:mySpriteToCleanup];
id seq = [CCSequence actions:action1, cleanupAction, nil];
[mySpriteToCleanup runAction:seq];

и в функции очистки:

- (void) cleanupSprite:(CCSprite*)inSprite
{
    // call your destroy particles here
    // remove the sprite
    [self removeChild:inSprite cleanup:YES];
}

Вы можете добавить другое действие между этими двумя действиями, а также действиями по уничтожению частиц, вместо вызова этого в функции завершения.

3 голосов
/ 21 декабря 2012

Удобным способом является использование пользовательского действия RemoveNode, которое удаляет работающий объект CCNode (CCSprite также CCNode).

//Remove the node from parent and cleanup
@interface RemoveNode : CCActionInstant
{}
@end

@implementation RemoveNode
-(void) startWithTarget:(id)aTarget
{
    [super startWithTarget:aTarget];
    [((CCNode *)target_) removeFromParentAndCleanup:YES];
}

@end

Поместите его в последний параметр CCSequence. Например, спрайт будет удален после исчезновения:

[mySprite runAction:[CCSequence actions:
[CCFadeOut actionWithDuration:0.5], [RemoveNode action], nil]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...