游戲中離不開計時器,多多少少需要定時處理某些事情,例如:倒計時,進度條,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.編譯并運行項目
運行結果:
