Copyright2008ByNeusoftGroup.Allrightsreserved专题11基本游戏场景的建立(1)劲舞团SF抛砖引玉•大家认为近四年全世界最流行、最挣钱的游戏是什么呢?Copyright2008ByNeusoftGroup.Allrightsreserved魔兽世界需要哪些模块?模块划分•按照大家学习的知识,如果我们现在开发一款《魔兽世界——东软崛起》,首先开发哪些模块呢?–系统内核,SystemCore–图形内核,GraphicsCore–输入内核,InputCore–声音内核,SoundCore–网络内核,NetworkCore–人工智能,AICopyright2008ByNeusoftGroup.Allrightsreserved暂时不考虑如果你掌握了这些知识……•系统内核•图形内核•输入内核•声音内核•网络内核•人工智能Copyright2008ByNeusoftGroup.Allrightsreserved游戏程序架构师……游戏客户端程序员AI程序员服务器端程序员音效程序员UI程序员麻雀虽小,五脏俱全•系统内核:用于处理Windows处理过程,包括注册窗口类,创建应用程序窗口以及处理进程、状态和数据包。•图形内核:用于绘制图形。使用2D方法快速绘制图像或者使用动画网格之类的3D方法渲染场景。•输入内核:处理来自于键盘、鼠标的用户输入。•声音内核:让用户享受立体声的声音和音乐。此内核能够改变乐器声音。•网络内核:此内核讲客户机连接到网络以及服务器。使用此内核,就能够畅游网络。Copyright2008ByNeusoftGroup.Allrightsreserved麻雀虽小,五脏俱全•系统内核:用于处理Windows处理过程,包括注册窗口类,创建应用程序窗口以及处理进程、状态和数据包。•图形内核:用于绘制图形。使用2D方法快速绘制图像或者使用动画网格之类的3D方法渲染场景。•输入内核:处理来自于键盘、鼠标的用户输入。•声音内核:让用户享受立体声的声音和音乐。此内核能够改变乐器声音。•网络内核:此内核讲客户机连接到网络以及服务器。使用此内核,就能够畅游网络。Copyright2008ByNeusoftGroup.Allrightsreserved麻雀虽小,五脏俱全•系统内核–cApp::cApplication–使用cStateManager处理状态•图形内核组件•输入内核组件•声音内核Copyright2008ByNeusoftGroup.Allrightsreserved系统内核classcApplication{//与进程实例相关的成员//与窗口相关的成员//缺省的消息处理函数//游戏运行中的自定义函数}Copyright2008ByNeusoftGroup.AllrightsreservedclasscApplication{private:HINSTANCEm_hInst;HWNDm_hWnd;protected:charm_Class[MAX_PATH];charm_Caption[MAX_PATH];WNDCLASSEXm_wcex;DWORDm_Style;DWORDm_XPos;DWORDm_YPos;DWORDm_Width;DWORDm_Height;public:cApplication();HWNDGethWnd();HINSTANCEGethInst();BOOLRun();BOOLError(BOOLFatal,char*Text,...);BOOLMove(longXPos,longYPos);BOOLResize(longWidth,longHeight);BOOLShowMouse(BOOLShow=TRUE);virtualFARPASCALMsgProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam){returnDefWindowProc(hWnd,uMsg,wParam,lParam);}virtualBOOLInit(){returnTRUE;}virtualBOOLShutdown(){returnTRUE;}virtualBOOLFrame(){returnTRUE;}};请参考WindowsAPI编程的相关内容要使用cApplication:首先,必须将cApplication作为基类派生自己的应用程序类;然后,在自己的应用程序类中重载特定的函数以满足特定的要求。这些函数包括:Init:所有初始化代码,诸如加载数据、准备处理状态等。Shutdown:用于释放之前分配的所有资源。Frame:每次遍历消息泵(在消息泵中不处理Windows消息)时,都要调用cApplication::Frame函数。Frame函数处理游戏的一帧。派生自己的应用程序类classcApp:publiccApplication{private:char*m_Name;public:cApp();//OverriddenfunctionsBOOLInit();BOOLShutdown();BOOLFrame();};Copyright2008ByNeusoftGroup.AllrightsreservedFrame函数处理游戏的一帧,包括处理用户输入、监测网络数据以及绘制图形等。当然,这些操作都是需要调用其他游戏内核的。三个关键的函数classcApplication{//略……virtualBOOLInit(){returnTRUE;}virtualBOOLShutdown(){returnTRUE;}virtualBOOLFrame(){returnTRUE;}};注意这三个函数都返回一个bool值,这个值告诉cApplication类,是否应该退出程序或继续执行程序。只要这三个函数中的一个返回false值,应用程序就会结束运行。Copyright2008ByNeusoftGroup.Allrightsreserved状态管理器cStateManger的声明Copyright2008ByNeusoftGroup.AllrightsreservedclasscStateManager{typedefstructsState{//状态函数指针链表void(*Function)(void*Ptr,longPurpose);sState*Next;sState()//结构体构造函数,用于清空指针{Function=NULL;Next=NULL;}~sState(){deleteNext;}}sState;protected:sState*m_StateParent;public:cStateManager();~cStateManager();voidPush(void(*Function)(void*Ptr,longPurpose),void*DataPtr=NULL);BOOLPop(void*DataPtr=NULL);voidPopAll(void*DataPtr=NULL);BOOLProcess(void*DataPtr=NULL);};注意:状态管理器一节大家只要会用就好了;具体内容请学有余力的同学参加考相关资料。《DirectXRPG游戏编程》第1章,第6章《游戏引擎技术基础》中相关内容网络上查询有关有限状态机FSM的内容《游戏编程精粹1&3》中有关FSM以及模糊状态机的内容状态管理器cStateManger的定义Copyright2008ByNeusoftGroup.AllrightsreservedcStateManager::cStateManager(){m_StateParent=NULL;}cStateManager::~cStateManager(){PopAll();}//PushafunctionontothestackvoidcStateManager::Push(void(*Function)(void*Ptr,longPurpose),void*DataPtr){sState*StatePtr;//Don'tpushaNULLvalueif(Function!=NULL){//AllocateanewstateandpushitonstackStatePtr=newsState();StatePtr-Function=Function;StatePtr-Next=m_StateParent;m_StateParent=StatePtr;//CallstatewithinitpurposeStatePtr-Function(DataPtr,INITPURPOSE);}}BOOLcStateManager::Pop(void*DataPtr){sState*StatePtr;//Removetheheadofstack(ifany)if((StatePtr=m_StateParent)!=NULL){//Firstcallwithshutdownpurposem_StateParent-Function(DataPtr,SHUTDOWNPURPOSE);m_StateParent=StatePtr-Next;StatePtr-Next=NULL;deleteStatePtr;}//returnTRUEifmorestatesexist,FALSEotherwiseif(m_StateParent==NULL)returnFALSE;returnTRUE;}voidcStateManager::PopAll(void*DataPtr){while(Pop(DataPtr)==TRUE);}BOOLcStateManager::Process(void*DataPtr){//returnanerrorifnomorestatesif(m_StateParent==NULL)returnFALSE;//Processthetop-moststatem_StateParent-Function(DataPtr,FRAMEPURPOSE);returnTRUE;}有限状态机的使用classcApp:publiccApplication{private:cStateManagerm_StateManager;//状态函数原型staticvoidFunction1(void*,long);staticvoidFunction2(void*,long);public:boolInit(){m_StateManager.Push(Function1,this);}}Copyright2008ByNeusoftGroup.Allrightsreserved有限状态机的使用voidcApp::Function1(void*DataPtr,longPurpose){//获取一个指向待调用的类的指针,因此此函数是静态的cApp*cc=(cApp*)DataPtr;if(Purpose==INITPURPOSE){cc-m_StateManager.Push(Function2,cc);}elseif(Purpose==FRAMEPURPOSE){cc-m_StateManager.Pop(cc);}}Copyright2008ByNeusoftGroup.Allrightsreserved有限状态机的使用voidcApp::Function2(void*DataPtr,longPurpose){cApp*cc=(cApp*)DataPtr;if(Purpose==FRAMEPURPOSE){cc-m_StateManager.Pop(cc);}}Copyright2008ByNeusoftGroup.Allrightsreserved图形内核Copyright2008ByNeusoftGroup.Allrightsreserved类说明cGraphics