这个问题还不知道怎么用标题来说明
问题如下:
有一个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设置成第一点说的。