我對(duì)游戲開發(fā)的看法是要盡量將游戲細(xì)化,最基本的是將游戲劃分為多個(gè)環(huán)節(jié),每個(gè)環(huán)節(jié)盡可能獨(dú)立處理本環(huán)節(jié)的事情,所以於生出“CGameSection”這個(gè)類模板。在OGF中,當(dāng)處于某一環(huán)節(jié)內(nèi),其它環(huán)節(jié)是不會(huì)收到任何消息的并且其內(nèi)的物件也不會(huì)渲染,這使環(huán)節(jié)變得相對(duì)地獨(dú)立。
Sample04
簡(jiǎn)介:游戲環(huán)節(jié)
使用游戲環(huán)節(jié)對(duì)游戲進(jìn)行分階段管理.使用環(huán)節(jié)控制可以將整個(gè)游戲流程劃分為多個(gè)環(huán)節(jié),例如:SFLASH窗口環(huán)節(jié),菜單環(huán)節(jié),游戲環(huán)節(jié),結(jié)束環(huán)節(jié)等,具體視游戲大小而定.在此例中,會(huì)創(chuàng)建兩個(gè)環(huán)節(jié):CMenuSection, CMainSection,開始時(shí)會(huì)停留在MenuSection階段,有一個(gè)"Start"文本,當(dāng)點(diǎn)擊后會(huì)轉(zhuǎn)換至CMainSection環(huán)節(jié),并實(shí)現(xiàn)Sample03的效果.
1.添加CMenuSection和CMainSection類,這兩類都是基于CGameSection類.
2.修改CMyGameBody類的OnInitialize事件,以在此創(chuàng)建CMenuSection和CMainSection類的實(shí)例.
//初始化事件
bool CMyGameBody::OnInitialize(){
//創(chuàng)建自定義的環(huán)節(jié)
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()事件(用于處理鼠標(biāo)點(diǎn)擊事件),兩個(gè)事件的代碼如下:
//初始化事件
bool CMenuSection::OnInitialize(){
__super::OnInitialize();
//創(chuàng)建文本對(duì)象
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);
//添加文本對(duì)象至指定環(huán)節(jié)下
m_pGameView->GetBy("default")->GetBy("default")->Add((IGameObject*)pGOText->QueryInterface(IID_IGameObject, VER_IGameObject), "Start");
return true;
}
//鼠標(biāo)點(diǎn)擊
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類中的鼠標(biāo),鍵盤事件
5.將CMyGameBody類的鼠標(biāo),鍵盤事件移植到CMainSection類中(按相同的方法同的內(nèi)容拷貝,注意要將m_pCurrentSection->GetGameView()改為使用CGameSection內(nèi)部屬性m_pGameView).
5.編譯并運(yùn)行項(xiàng)目