做[sprite stopActionByTag:kTag]; CCAction和CCSequence的工作方式不同?

时间:2010-04-13 10:51:51

标签: cocoa-touch cocos2d-iphone

// prog 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]; 
  }      
}

// prog 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 :(得分:0)

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类。也许,如果序列被删除,它不会删除序列本身的动作吗?

所有操作都被视为相同,但也许这个序列操作应该是例外。