cocos2dx : schedule 计时,调用崩溃

来源:互联网 发布:php项目部署到apache 编辑:程序博客网 时间:2024/04/28 03:26

这个问题还不知道怎么用标题来说明


问题如下:

有一个Scene如下:

class FirstScene : public cocos2d::CCLayer{public:    virtual bool init();      static cocos2d::CCScene* scene();    CREATE_FUNC(FirstScene);    void start(float f);    CCNode *anim;};
里面有一个start函数,是一个定时器回调。有一个节点,比如是一个动画什么的。start函数如下:

void start(float f){    anim->doSomething();}

现在我要做的事情,是要让这个节点anim过段时间之后,执行start函数。有时候惯性思维(以前用wiengine),就直接这么写了

anim->schedule(SEL_SCHEDULE(start));
然后一运行,就崩了,崩的还很诡异,说anim是空指针


原因如下:

schedule函数,在ccnode里面的定义

void CCNode::schedule(SEL_SCHEDULE selector){    this->schedule(selector, 0.0f, kCCRepeatForever, 0.0f);}
然后会调用到

void CCNode::schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay){    CCAssert( selector, "Argument must be non-nil");    CCAssert( interval >=0, "Argument must be positive");    m_pScheduler->scheduleSelector(selector, this, interval , repeat, delay, !m_bRunning);}
发现问题没有,请注意第一个参数和第二个参数。第一个参数就是执行的函数指针。第二个参数,他直接把自己(this)作为m_pScheduler的参数丢进去了。最后在触发回调之后,他的调用就会成为

(m_pTarget->*m_pfnSelector)(m_fElapsed);
这里的m_pTarget就成了this,由于我们之前是用anim启动schedule,所以这个this就成了anim。那么在anim对象里面去找一个叫anim的变量,就找不到了。

解决办法:
1、从包含你要操作的成员的类启动schedule。

  2、如果这个类没有schedule函数,或者说她不是node的子类,用scheduler的scheduleSelector启动,因为这个可以手动设置this指针,把this设置成第一点说的。

原创粉丝点击