hzming 发表于 2015-1-18 21:18:54

魔神游戏客户端应用程序结构

一.游戏状态逻辑在游戏中分为如下几个阶段: 1.取服务器IP状态2.登入状态3.制作都名单4.选择人物5.创建人物6. 主游戏    其中登入状态负责获取用户输入的 帐号和密码登录服务器;选择人物状态负责获取用户选择的角色进入游戏;创建人物状态负责提供用户编辑角色形象的界面;主游戏逻辑状态负责处理游戏逻辑。 二.游戏应用程序框架类CD3DApplicationclass CD3DApplication
   该类负责游戏逻辑控制,游戏场景更新,在MVC模式中,是属于控制单元。
主要数据结构如下
    D3DPRESENT_PARAMETERS m_d3dpp;         // 游戏显示参数
    HWND            m_hWnd;            // 游戏主窗口句柄
    LPDIRECT3D9       m_pD3D;            // d3d对象
    LPDIRECT3DDEVICE9 m_pd3dDevice;      // d3d 设备
    D3DSURFACE_DESC   m_d3dsdBackBuffer;   // d3d 设备后缓冲信息
    DWORD             m_dwWindowStyle;   // windows窗口类型

    // Variables for timing
    FLOAT             m_fTime;             // 游戏当前时间
    FLOAT             m_fFPS;            // 游戏桢率

    // Overridable variables for the app
    TCHAR*            m_strWindowTitle;    // 窗口标题
fullscreen<span style="font-family: 宋体; font-size: 10.5pt; text-indent: 15.75pt; background-color: rgb(255, 255, 255); line-height: 1.5;"> </span>三.游戏逻辑状态更新流程以及相关CD3DApplication类函数       1.INT CD3DApplication::Run()
         a. 在该函数中首先负责处理windows消息
    BOOL bGotMsg;
    MSGmsg;
    msg.message = WM_NULL;
    PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );
    while( WM_QUIT != msg.message)
    {
            bGotMsg = PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE );
      if( bGotMsg )
      {
      
//            if( 0 == TranslateAccelerator( m_hWnd, hAccel, &msg ) )
            {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
      }
b. 然后调用Render3DEnvironment()函数更新游戏画面。

2.Render3DEnvironment()
a. 首先测试d3d设备是否有效
       if( FAILED( hr = m_pd3dDevice->TestCooperativeLevel() ) )
    {
      // If the device was lost, do not render until we get it back
      if( D3DERR_DEVICELOST == hr )
            return S_OK;
      if( D3DERR_DEVICENOTRESET == hr )
      {
   
            if( m_bWindowed )
            {
                D3DAdapterInfo* pAdapterInfo = &m_Adapters;
                m_pD3D->GetAdapterDisplayMode( m_dwAdapter, &pAdapterInfo->d3ddmDesktop );
                m_d3dpp.BackBufferFormat = pAdapterInfo->d3ddmDesktop.Format;
   }
b. 得到游戏的全局时间
             FLOAT fAppTime      = DXUtil_Timer( TIMER_GETAPPTIME );

c. 更新场景
   if( m_bFrameMoving || m_bSingleStep )
             {
                 // Store the time for the app
                 m_fTime      = fAppTime;
                 m_fElapsedTime = fElapsedAppTime;

             // Frame move the scene
             if( FAILED( hr = FrameMove() ) )
                   return hr;

             m_bSingleStep = FALSE;
}


d. 渲染场景
// Render the scene as normal
    if ( !m_bPauseRendering )
    {
      if( FAILED( hr = Render() ) )
            return hr;
    }

    // Keep track of the frame count
    static FLOAT fLastTime = 0.0f;
    static DWORD dwFrames= 0L;
    FLOAT fTime = DXUtil_Timer( TIMER_GETABSOLUTETIME );
++dwFrames;<span style="font-family: 新宋体; font-size: 9pt; line-height: 1.5; text-indent: 17.25pt; background-color: rgb(255, 255, 255);"> </span>其中更新场景需要用到游戏时间参数,通过游戏参数更新游戏逻辑。 并且在该步凑负责游戏状态的逻辑控制。 首先处理纹理更新; 游戏的输入更新;游戏界面模块更新以及游戏的状态更新。
**** Hidden Message *****

兰色精灵 发表于 2015-1-21 17:34:31

魔神争霸好帖必须得顶起

pizazz 发表于 2015-1-24 19:42:17

魔神争霸学习下

爱飞 发表于 2015-1-30 13:23:43

魔神争霸楼主,有不满可以合法发泄,有病也要早治啊……

飘飘悠悠 发表于 2015-2-4 19:06:17

魔神争霸占坑编辑ing

x665211x 发表于 2015-2-8 16:31:00

谢谢分享

因胸联盟 发表于 2015-2-24 03:11:51

魔神争霸珍爱生命,果断回帖。

分手快乐 发表于 2015-3-7 00:07:09

魔神争霸天书奇谭,建议列为中文专业博士学位答辩翻译必考题目。

7793123623 发表于 2015-3-9 16:09:45

学习学习呀

kkk103005 发表于 2015-3-10 01:47:23

感謝大大提供~

活着的死人 发表于 2015-3-17 03:47:55

魔神争霸不错支持下

飘灵儿 发表于 2015-3-17 22:55:15

魔神争霸前排顶,很好!

小女巫 发表于 2015-3-25 04:23:29

魔神争霸前排顶,很好!

金色的骷髅 发表于 2015-3-27 00:08:19

魔神争霸学习下

不帅 发表于 2015-3-28 23:21:51

魔神争霸学习下

蒙在股里 发表于 2015-4-10 21:50:13

魔神争霸支持楼主,用户楼主,楼主英明呀!!!

admin 发表于 2015-4-13 01:37:30

魔神争霸鄙视楼下的顶帖没我快,哈哈

谁可相欹 发表于 2015-4-13 01:40:57

魔神争霸占坑编辑ing

海妖 发表于 2015-4-25 02:01:03

魔神争霸楼猪V5啊

冷月葬花魂 发表于 2015-4-26 04:10:09

魔神争霸不错支持下
页: [1] 2
查看完整版本: 魔神游戏客户端应用程序结构