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