0

我正在 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;
}
4

1 回答 1

0

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

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

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

于 2012-09-15T21:53:59.157 回答