马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一.游戏状态逻辑 在游戏中分为如下几个阶段: 1.取服务器IP状态 2.登入状态 3.制作都名单 4.选择人物 5.创建人物 6. 主游戏 其中登入状态负责获取用户输入的 帐号和密码登录服务器; 选择人物状态负责获取用户选择的角色进入游戏; 创建人物状态负责提供用户编辑角色形象的界面; 主游戏逻辑状态负责处理游戏逻辑。 二.游戏应用程序框架类CD3DApplication - class 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;
- MSG msg;
- 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_dwAdapter];
- 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>
复制代码其中更新场景需要用到游戏时间参数,通过游戏参数更新游戏逻辑。 并且在该步凑负责游戏状态的逻辑控制。 首先处理纹理更新; 游戏的输入更新;游戏界面模块更新以及游戏的状态更新。
|