游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2672|回复: 5

菜鸟跪求高手分析下,这样安排D3D程序入口Main函数合理不,

[复制链接]

1

主题

39

帖子

39

积分

注册会员

Rank: 2

积分
39
发表于 2010-8-1 17:29:00 | 显示全部楼层 |阅读模式
//-----------------------------------------------------------------------------
// 添加头文件
//-----------------------------------------------------------------------------
#include "stdafx.h"    //公共头文件
#include "D3Ddevice.h" //D3D设备类头文件
#include "GameManage.h"//游戏管理类头文件
//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
BOOL           g_rs   = TRUE;//渲染状态
HWND           g_hWnd = NULL;//窗口句柄
CD3Ddevice*   g_pDd  = NULL;//设备类指针
CGameManage*  g_pGM  = NULL;//游戏管理类指针
//-----------------------------------------------------------------------------
// 全局函数
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);         //窗口消息(回调函数)
VOID                            RegisterNewClass(WNDCLASSEX &wc);         //注册窗口类
VOID                        CreateNewWindow(HWND &hWnd, WNDCLASSEX &wc);//创建窗口
VOID                        CleanData();                         //清除数据
HRESULT                        InitData();                         //初始化数据
VOID                        Updata();                                 //更新
VOID                        Render();                                 //渲染
//-----------------------------------------------------------------------------
// 程序入口,程序框架
//-----------------------------------------------------------------------------
INT WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, INT)
{
        WNDCLASSEX wc;                                 //窗口类
        RegisterNewClass(wc);                                 //●注册窗口类
        CreateNewWindow(g_hWnd, wc);                         //●创建窗口
        if(FAILED(InitData()))                         //●初始化数据
        {
                CleanData();                         //●清除数据
        }else
        {
                ShowWindow(g_hWnd, SW_SHOWDEFAULT);         //显示窗口
                UpdateWindow(g_hWnd);                         //更新窗口
                MSG msg;                                 //消息数据
                ZeroMemory(&msg, sizeof(msg));                 //清空消息数据
                while(msg.message != WM_QUIT)                 //●消息循环
                {
                        if(PeekMessage(                 //★有无消息都会返回
                                &msg,                 //保存消息
                                NULL,                 //窗口句柄
                                0U,                 //消息范围最小值
                                0U,                 //消息范围最大值
                                PM_REMOVE                 //对消息队列的操作
                                ))
                        {
                                TranslateMessage(&msg);//翻译消息
                                DispatchMessage(&msg); //发送消息
                        }else
                        {
                                Updata();                  //★更新
                                Render();                  //★渲染
                        }
                }
        }
        UnregisterClass(                                  //●卸载窗口
                L"D3D GAME",                          //窗口名称
                wc.hInstance);                          //窗口的应用程序实例
        return 0;
}
//-----------------------------------------------------------------------------
// 注册窗口类
//-----------------------------------------------------------------------------
VOID RegisterNewClass(WNDCLASSEX &wc)
{
        wc.cbSize                = sizeof(WNDCLASSEX);                 //描述整个wcex变量的大小
        wc.style                = CS_CLASSDC;                 //定义窗口类风格
        wc.lpfnWndProc        = MsgProc;                         //回调函数的函数名
        wc.cbClsExtra        = 0L;                            //额外类空间
        wc.cbWndExtra        = 0L;                            //描述额外类空间
        wc.hInstance        = GetModuleHandle(NULL);      //标识这个窗口类和哪个应用程序的实例相关联
        wc.hIcon                = NULL;                         //窗口类的图标,显示在窗口左上角
        wc.hCursor                = LoadCursor(NULL, IDC_ARROW);//窗口类的鼠标光标
        wc.hbrBackground        = NULL;                         //窗口背景颜色
        wc.lpszMenuName        = NULL;                         //关联一个窗口菜单
        wc.lpszClassName        = L"D3D GAME";                 //窗口类的名称
        wc.hIconSm                = NULL;                         //窗口最小化图标
        RegisterClassEx(&wc);                                 //注册窗口类
}
//-----------------------------------------------------------------------------
// 创建窗口
//-----------------------------------------------------------------------------
VOID CreateNewWindow(HWND &hWnd, WNDCLASSEX &wc)
{
        hWnd = CreateWindow(
                L"D3D GAME",                  //窗口类的名(必须和注册窗口类的名称相同)
                L"游戏项目",                  //窗口实例的标题名
                WS_OVERLAPPEDWINDOW^WS_THICKFRAME,//窗口的风格
                CW_USEDEFAULT,                  //窗口X坐标
                CW_USEDEFAULT,                  //窗口Y坐标
                CW_USEDEFAULT,                  //窗口的宽度
                CW_USEDEFAULT,                  //窗口的高度
                NULL,                          //窗口有无父窗口
                NULL,                          //窗口有无主菜单
                wc.hInstance,                  //应用程序当前句柄
                NULL                          //是否使用该值技能归纳
                );
}
//-----------------------------------------------------------------------------
// 清除数据
//-----------------------------------------------------------------------------
VOID CleanData()
{
        SAFE_DELETE(g_pGM);
        SAFE_DELETE(g_pDd);
}
//-----------------------------------------------------------------------------
// 初始化数据
//-----------------------------------------------------------------------------
HRESULT InitData()
{
        //加载D3D设备数据
        g_pDd = new CD3Ddevice(g_hWnd);
        if(FAILED(g_pDd->InitData()))
        {
                return E_FAIL;
        }
        //加载游戏数据
        g_pGM = new CGameManage(g_hWnd, g_pDd);
        if(FAILED(g_pGM->InitData()))
        {
                return E_FAIL;
        }
        return S_OK;
}
//-----------------------------------------------------------------------------
// 更新
//-----------------------------------------------------------------------------
VOID Updata()
{
        g_pGM->Updata();
}
//-----------------------------------------------------------------------------
// 渲染
//-----------------------------------------------------------------------------
VOID Render()
{
        //★预判断
        if(g_rs == FALSE)
        {
                return;
        }
        LPDIRECT3DDEVICE9 pDevice = g_pDd->GetDevice();
        if(pDevice == NULL)
        {
                return;
        }
        //★清屏(后台缓冲区)
        pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
        //★开始渲染
        if(SUCCEEDED(pDevice->BeginScene()))
        {        //★渲染内容
                g_pGM->Render();
                //★结束渲染
                pDevice->EndScene();
        }
        //★屏幕翻转(后台缓冲区的数据交换到前台缓冲区,COPY模式下才更改参数)
        pDevice-&gtresent(
                NULL,        //复制源的矩形区域指针
                NULL,        //复制目的地的矩形区域指针
                NULL,        //D3D设备窗口句柄
                NULL        //最小更新区域指针
                );
}
//-----------------------------------------------------------------------------
// 窗口消息(回调函数)
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
        g_pGM->MsgProc(msg, lParam);
        switch(msg)
        {
        case WM_SIZE://窗口大小                       
                switch(wParam)
                {
                case SIZE_RESTORED:        //窗口还原大小
                        g_rs = TRUE;
                        break;
                case SIZE_MINIMIZED://窗口最小化
                        g_rs = FALSE;
                        break;
                }
                break;
        case WM_ACTIVATE://窗口焦点激活状态
                switch(wParam)
                {
                case WA_CLICKACTIVE://窗口获得焦点
                case WA_ACTIVE:
                        g_rs = TRUE;       
                        break;
                case WA_INACTIVE://窗口失去焦点
                        g_rs = FALSE;       
                        break;
                }
                break;
        case WM_DESTROY:
                CleanData();
                PostQuitMessage(0);
                return 0;
        }
        return DefWindowProc(hWnd, msg, wParam, lParam);
}

3

主题

263

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2010-8-1 20:44:00 | 显示全部楼层

Re:菜鸟跪求高手分析下,这样安排D3D程序入口Main函数合理

嗯嗯,很合理,继续努力.

1

主题

39

帖子

39

积分

注册会员

Rank: 2

积分
39
 楼主| 发表于 2010-8-2 15:24:00 | 显示全部楼层

Re:菜鸟跪求高手分析下,这样安排D3D程序入口Main函数合理

谢谢楼上的支持,我会努力的.

2

主题

41

帖子

66

积分

注册会员

Rank: 2

积分
66
发表于 2010-8-2 17:58:00 | 显示全部楼层

Re:菜鸟跪求高手分析下,这样安排D3D程序入口Main函数合理

对于一个小游戏来说,楼主的程序结构基本上算是合理的。

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-8-2 20:20:00 | 显示全部楼层

Re:菜鸟跪求高手分析下,这样安排D3D程序入口Main函数合理

没记错的话这个网上有标准程序的吧,而且用DXUT做小程序的话,感觉也会更快些的。

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-8-2 20:35:00 | 显示全部楼层

Re:菜鸟跪求高手分析下,这样安排D3D程序入口Main函数合理

程序入口定义帧率FPS啊,做些动画什么的还可以。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-11-22 16:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表