为什么我能够重用CCActionInterval?

时间:2012-09-15 18:03:51

标签: ios cocos2d-iphone ccaction

我正在Cocos2d中构建一个简单的2D游戏,其中涉及让敌人跨越不同的预定义路径穿过屏幕。 nextFrame方法具有以下代码:

    int indexCount = 0;
for (Enemy *e in enemies) {

    if ([cocosGuy doesCollideWithRect: [e boundingBox]])
    {
        for (Enemy *e in enemies)
        {
            [self removeChild: e cleanup: YES];
        }
        [self startGame];
    }
    // ^ This code not relevant to the question
    if ([e numberOfRunningActions] == 0)
    {
        [e setPosition: [[enemy_positions objectAtIndex:indexCount] CGPointValue]];
        [e runAction: [beziers objectAtIndex: indexCount]];
    }
    ++indexCount;
}

上面第二个if语句中的代码用于从'enemy_positions'数组获取CGPoint,从'beziers'数组获取CCActionInterval。它可以工作 - 当一个敌人完成它的路径时,它会被重新定位并且动作重新运行。但是为什么这个动作第一次运行后不会中断? CCActions不应该只是一次吗?

我问,因为我想将位置和动作重构为单个结构,我想确保我知道首先发生了什么。我是否误解了CCAction课程?

此外,这是生成'beziers'数组的当前工厂方法:

-(NSArray*) makeBeziers {

ccBezierConfig bezierconf1;
bezierconf1.controlPoint_1 = ccp(-200, 5);
bezierconf1.controlPoint_2 = ccp(300, 100);
bezierconf1.endPosition = ccp(1000,5);

ccBezierConfig bezierconf2;
bezierconf2.controlPoint_1 = ccp(-200, 5);
bezierconf2.controlPoint_2 = ccp(300, 100);
bezierconf2.endPosition = ccp(1000,5);

ccBezierConfig bezierconf3;
bezierconf3.controlPoint_1 = ccp(-200, 5);
bezierconf3.controlPoint_2 = ccp(300, 100);
bezierconf3.endPosition = ccp(1000,5);

NSArray *myarray;

myarray = [[NSArray arrayWithObjects: [CCBezierBy actionWithDuration:3 bezier: bezierconf1],
                [CCBezierBy actionWithDuration:3 bezier: bezierconf2],
                [CCBezierBy actionWithDuration:3 bezier: bezierconf3],
                nil] retain];
return myarray;
}

1 个答案:

答案 0 :(得分:0)

这“偶然”起作用。行动应该只是一次。他们跑完后会被释放。

但是,由于您将操作存储在单独的数组中,因此会保留这些操作。因此,您可以重新运行它们。这可能适用于某些操作,其他操作可能会显示微妙的问题,某些操作可能无法执行任何操作,泄漏内存或立即崩溃。

重复使用操作通常被认为是不好的做法,除非您知道每个操作的代码,并且您已经确认重复使用它并没有做任何“坏事”。