我正在使用cocos2d并拥有2个AI精灵,名为TheEvilOne和TheEvilTwo。这两个sprite从同一个类中调用相同的代码块,将sprite作为参数发送。然而,当我运行此代码时,游戏会出错,因为只有一个精灵会执行操作并且我的代码停止工作。我的问题是可以同时为多个精灵调用相同的代码块,或者我的代码是否有问题。以下是我在程序中运行的示例。
-(void)LoadingEvilActions:(id)sender { //This is Getting Constantly Called
if(loaded == NO) {
theEvilOne = [CCSprite spriteWithFile:@"Evil_Alt_Idle_00.png"]; //These sprites have been declared in my .h file
[self addChild:theEvilOne z:200];
theEvilTwo = [CCSprite spriteWithFile:@"Evil_Alt_Idle_00.png"];
[self addChild:theEvilTwo z:200];
loaded = YES;
}
[self CheckCollision:theEvilOne];
[self setCenterofScreen:theEvilOne];
[self StayonScreen:theEvilOne];
[self AiCharacter:theEvilOne];
[self CheckCollision:theEvilTwo];
[self setCenterofScreen:theEvilTwo];
[self StayonScreen:theEvilTwo];
[self AiCharacter:theEvilTwo];
}
-(void)AiCharacter:(id)sender {
CCSprite *EvilCharacter = (CCSprite *)sender;
if (aiactionrunning == NO){
.... Do More Stuff // For E.G.
id jump_Up = [CCJumpBy actionWithDuration:0.6f position:ccp(randomjump, EvilCharacter.contentSize.height)
height:25 jumps:1];
id jump_Down = [CCJumpBy actionWithDuration:0.42f position:ccp(randomjump,-EvilCharacter.contentSize.height)
height:25 jumps:1];
id seq = [CCSequence actions:jump_Up,jump_Down, [CCCallFuncN actionWithTarget:self selector:@selector(stopAiAction:)], nil];
[EvilCharacter stopAllActions];
[EvilCharacter runAction:seq];
aiactionrunning = YES;
}
}
-(void)stopAiAction:(id)sender {
aiactionrunning = NO;
}
修改
我在AI Character方法中运行随机数生成器和许多操作。 游戏已经只使用了1个敌人精灵,我决定尝试创建一种方法来创建许多。
编辑2
我刚刚添加了停止sprite持续的方法部分,我试图简化所有与我的问题无关的代码并忘记添加该部分。 我改变了我调用LearnCocos2d建议的方法的方式,但没有解决我的问题,而是让它变得更简单。我也没有使用ARC
我的一个精灵是唯一一个执行大多数动作的精灵,但在某些情况下,另一个精灵可能会执行一个动作,但主要是执行一个精灵。我认为我的主要问题是我可以使用不同的精灵调用相同的方法将sprite作为参数传递。
编辑3
我已经发现我的问题是有一个布尔值标志包含我的AiCharacter方法,当一个sprite运行该方法时,它会停止运行该方法的另一个sprite。有没有办法我可以实现一个记录数组等,所以每个精灵都有自己的布尔标志。
使用这个“数组”可以使用临时精灵EvilCharacter更改TheEvilOne和TheEvilTwo的布尔值,而无需单独执行。
答案 0 :(得分:0)
如果我理解你的问题是正确的,你会尝试采取一个动作并一次在多个角色上运行,例如:
id move = [CCMoveTo actionWithDuration:0.5f position:ccp(0,0)];
[theEvilOne runAction:move];
[theEvilTwo runAction:move];
这样做是行不通的,因为Evil 1不会对它执行任何操作,因为它被移动到在Evil 2上运行。当一个动作正在运行时,它正在一个目标上运行。相反,你会:
id move = [CCMoveTo actionWithDuration:0.5f position:ccp(0,0)];
[theEvilOne runAction:move];
[theEvilTwo runAction:[move copy]];
假设你正在使用弧线。如果没有,那么你想要发布当然的副本。当谈到您的特定示例时,为什么要尝试调用方法的操作。为什么不直接调用方法?正如LearnCocos2D指出的那样,这似乎毫无意义。
另一个潜在的问题是,每次调用该方法时,您都会不断创建越来越多的精灵。这是故意还是只有一个邪恶1和一个邪恶2?如果是这样,那么你就不应该不断创造更多的精灵。
修改强>
删除你的布尔。做这样的事情:
CCSprite *EvilCharacter = (CCSprite *)sender;
if ([EvilCharacter numberOfRunningActions] == 0){
...
}