2

It's very simple schedule code. AMS_Moving Inherited CCNode.

I call the action() in runAction() by schedule. But does not call action().

When I call action() directly, It's normal.

I want know the reason. please help me.

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

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

6 回答 6

4

我在 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...");
}

在这种情况下,既没有scheduledSelector也没有被叫到。update

我在 Cocos2dxNode文档中找到了我的问题的解决方案: A的调度程序在调用它的方法Node之前不会开始调度更新:Noderesume

/**
 * 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();
}

完成了这项工作,两个选择器开始在正确的时间被调用。

于 2015-10-13T10:26:26.703 回答
3

试试这个代码:

CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(AMS_Moving::action),this,1.0f,false);
于 2013-12-24T06:27:19.390 回答
1

解决方案1:

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

此解决方案的一个有趣优势是您的调度程序将在游戏期间独立于场景替换工作。您只需要添加到retain' Foos 对象而不是将其添加到某些对象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是您尝试在其中运行一些调度程序的类。
于 2014-05-27T09:22:05.663 回答
1

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

于 2012-09-13T00:22:32.757 回答
0

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

于 2012-09-12T10:16:32.217 回答
0

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

于 2014-04-10T05:59:22.063 回答