Cocos2d-x Schedule不调用函数

时间:2012-09-12 08:54:11

标签: call cocos2d-x schedule

这是非常简单的日程安排代码。 AMS_Moving继承CCNode。

我按计划拨打action()中的runAction()。但是不要拨打action()

当我直接调用action()时,这是正常的。

我想知道原因。请帮帮我。

void AMS_Moving::runAction()
{
..
..
    this->schedule(schedule_selector(AMS_Moving::action));
}

void AMS_Moving::action(ccTime dt)
{
..
}

6 个答案:

答案 0 :(得分:3)

试试这段代码:

CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(AMS_Moving::action),this,1.0f,false);

答案 1 :(得分:3)

我在Cocos2dx-3.8中遇到了一个类似的问题,试图在我正在开发的Scene中安排一个选择器。

我的错误代码是:

void GameScene::onEnter() {
    this->scheduleOnce(CC_SCHEDULE_SELECTOR(GameScene::scheduledSelector), 3.0);
    this->scheduleUpdate();
}

void GameScene::scheduledSelector(float dt) {
    log("Scheduled selector called...");
}

void GameScene::update(float delta) {
    log("update called...");
}

在这种情况下,scheduledSelectorupdate都没有被调用。

我在Cocos2dx Node文档中找到了我的问题的解决方案:Node的调度程序在Node调用其resume之前不会开始安排更新方法:

/**
 * Resumes all scheduled selectors, actions and event listeners.
 * This method is called internally by onEnter.
 */
virtual void resume(void);

我的不好意思是我在没有调用超类实现的情况下重写了Node的onEnter方法,因此调度程序从未得到启动更新的信号。用以下方法修复我的onEnter方法:

void GameScene::onEnter() {
    Node::onEnter();
    this->scheduleOnce(CC_SCHEDULE_SELECTOR(GameScene::scheduledSelector), 3.0);
    this->scheduleUpdate();
}

完成了这项工作,两个选择人员都在合适的时间开始接听。

答案 2 :(得分:1)

你确定调用了AMS_Moving :: runAction()或调用了CCNode :: runAction()吗?尽量避免在cocos2d-x中使用相同的函数名,看看会发生什么。

答案 3 :(得分:1)

解决方案1:

CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(Foo::Updater),this,2.0f,false);

此解决方案的一个有趣优势是,您的调度程序将在游戏期间独立于场景替换而工作。您只需要retain Foo个对象,而不是将其添加到稍后可能删除的某些CCLayerCCScene

解决方案2:

  • 将此签名用于您的会员功能:void Foo::Updater(float dt)
  • Foo个函数中的某处调用此方法以启动调度程序this->schedule(schedule_selector(Foo::Updater),2.0f);
  • 在这种情况下您必须addChild() Foo类的对象CCLayer才能使调度程序真正调用您的Updater函数。

-

推定:

  1. Cocos2dx v2.2.3
  2. Foo是您尝试在其中运行某个调度程序的类。

答案 4 :(得分:0)

尝试在'AMS_Moving :: action()'函数中设置断点。此代码显然会称为“操作”。

答案 5 :(得分:0)

只需从此函数AMS_Moving :: action中删除ccTime dt即可。它会起作用