// 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中动作没有停止? 谢谢你。
答案 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类。也许,如果序列被删除,它不会删除序列本身的动作吗?
所有操作都被视为相同,但也许这个序列操作应该是例外。