我对游戏开发的看法是要尽量将游戏细化,最基本的是将游戏划分为多个环节,每个环节尽可能独立处理本环节的事情,所以於生出“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.编译并运行项目