这是非常简单的日程安排代码。 AMS_Moving继承CCNode。
我按计划拨打action()
中的runAction()
。但是不要拨打action()
。
当我直接调用action()时,这是正常的。
我想知道原因。请帮帮我。
void AMS_Moving::runAction()
{
..
..
this->schedule(schedule_selector(AMS_Moving::action));
}
void AMS_Moving::action(ccTime dt)
{
..
}
答案 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...");
}
在这种情况下,scheduledSelector
和update
都没有被调用。
我在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
个对象,而不是将其添加到稍后可能删除的某些CCLayer
或CCScene
。
解决方案2:
void Foo::Updater(float dt)
Foo
个函数中的某处调用此方法以启动调度程序this->schedule(schedule_selector(Foo::Updater),2.0f);
addChild()
Foo
类的对象CCLayer
才能使调度程序真正调用您的Updater
函数。 -
推定:
Foo
是您尝试在其中运行某个调度程序的类。答案 4 :(得分:0)
尝试在'AMS_Moving :: action()'函数中设置断点。此代码显然会称为“操作”。
答案 5 :(得分:0)
只需从此函数AMS_Moving :: action中删除ccTime dt即可。它会起作用