2013-04-24 81 views
0

CCsprite scheduleOnce选择器被调用两次会导致崩溃。Cocos2d调用scheduleOnce选择器两次会导致崩溃

Assertion failure in -[CCScheduler scheduleSelector:forTarget:interval:paused:repeat:delay:], /Users/libs/cocos2d/CCScheduler.m:278  

[sprite scheduleOnce:@selector(resumeSchedulerAndActions) delay:time]; 

任何解决方案来解决这个问题?

+0

你有cocos2d框架的代码。为什么你不能在278行的CCScheduler类中看到断言消息? – Morion 2013-04-24 10:19:09

+0

CCScheduler。尝试安排一个选择器的暂停值与目标值不同 - 这是断言说的内容,但不清楚,断言不在我调用的方法中,它实际上是一个子方法。 – 2013-04-24 12:36:21

+0

从这个断言的几行代码中,你可以看到,在前一个日程安排处于活动状态之前,不可能安排方法。如果您需要多次执行此操作,则可以创建并运行CCDelayTime和CCCallFunc操作的CCSequences。 – Morion 2013-04-24 13:00:07

回答

0

感谢您的帮助@ LearnCocos2D和@Morion。 我通过调用解决了它。

[sprite unscheduleAllSelectors];

调用

[sprite scheduleOnce:@selector(resumeSchedulerAndActions:) delay:time];

1

您的计划选择器不使用正确的格式。它需要采用ccTime类型的一个参数。该计划选择需要有在最后一个冒号:

[sprite scheduleOnce:@selector(resumeSchedulerAndActions:) delay:time]; 

而且必须有这样的接口:

-(void) resumeSchedulerAndActions:(ccTime)delta 
{ 
    // here you can "forward" to the actual method you wanted to schedule 
    [self resumeSchedulerAndActions]; 
} 
+0

调用调度程序一次(如果调用多次)没有问题。问题不在于格式,它实际上是一种在CCNode – 2013-04-24 12:42:20

+0

中可用的方法它可能会工作一次,但它是非法呼叫。 Cocos2D * always *将delta时间参数发送到预定的方法。如果计划的方法不采用单个ccTime参数,那么即使这可能不是立即可见的问题,也可能发生不良事情。该调用会在堆栈上发送一个无关的参数,我相信这会至少损坏接收函数的堆栈。 – LearnCocos2D 2013-04-24 15:07:19

+0

将预处理器宏COCOS2D_DEBUG = 1添加到您的构建设置中(或者在构建版本时构建一个调试配置),您将得到一个断言。你将从CCScheduler.m的第193行得到的消息是:“没有找到选择符的签名 - 它是否具有以下形式? - (void)name:(ccTime)dt” – LearnCocos2D 2013-04-24 15:09:49

0

之前的另一个解决方案是使用CCDirector调度。

[[CCDirector sharedDirector].scheduler scheduleSelector:@selector(resumeSchedulerAndActions:) forTarget:self interval:0.1 repeat:0 delay:2 paused:NO];