在网上搜索了一些全局定时器的源代码,都是用一个单例对像,个人觉得不好用,一般一个工程中可能用到多个定时器,为什么用单例对像呢?那不是【为了使用怪异技术】而【使用怪异技术】吗?连C++最基本的多实例化不用,不是【脱裤放屁】吗?(我是这样想的,请用砖指正)
自己实现了一个,上代码:
GlobalTimer.h
#ifndef H_GLOBAL_TIMER_H
#define H_GLOBAL_TIMER_H
#include "cocos2d.h"
typedef void (*GlobalTimerUserCallback)(void*, void*, float);
//Example: void callback(void* timer, void * param, float delta);
#define REPEAT_FOREVER 0xFFFFFFFE
class CGlobalTimer: public cocos2d::Ref
{
public:
CGlobalTimer();
~CGlobalTimer();
virtual bool init();
void Open(GlobalTimerUserCallback fun, void* param, float interval=1.0f, float delay=0.0f, unsigned int repeat=REPEAT_FOREVER, bool paused=false);
void Close();
void Pause();
void Resume();
private:
void CallbackFun(float delta);
GlobalTimerUserCallback UserCallbackFun;
void * UserParam;
CREATE_FUNC(CGlobalTimer);
};
#endif
```
GlobalTimer.cpp
#include "GlobalTimer.h"
USING_NS_CC;
CGlobalTimer::CGlobalTimer()
{
UserCallbackFun=NULL;
UserParam=NULL;
}
CGlobalTimer::~CGlobalTimer()
{
Close();
}
bool CGlobalTimer::init()
{
return true;
}
void CGlobalTimer::Open(GlobalTimerUserCallback fun, void* param, float interval, float delay, unsigned int repeat, bool paused)
{
if(fun==NULL){
return;
}
UserCallbackFun=fun;
UserParam=param;
CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(CGlobalTimer::CallbackFun), this, interval, repeat, delay, paused);
}
void CGlobalTimer::Close()
{
CCDirector::sharedDirector()->getScheduler()->unscheduleSelector(schedule_selector(CGlobalTimer::CallbackFun), this);
}
void CGlobalTimer::Pause()
{
CCDirector::sharedDirector()->getScheduler()->pauseTarget(this);
}
void CGlobalTimer::Resume()
{
CCDirector::sharedDirector()->getScheduler()->resumeTarget(this);
}
void CGlobalTimer::CallbackFun(float delta)
{
if(UserCallbackFun){
UserCallbackFun(this, UserParam, delta);
}
}
```
Usage:
#include "GlobalTimer.h"
USING_NS_CC;
CGlobalTimer GTimer1;
CGlobalTimer GTimer2;
void OnTimer1(void* timer, void* param, float delta)
{
CCLog("Timer1");
}
void OnTimer2(void* timer, void* param, float delta)
{
CCLog("Timer2");
}
bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLView::create("My Game");
director->setOpenGLView(glview);
}
// turn on display FPS
director->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
director->setAnimationInterval(1.0 / 60);
// create a scene. it's an autorelease object
auto scene = HelloWorld::createScene();
GTimer1.Open(OnTimer1, NULL, 2.0f);
GTimer2.Open(OnTimer2, NULL, 3.0f);
// run
director->runWithScene(scene);
return true;
}
```
看完拍砖是一种美德
看完拍砖是一种美德
看完拍砖是一种美德
