首先在添加相应的方法声明和成员变量声明:
class HelloWorld : public cocos2d::Layer { public: // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::Scene* createScene(); // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // a selector callback void menuCloseCallback(cocos2d::Ref* pSender); // implement the "static create()" method manually CREATE_FUNC(HelloWorld); /// 下面是需要我们添加的内容 // 每一帧会调用一次这个update方法,这个方法是继承于父类的 virtual void update(float dt); private: //! 这个方法是私有方法,是我们自己添加的方法,不是继承于父类的 void updateTimer(float dt); private: //! 在3.0后编码风格不再采用m_加前缀的风格,而改为cocos2d的风格了,以下划线开头,不再添加前缀 cocos2d::Label *_label; };
然后删除实现文件中的init方法,我们自己写一个:
// on "init" you need to initialize your instance bool HelloWorld::init() { if ( !Layer::init() ) { return false; } // 创建一个标签 // CCLabelTTF/LabelTTF已经在3.0rc1版本中丢弃了,现在找到了这个Label类来替换 _label = Label::create("BiaoGe", "Arial", 30); _label->retain(); // 添加到层 addChild(_label); // 启动定时器,如果不打开,是不会调用update方法的,不过通常不会直接用这个方法 //scheduleUpdate(); // 这个方法需要四个参数 // 参数一:typedef void (Ref::*SEL_SCHEDULE)(float) // 参数二:时间间隔,也就是每隔多少秒回调一次 // 参数三:重复执行的次数,也就是说执行多少次之后就自动关闭定时器,如果值为0,推荐使用scheduleUpdate方法, // 如果要一直执行,使用kRepeatForever宏,重复执行的次数=inteval+1次 // 参数四:第一帧延时时长,也就是这个方法在被调用前延时1.5秒后再调用 schedule(schedule_selector(HelloWorld::updateTimer), 0.1, kRepeatForever, 0.5); // 还有几个重载版本的 // schedule(SEL_SCHEDULE selector, float interval) // schedule(SEL_SCHEDULE selector) return true; }
再实现相应的定时器回调方法:
// 每一帧就会调用一次这个update方法,如果是使用scheduleUpdate打开的定时器,这个一帧的时间就是 // 帧率1/60.0,也就是每六十分之一秒就会调用一次这个方法 void HelloWorld::update(float dt) { _label->setPosition(_label->getPosition() + Point(1, 1)); if (_label->getPositionX() >= 500) { unscheduleUpdate(); // 关闭定时器 } return; } // 使用 schedule(schedule_selector(HelloWorld::updateTimer), 0.1, kRepeatForever, 0.5) // 打开的定时器,才会调用此方法 void HelloWorld::updateTimer(float dt) { // 由于已经丢弃了ccpAdd这个宏,而且已经重载了Point类的+方法,可以直接使用+号,不需要再使用ccpAdd这个宏了 // 是不是更方便了!!! _label->setPosition(_label->getPosition() + Point(4, 4)); if (_label->getPositionX() >= 500) { unscheduleUpdate(); // 关闭定时器 } return; }
这样是不是很简单呢?呵呵,我觉得使用起来简单多了,我也是菜鸟一枚,最近刚刚接触cocos2dx,在学习过程中,喜欢把自己学习到的知识分享出来,
感兴趣的,可以一起交流!!!