我對游戲開發的看法是要盡量將游戲細化,最基本的是將游戲劃分為多個環節,每個環節盡可能獨立處理本環節的事情,所以於生出“CGameSection”這個類模板。在OGF中,當處于某一環節內,其它環節是不會收到任何消息的并且其內的物件也不會渲染,這使環節變得相對地獨立。
Sample04
簡介:游戲環節
使用游戲環節對游戲進行分階段管理.使用環節控制可以將整個游戲流程劃分為多個環節,例如:SFLASH窗口環節,菜單環節,游戲環節,結束環節等,具體視游戲大小而定.在此例中,會創建兩個環節:CMenuSection, CMainSection,開始時會停留在MenuSection階段,有一個"Start"文本,當點擊后會轉換至CMainSection環節,并實現Sample03的效果.
1.添加CMenuSection和CMainSection類,這兩類都是基于CGameSection類.
2.修改CMyGameBody類的OnInitialize事件,以在此創建CMenuSection和CMainSection類的實例.
//初始化事件
bool CMyGameBody::OnInitialize(){
//創建自定義的環節
CMenuSection* pMenuSection = new CMenuSection(MAIN_MENU_SECTION);
if(pMenuSection){
Add((IGameSection*)pMenuSection->QueryInterface(IID_IGameSection, VER_IGameSection), pMenuSection->GetSectionID());
}
m_pCurrentSection = (IGameSection*)pMenuSection->QueryInterface(IID_IGameSection, VER_IGameSection);
CMainSection* pMainSection = new CMainSection(GAME_PLAYING_SECTION);
if(pMainSection){
Add((IGameSection*)pMainSection->QueryInterface(IID_IGameSection, VER_IGameSection), pMainSection->GetSectionID());
}
return true;
}
3.在CMenuSection類中,重載OnInitialize()事件(用于添加"Start"按鈕)和OnMouseClick()事件(用于處理鼠標點擊事件),兩個事件的代碼如下:
//初始化事件
bool CMenuSection::OnInitialize(){
__super::OnInitialize();
//創建文本對象
CGameObjectText* pGOText = new CGameObjectText();
_SIZE siSize;
_POINT piPos;
siSize.cx = siSize.cy = 300;
piPos.x = 350;piPos.y = 300;
pGOText->Create("Start", siSize, "font1.fnt");
pGOText->SetText("Start");
pGOText->MoveTo(piPos);
//添加文本對象至指定環節下
m_pGameView->GetBy("default")->GetBy("default")->Add((IGameObject*)pGOText->QueryInterface(IID_IGameObject, VER_IGameObject), "Start");
return true;
}
//鼠標點擊
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;
}
4.在CMainSection類中,重載OnInitialize()及Sample03范例中,CMyGameBody類中的鼠標,鍵盤事件
5.將CMyGameBody類的鼠標,鍵盤事件移植到CMainSection類中(按相同的方法同的內容拷貝,注意要將m_pCurrentSection->GetGameView()改為使用CGameSection內部屬性m_pGameView).
5.編譯并運行項目