Do [sprite stopActionByTag: kTag]; работать по-разному для CCAction и CCSequence? - PullRequest
0 голосов
/ 13 апреля 2010

// прога 1

-(void)gameLogic:(ccTime)dt  
{    
id actionMove = [CCMoveTo actionWithDuration:1.0 position:ccp(windowSize.width/2-400, actualY)];
[actionMove setTag:6];
[self schedule:@selector(update:)];
[hitBullet runAction:actionMove];
}

-(void)update:(ccTime)dt
{
if ( (CGRectIntersectsRect(hitRect, playerRect)) )
  {
   [[[self getActionByTag:6] retain] autorelease];
   [hitBullet stopActionByTag: 6]; 
  }      
}

// прога 2

-(void)gameLogic:(ccTime)dt
{
  id actionMove = [CCMoveTo actionWithDuration:1.0 position:ccp(windowSize.width/2-400, actualY)];
  id hitBulletAction = [CCSequence actionWithDuration:(intervalforEnemyshoot)];
  id hitBulletSeq = [CCSequence actions: hitBulletAction, actionMove, nil];
  [hitBulletSeq setTag:5];
[self schedule:@selector(update:)]; 
  [hitBullet runAction:hitBulletSeq];
}  

-(void)update:(ccTime)dt
{
if ( (CGRectIntersectsRect(hitRect, playerRect)) )
  {
   [[[self getActionByTag:5] retain] autorelease];
   [hitBullet stopActionByTag: 5]; 
  }      
}

Пока работает prog1 prog2 не работает? Я думаю, что оба одинаковы. Но почему два stopActions работают по-разному в двух prog1 и prog2? Я имею в виду действия остановлены в prog1, но действия не останавливаются в prog2? спасибо.

1 Ответ

0 голосов
/ 13 апреля 2010

Srikanth, какую версию cocos2d вы используете?

Ответ на ваш вопрос - нет. Все действия рассматриваются одинаково.

Код, ответственный за удаление действия, следующий:

// -[CCActionManager removeActionByTag:target:]
-(void) removeActionByTag:(int) aTag target:(id)target
{
    NSAssert( aTag != kActionTagInvalid, @"Invalid tag");
    NSAssert( target != nil, @"Target should be ! nil");

    tHashElement elementTmp;
    elementTmp.target = target;
    tHashElement *element = ccHashSetFind(targets, CC_HASH_INT(target), &elementTmp);

    if( element ) {
        NSUInteger limit = element->actions->num;
        for( NSUInteger i = 0; i < limit; i++) {
            CCAction *a = element->actions->arr[i];

            if( a.tag == aTag && [a originalTarget]==target)
                return [self removeActionAtIndex:i hashElement:element];
        }
//      CCLOG(@"cocos2d: removeActionByTag: Action not found!");
    } else {
//      CCLOG(@"cocos2d: removeActionByTag: Target not found!");
    }
}

Я бы порекомендовал вам включить отладку Cocos2d и снять комментарий с этих двух строк CCLog Это должно сказать вам, если там есть проблема.

Если это ничего вам не говорит, может быть интересно взглянуть на класс CCSequence. Возможно, если последовательность удаляется, она не удаляет действия В самой последовательности?

Все действия рассматриваются как равные, но, возможно, это действие Sequence должно быть исключением из этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...