梁志斌的专栏

游戏开发 DirectX技术

 
首页>>
关于作者

作  者:梁  志  斌

QQ   :3055720

QQ群:14739153

友情链接
搜索日志
访问计数
最新评论

制作一个旋转的三角形 [2005-8-7]
happy201 发表在 DirectX开发
//****************************************************************************
//说明:
//开发环境:Visual C++.NET 7.1.3091 DirectX 9.0C
//操作系统:WindowsXP SP2
//硬件:AMD Athlon XP 2500+,DDR400 256MB,Geforce4 MX440 AGP 8X 64MB
//****************************************************************************
#include<d3d9.h>
#include<d3dx9.h>
#include<windows.h>
#include<d3d9types.h>

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"dxguid.lib")
#pragma comment(lib,"Winmm.lib")

//变量说明
HWND hWnd;
LPDIRECT3D9 D3d9;
LPDIRECT3DDEVICE9 D3ddevice9;
LPDIRECT3DVERTEXBUFFER9 g_pVB;

//函数申明

BOOL InitWindow(HINSTANCE hInstance,int nCmdShow);
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);

//定义FVF结构体
struct CUSTOMVERTEX
{
FLOAT x, y, z;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

//*******************************************************************
//函数:InitWindow()
//功能:创建窗口
//编写人:梁志斌
//*******************************************************************
static BOOL InitWindow(HINSTANCE hInstance,int nCmdShow)
{
WNDCLASS wndcls;
    wndcls.cbClsExtra=0;                                        //分配给窗口类结构之后的额外字节数
    wndcls.cbWndExtra=0;                                        //分配给窗口实例之后的额外的字节数
    wndcls.hbrBackground=CreateSolidBrush(RGB(58,110,165));        //桌面背景色
    wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);                    //窗口中的鼠标形状
    wndcls.hIcon=LoadIcon(NULL,"CounterStrike.ico");            //窗口图标
    wndcls.hInstance=hInstance;                                    //窗口所对应的应用程序的句柄
    wndcls.lpfnWndProc=(WNDPROC)WinProc;                        //窗口消息处理函数的指针
    wndcls.lpszClassName="CounterStrike";                        //窗口的类名称
    wndcls.lpszMenuName=NULL;                                    //窗口的菜单资源名称
    wndcls.style= NULL;                                            //窗口的风格
    if(!RegisterClass(&wndcls))                                    //注册窗口
    {
        ::MessageBox(0, "RegisterClass() - FAILED", 0, 0);
        return FALSE;
    }

    hWnd=CreateWindow("CounterStrike","CounterStrike",WS_POPUP|WS_MAXIMIZE|WS_MINIMIZE,0,0,
    GetSystemMetrics(SM_CXSCREEN),                                //此函数返回屏幕宽度
GetSystemMetrics(SM_CYSCREEN),                                //此函数返回屏幕高度
    GetDesktopWindow(),NULL,hInstance,NULL);
    if(!hWnd)
    {
        ::MessageBox(0, "CreateWindow() - FAILED", 0, 0);
        return FALSE;
    }

    ShowWindow(hWnd,SW_SHOWNORMAL);
    UpdateWindow(hWnd);
    return TRUE;
}
//**********************************************************************
//函数:InitD3D()
//功能:初始化D3D
//编写人:梁志斌
//**********************************************************************
bool InitD3D()
{

    if(NULL==(D3d9=Direct3DCreate9(D3D_SDK_VERSION)))
    {
        ::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
        return FALSE;
    }
    
    
D3DDISPLAYMODE d3ddm;
if(D3D_OK!=(D3d9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
{
        ::MessageBox(0,"GetAdapterDisplayMode() - FAILED",0,0);
        return FALSE;
    }


    D3DPRESENT_PARAMETERS D3dpp;

    ZeroMemory(&D3dpp, sizeof(D3dpp));
    D3dpp.Windowed=false;
    D3dpp.hDeviceWindow=hWnd;
    D3dpp.SwapEffect=D3DSWAPEFFECT_FLIP;
    D3dpp.BackBufferCount=1; //有一个后台缓存
    D3dpp.BackBufferWidth=d3ddm.Width;//屏幕宽度
    D3dpp.BackBufferHeight=d3ddm.Height;//屏幕长度
    //立即显示刷新后的图像
    D3dpp.PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;


    D3dpp.BackBufferFormat=D3DFMT_X8R8G8B8;//色彩深度

    //开启自动深度缓冲
    //D3dpp.EnableAutoDepthStencil=true;
    //D3dpp.AutoDepthStencilFormat=D3DFMT_D16;//生成16 bit的Z缓存

    if(D3D_OK!=(D3d9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&D3dpp,&D3ddevice9)))
    {
        ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
        return FALSE;
    }
    //启用Z缓存,允许消隐处理
    D3ddevice9->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
    //关闭"挑选"功能,允许渲染背面
    D3ddevice9->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
    //因为使用顶点颜色渲染,所以要禁用光照处理
    D3ddevice9->SetRenderState(D3DRS_LIGHTING,FALSE);
    return true;
}
HRESULT InitVB()
{
        CUSTOMVERTEX Vertices[] =
{
{-1.0f,-1.0f,0.0f,0xffff0000},
{ 1.0f,-1.0f,0.0f,0xff0000ff},
{ 0.0f, 1.0f,0.0f,0xffffffff},
};

    //创建顶点缓冲
if(D3D_OK!=(D3ddevice9->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL)))
{
        ::MessageBox(0, "CreateVertexBuffer() - FAILED", 0, 0);
        return FALSE;
    }
    //填充顶点
VOID* pVertices;
if(FAILED(g_pVB->Lock(0,sizeof(Vertices),(void**)&pVertices,0)))
{
        ::MessageBox(0, "Lock() - FAILED", 0, 0);
        return FALSE;
    }
memcpy(pVertices,Vertices,sizeof(Vertices));
g_pVB->Unlock();
    return S_OK;
}
void SetupMatrices()
{
D3DXMATRIXA16 matWorld;

UINT iTime = timeGetTime() % 1000;
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;//把旋转角换算成弧度
D3DXMatrixRotationY( &matWorld, fAngle );//计算世界变换矩阵
D3ddevice9->SetTransform( D3DTS_WORLD, &matWorld );//把世界变换矩阵设置到渲染环境


D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );//观察点
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );//视线目标点
D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );//上方向
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );//计算视角变换矩阵
D3ddevice9->SetTransform( D3DTS_VIEW, &matView );//把视角变换矩阵设置到渲染环境

D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );//计算透视投影变换矩阵
D3ddevice9->SetTransform( D3DTS_PROJECTION, &matProj );//把投影变换矩阵设置到渲染环境
}
VOID Cleanup()
{
if(g_pVB!= NULL)
g_pVB->Release();

    if(D3ddevice9!=NULL)
D3ddevice9->Release();

if(D3d9!=NULL)
D3d9->Release();
}


VOID Render()
{    
    //用蓝色清空背景区域
D3ddevice9->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
    // 开始绘制场景    
if(SUCCEEDED(D3ddevice9->BeginScene()))
{    
        SetupMatrices();//设置变换矩阵
D3ddevice9->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));//绑定顶点缓存区至设备数据源
D3ddevice9->SetFVF(D3DFVF_CUSTOMVERTEX);//设置自定义的FVF
D3ddevice9->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);//绘制图元,其中参数1为图元格式,参数3为三角形数目
}
    // 结束场景绘制
D3ddevice9->EndScene();
    // 显示到屏幕上
D3ddevice9->Present(NULL,NULL,NULL,NULL);
}
//**********************************************************************
//函数:WinMain()
//功能:Windows 程序入口函数。创建主窗口,处理消息循环
//编写人:梁志斌
//**********************************************************************

int WINAPI WinMain(HINSTANCE hInstance, //hInstance:表示该应用程序的句柄
HINSTANCE hPrevInstance, //hPrevInstance:为了保持与16位windows应用程序的兼容性
LPSTR lpCmdLine, //lpCmdLine:指向命令行参数字符串的指针
int nCmdShow) //nCmdShow:指定应用程序窗口显示方式的整数
{    
    InitWindow(hInstance,nCmdShow);
    InitD3D();
    InitVB();
    Render();
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while(GetMessage(&msg,NULL,0,0))
{
         //Render();    //渲染
            TranslateMessage( &msg );
            DispatchMessage( &msg );
     }
return (int)msg.wParam;
}

//*******************************************************************
//函数:WinProc()
//功能:处理窗口消息
//编写人:梁志斌
//*******************************************************************

LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_KEYDOWN: //击键消息
switch(wParam)
{
case VK_ESCAPE:
DestroyWindow(hWnd); //释放窗口
Cleanup();
PostQuitMessage(0); //给窗口发送WM_QUIT消息
return 0; //处理完一个消息后返回0
}
//case WM_RBUTTONDOWN:
// MessageBox(hWnd,"鼠标右键按下了!","Mouse",MB_OK);
return 0;

}
return DefWindowProc(hWnd,msg,wParam,lParam); //调用缺省消息处理过程
}
≡≡≡≡≡ 评论(共 条)我要评论
 

 Copyright  @  好想~~~~好想 2005.03