【问题标题】:Cocos2d-x Schedule does not call functionCocos2d-x 调度不调用函数
【发布时间】:2012-09-12 08:54:11
【问题描述】:

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

我按计划致电runAction() 中的action()。但不调用action()

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

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

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

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

【问题讨论】:

  • 同样的问题如何解决兄弟?

标签: call cocos2d-x schedule


【解决方案1】:

我在 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】:

试试这个代码:

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

【讨论】:

    【解决方案3】:

    您确定要调用 AMS_Moving::runAction() 还是调用 CCNode::runAction()?尽量避免与 cocos2d-x 使用相同的函数名,看看会发生什么。

    【讨论】:

      【解决方案4】:

      解决方案 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 是您尝试在其中运行一些调度程序的类。

      【讨论】:

        【解决方案5】:

        尝试在函数“AMS_Moving::action()”中设置断点。这段代码显然会调用'action'。

        【讨论】:

          【解决方案6】:

          只需从此函数 AMS_Moving::action 中删除 ccTime dt。它会工作

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-08
            • 1970-01-01
            相关资源
            最近更新 更多