我正在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;
}
答案 0 :(得分:0)
这“偶然”起作用。行动应该只是一次。他们跑完后会被释放。
但是,由于您将操作存储在单独的数组中,因此会保留这些操作。因此,您可以重新运行它们。这可能适用于某些操作,其他操作可能会显示微妙的问题,某些操作可能无法执行任何操作,泄漏内存或立即崩溃。
重复使用操作通常被认为是不好的做法,除非您知道每个操作的代码,并且您已经确认重复使用它并没有做任何“坏事”。