如何运行相同的代码块 - Cocos2d

时间:2014-03-06 08:10:15

标签: ios cocos2d-iphone

我正在使用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的布尔值,而无需单独执行。

1 个答案:

答案 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){
   ...
}