【问题标题】:Cocos2d: troubles scheduling call a method multiple times at specific time intervalsCocos2d:麻烦调度在特定时间间隔多次调用方法
【发布时间】:2012-07-19 10:41:34
【问题描述】:

我运行以下代码,希望在方法“displayWarningMessage”上以不同的时间间隔(例如,1 秒后、2.6 秒后等)安排三个后续调用,但没有工作(它只第一次显示按摩)。

我没有在调度程序中找到可以多次显示并具有特定延迟的方法签名。有人有什么建议吗?

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

【问题讨论】:

    标签: methods time cocos2d-iphone scheduled-tasks call


    【解决方案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 当然应该是类 ivars。

    【讨论】:

    • 非常感谢,这是个好主意,但我试过了,但没有成功。作为证明,在您建议的代码中,我将调用替换为 scheduleOnce,而不是注释“在此处执行所有操作”下方的所有控件,但它仍然不会调用它。我不确定是我做错了什么还是什么。我正在使用 Cocos2d v2.0 并启用了 ARC。现在 +1 投票支持你的绝妙想法,但我认为答案不被接受,因为没有完全解决问题(但如果没有其他问题,我会接受)。
    【解决方案2】:

    试试这个:

    - (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,而无需单独创建三次。当然,如果需要,您也可以根据需要使这些延迟可变。告诉我进展如何。

    【讨论】:

      【解决方案3】:

      方法已创建。

      [self schedule: @selector(displayWarningMessage:) interval:3.2f];
      
      -(void) displayWarningMessage:(ccTime) delta
      {
      
          CCLOG(@"alert........!!!!!!");
      
      }
      

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

      【讨论】:

      • 请在代码前使用4个空格将其格式化为代码。
      猜你喜欢
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多