游戏中离不开计时器,多多少少需要定时处理某些事情,例如:倒计时,进度条,AI控制等.OGF框架内置了一个计时器系统,提供了一个独立线程去处理这些任务,间隔最少可达到5毫秒.
Sample05
简介:计时器.
该范例运行后会先显示"Start"按钮,点击后会在屏幕中心显示一个秒数计数器,每秒递增1,一直至程序结束为至.
1.删除CMainSection类中所有的鼠标,键盘回调处理事件(因为本例中不再用到)
2.创建计时器,该计时器应该在"Start"按钮点击后激活,我们可以放在CMenuSection类的点击事件处理,点击后就切换至游戏环节.
//鼠标点击
bool CMenuSection::OnMouseClick(IGameObject* pGameObject, float x, float y, int nType, int nKey){
CString szName = pGameObject->GetObjectName();
if(szName=="Start" && nType == INPUT_MBUTTONDOWN){
m_lpFMHandles->pGameBody->SwitchSection(GAME_PLAYING_SECTION);
}
return true;
}
3.为了体现CGameSection的环节管理,我们会将这个激活动作,放在CGameSection的OnSectionIn()事件中执行,该事件是在环节之间的切换被调用的,即意味着由CMenuSection切换至CMainSection时被回调.(记得了,要在CMainSection类中重载OnSectionIn方法)
//进入环节事件
bool CMainSection::OnSectionIn(WORD wBeforeSection){
//返回OnInitialize事件创建的文件对象
IGameObject* pGameObject = m_pGameView->GetObject("default\\default\\Text");
//设置一个定时器,事件ID为1,每1秒通知1次,无限次循环
theGame->GetTimerEngine()->SetTimer(1, 1000, TIMER_REPEAT_TIMER, (WPARAM)(pGameObject));
return true;
}
4.重载计时器事件回调OnEventTimer()方法.该方法有两个参数:wTimerID(指明回调的计时器ID,若系统有多个计时器则由该ID区分)和wBindParam(由计时器创建时设计好的回调参数,通常是待处理的对象).为方便起见,在该方法中,我们定义了一个static的变量:nTimer,每次该方法被调用,则该变量自加1,由Text对象输出至屏幕.
//定时器事件
bool CMainSection::OnEventTimer(WORD wTimerID, WPARAM wBindParam){
static INT_PTR nTimer = 0;
if(wTimerID==1){
//返回绑定的参数
IGameObject* pGameObject = (IGameObject*)wBindParam;
IGameObjectText* pGOText = GET_OBJECTPTR_INTERFACE(pGameObject, IGameObjectText);
//生成时间字串
char szText[128];
sprintf(szText, "Timer:%d", nTimer++);
//设置为Text对像的输出内容
pGOText->SetText(szText);
}
return true;
}
4.编译并运行项目
运行结果: