cocos2dx : schedule 计时,调用崩溃

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


问题如下:

有一个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设置成第一点说的。

你可能感兴趣的:(cocos2dx : schedule 计时,调用崩溃)