2012-07-19 77 views
0

我运行了下面的代码,期望在不同的时间间隔(例如,在1秒之后,在2.6秒之后等)调度三次后续调用。“displayWarningMessage“但没有工作(它只在第一次显示按摩)。Cocos2d:麻烦调度在特定时间间隔多次调用一个方法

我没有在调度程序中找到一个方法签名,它可以执行多次显示并具有特定延迟的工作。任何人都有一些建议?

[self scheduleOnce:@selector(displayWarningMessage) delay:0.7f]; 
[self scheduleOnce:@selector(displayWarningMessage) delay:1.7f]; 
[self scheduleOnce:@selector(displayWarningMessage) delay:3.7f]; 

回答

1

问题在于,当您调用第一个计划时,它会被成功调度。但接下来的立即通话是抛出警告的东西

CCScheduler#scheduleSelector. Selector already scheduled. Updating interval from: X.2 to X.2 

你可以在日志中看到这个。

你可以做的是当选择器被调用时,在方法结束时你可以再次安排下一次,直到你完成。您可以通过一个计数器来跟踪它被调用的次数,将所有间隔放在一个数组中,然后安排下一个选择器在由计数器识别的特定索引处的间隔。像这样:

NSArray *intervals = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.7],[NSNumber numberWithFloat:1.7],[NSNumber numberWithFloat:3.7], nil]; 

int counter = 0; 

//schedule it for the first time with object at index counter/index 0 
[self scheduleOnce:@selector(displayWarningMessage) delay:[(NSNumber *)[intervals objectAtIndex:counter]] floatValue]; 

现在在你的选择,做这样的事情:

-(void)displayWarningMessage 
{ 
    //do all your stuff here 

    //increment counter 
    counter ++; 

    if(counter < [intervals count]) 
    { 
     //schedule it for the next time with object at index counter/index 
     [self scheduleOnce:@selector(displayWarningMessage) delay:[(NSNumber *)[intervals objectAtIndex:counter]] floatValue]; 
    } 
} 

intervalscounter应该是道高德班。

+0

非常感谢你,是一个不错的主意,但我尝试过,并没有工作。作为一个证明,在代码中,你建议我将调用替换为scheduleOnce的调用,而不是所有控件下面的注释“在这里做所有的事情”,它仍然不会调用它。我不确定是否我做错了什么或者什么。我正在使用Cocos2d v2.0和ARC启用。现在对于你的想法+1投票,但我保持答案不被接受,因为没有完全解决问题(但会接受,如果没有别的出现)。 – mm24 2012-07-19 13:26:37

0

试试这个:

- (void)displayWarningMessage { 
    //Stuff 
} 

- (void)callStuff { 
    CCCallFunc *call = [CCCallFunc actionWithTarget:self selector:@selector(displayWarningMessage)]; 
    CCDelayTime *delay1 = [CCDelayTime actionWithDuration:0.7f]; 
    CCDelayTime *delay2 = [CCDelayTime actionWithDuration:1.7f]; 
    CCDelayTime *delay3 = [CCDelayTime actionWithDuration:3.7f]; 
    CCSequence *actionToRun = [CCSequence actions:delay1, call, delay2, call, delay3, call, nil]; 
    [self runAction:actionToRun]; 
} 

这应该为你想要做什么工作,至少这就是我想像这样做。我相当肯定你可以在一个CCSequence中多次调用这个CCCallFunc,而不必一次创建它三次。当然,如果需要的话,你也可以使这些延迟变化。让我知道事情的后续。

-1

方法已创建。

[self schedule: @selector(displayWarningMessage:) interval:3.2f]; 

-(void) displayWarningMessage:(ccTime) delta 
{ 

    CCLOG(@"alert........!!!!!!"); 

} 

在未检测到警告消息时使用调用方法。

+1

请在代码前使用4个空格将其格式化为代码。 – 2016-01-08 13:16:37