




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络游戏编程实验报告1、 实验内容实现纹理包装。二、程序代码/-/ File: TextureWrap.cpp/-#include / Direct3D头文件#include / D3DX库的头文件#define SAFE_RELEASE(p) if(p) (p)-Release(); (p)=NULL; wchar_t *g_pClassName = LTextureWrap; / 窗口类名wchar_t *g_pWindowName = L纹理包装示例; / 窗口标题名LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; / D3D设备接口LPDIRECT3DVERTEXBUFFER9 g_pVertexBuf = NULL; / 顶点缓存接口LPDIRECT3DINDEXBUFFER9 g_pIndexBuf = NULL; / 索引缓存接口LPDIRECT3DTEXTURE9 g_pTexture = NULL; / 纹理接口/ 顶点结构struct CUSTOMVERTEX FLOAT _x, _y, _z; / 顶点的位置 FLOAT _u, _v; / 纹理坐标 CUSTOMVERTEX(FLOAT x, FLOAT y, FLOAT z, FLOAT u, FLOAT v) : _x(x), _y(y), _z(z), _u(u), _v(v) ;#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX1)HRESULT InitDirect3D(HWND hWnd); / 初始化Direct3DVOID Direct3DRender(); / 渲染图形VOID Direct3DCleanup(); / 清理Direct3D资源/ 窗口消息处理函数声明LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);/-/ Name: WinMain();/ Desc: Windows应用程序入口函数/-int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) / 初始化窗口类 WNDCLASS wndclass; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); / 窗口背景 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); / 光标形状 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); / 窗口小图标 wndclass.hInstance = hInstance; wndclass.lpfnWndProc = WndProc; wndclass.lpszClassName = g_pClassName; wndclass.lpszMenuName = NULL; wndclass.style = CS_HREDRAW | CS_VREDRAW; / 注册窗口类 if (!RegisterClass(&wndclass) return 0; / 创建窗口 HWND hWnd = CreateWindow(g_pClassName, g_pWindowName, WS_OVERLAPPEDWINDOW, 100, 100, 640, 480, NULL, NULL, wndclass.hInstance, NULL); / 初始化Direct3D InitDirect3D(hWnd); / 显示、更新窗口 ShowWindow(hWnd, SW_SHOWDEFAULT); UpdateWindow(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 Direct3DRender(); / 绘制D场景 UnregisterClass(g_pClassName, wndclass.hInstance); return 0;/-/ Name: WndProc()/ Desc: 窗口消息处理函数/-LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) switch (message) case WM_PAINT: / 客户区重绘消息 Direct3DRender(); / 渲染图形 ValidateRect(hWnd, NULL); / 更新客户区的显示 break; case WM_KEYDOWN: / 键盘按下消息 if (wParam = VK_ESCAPE) / ESC键 DestroyWindow(hWnd); / 销毁窗口, 并发送一条WM_DESTROY消息 break; case WM_DESTROY: / 窗口销毁消息 Direct3DCleanup(); / 清理Direct3D PostQuitMessage(0); / 退出程序 break; / 默认的消息处理 return DefWindowProc( hWnd, message, wParam, lParam );/-/ Name: InitDirect3D()/ Desc: 初始化Direct3D/-HRESULT InitDirect3D(HWND hWnd) / 创建IDirect3D接口 LPDIRECT3D9 pD3D = NULL; / IDirect3D9接口 pD3D = Direct3DCreate9(D3D_SDK_VERSION); / 创建IDirect3D9接口对象 if (pD3D = NULL) return E_FAIL; / 获取硬件设备信息 D3DCAPS9 caps; int vp = 0; pD3D-GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps ); if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ) vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; else vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; / 创建Direct3D设备接口 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp); d3dpp.BackBufferWidth = 640; d3dpp.BackBufferHeight = 480; d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8; d3dpp.BackBufferCount = 1; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.MultiSampleQuality = 0; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = hWnd; d3dpp.Windowed = true; d3dpp.EnableAutoDepthStencil = true; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.Flags = 0; d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; pD3D-CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, vp, &d3dpp, &g_pd3dDevice); pD3D-Release(); / 创建纹理 D3DXCreateTextureFromFile(g_pd3dDevice, Lwrap.bmp, &g_pTexture); / 创建顶点缓存 g_pd3dDevice-CreateVertexBuffer(8 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuf, NULL); / 填充顶点数据 CUSTOMVERTEX *pVertices = NULL; g_pVertexBuf-Lock(0, 0, (void*)&pVertices, 0); pVertices0 = CUSTOMVERTEX(-5.0f, 25.0f, -5.0f, 1.0f/8.0f, 0.0f); pVertices1 = CUSTOMVERTEX(-5.0f, 25.0f, 5.0f, 3.0f/8.0f, 0.0f); pVertices2 = CUSTOMVERTEX( 5.0f, 25.0f, 5.0f, 5.0f/8.0f, 0.0f); pVertices3 = CUSTOMVERTEX( 5.0f, 25.0f, -5.0f, 7.0f/8.0f, 0.0f); pVertices4 = CUSTOMVERTEX(-5.0f, -25.0f, -5.0f, 1.0f/8.0f, 1.0f); pVertices5 = CUSTOMVERTEX(-5.0f, -25.0f, 5.0f, 3.0f/8.0f, 1.0f); pVertices6 = CUSTOMVERTEX( 5.0f, -25.0f, 5.0f, 5.0f/8.0f, 1.0f); pVertices7 = CUSTOMVERTEX( 5.0f, -25.0f, -5.0f, 7.0f/8.0f, 1.0f); g_pVertexBuf-Unlock(); / 创建索引缓存 g_pd3dDevice-CreateIndexBuffer(36 * sizeof(WORD), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndexBuf, NULL); / 填充索引数据 WORD *pIndices = NULL; g_pIndexBuf-Lock(0, 0, (void*)&pIndices, 0); / 顶面 pIndices0 = 0, pIndices1 = 1, pIndices2 = 2; pIndices3 = 0, pIndices4 = 2, pIndices5 = 3; / 正面 pIndices6 = 0, pIndices7 = 3, pIndices8 = 7; pIndices9 = 0, pIndices10 = 7, pIndices11 = 4; / 左侧面 pIndices12 = 0, pIndices13 = 4, pIndices14 = 5; pIndices15 = 0, pIndices16 = 5, pIndices17 = 1; / 右侧面 pIndices18 = 2, pIndices19 = 6, pIndices20 = 7; pIndices21 = 2, pIndices22 = 7, pIndices23 = 3; / 背面 pIndices24 = 2, pIndices25 = 5, pIndices26 = 6; pIndices27 = 2, pIndices28 = 1, pIndices29 = 5; / 底面 pIndices30 = 4, pIndices31 = 6, pIndices32 = 5; pIndices33 = 4, pIndices34 = 7, pIndices35 = 6; g_pIndexBuf-Unlock(); / 设置材质 D3DMATERIAL9 mtrl; :ZeroMemory(&mtrl, sizeof(mtrl); mtrl.Ambient = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); mtrl.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); mtrl.Specular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); g_pd3dDevice-SetMaterial(&mtrl); / 设置环境光 g_pd3dDevice-SetRenderState(D3DRS_AMBIENT, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); / 设置取景变换矩阵 D3DXMATRIX matView; D3DXVECTOR3 vEye(0.0f, 0.0f, -150.0f); D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f); D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f); D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp); g_pd3dDevice-SetTransform(D3DTS_VIEW, &matView); / 设置投影变换矩阵 D3DXMATRIX matProj; D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4.0f, 1.0f, 1.0f, 1000.0f); g_pd3dDevice-SetTransform(D3DTS_PROJECTION, &matProj); return S_OK;/-/ Name: Direct3DRender()/ Desc: 绘制D场景/-VOID Direct3DRender() g_pd3dDevice-Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); g_pd3dDevice-BeginScene(); / 开始绘制 / 设置世界变换矩阵 FLOAT fAngle = (float):timeGetTime() / 600.0f; D3DXMATRIX matWorld, Ry; D3DXMatrixTranslation(&matWorld, -15.0f, 0.0f, 0.0f); D3DXMatrixRotationY(&Ry, fAngle); D3DXMatrixMultiply(&matWorld, &Ry, &matWorld); g_pd3dDevice-SetTransform(D3DTS_WORLD, &matWorld); / 关闭纹理包装 g_pd3dDevice-SetRenderState(D3DRS_WRAP0, 0); / 绘制立方体 g_pd3dDevice-SetStreamSource(0, g_pVertexBuf, 0, sizeof(CUSTOMVERTEX); g_pd3dDevice-SetFVF(D3DFVF_CUSTOM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络管理员基础培训课程
- 中班健康:认识肚脐
- 工程公司内部培训
- 10kv配网带电作业培训
- 园长培训:如何应对幼儿分离焦虑
- 无人机辅助车队运输合同范本
- 跨国车辆损伤赔偿及国际物流合同
- 文化创意步行街个人店铺租赁与创意产业发展合同
- 互联网企业财务人员客户信息保密责任合同
- 餐饮企业品牌推广合作经营协议
- 温州市2024-2025学年高一下学期6月期末-英语试卷及答案
- 专利代理所管理制度
- 2025至2030年中国核电材料行业市场现状分析及发展战略研判报告
- 玄隐遗密(含黄帝内经)
- 2025至2030年中国高镍三元材料产业发展动态及投资方向分析报告
- DB13T 1320.10-2010 中药材种子质量标准 第10部分:防风
- (2025春新版本)人教版七年级生物下册全册教案
- 医院残疾评定管理制度
- 杂志分拣打包服务合同4篇
- 2025年D-对羟基苯甘氨酸项目市场调查研究报告
- 2024-2025 学年八年级英语下学期期末模拟卷 (常州专用)解析卷
评论
0/150
提交评论