【DirectX 2D游戏编程基础】DirectX环境的搭建
2015-08-12 23:20
561 查看
首先,我们先回顾下我上个博客,关于手动建立一个win32 窗口的博客,在这里,我再写一遍昨天的代码,并且在这里面加几个函数,关于windows窗口的建立这部分代码,注释我就不写了,只是为了展示我的几个函数所加的位置
本博客实例代码地址:http://download.csdn.net/detail/shangdi712/9052045
这里稍微解释一下utility.h的代码,开始先引入window.h mmsystem.h两个头文件,和Winmm.lib 这个库的作用是为了生成windows窗口所用
之后引入directx 所需要的库和头文件
好了,重点来了,后面两个函数模板的作用是用来安全释放的,前一个用来释放普通指针,后一个用来释放directx定义的复杂指针,将安全释放的函数写成模板,之后随调随用,增强了代码的简洁性
好了,下面就是WinMain中的内容了
但是,问题来了,如果你按照我的代码写,甚至是把整个代码复制进去,运行的时候还是会有错的,如果你用的是高版本的visual stdio的话,估计在导入d3dx9.h的时候就会有一个红色的波浪线挥之不去,为什么呢,当然是没有安装directx的SDK啊,安装完directx 的SDK 并且把他导入VS里就可以了,具体步骤如下:
1.安装SDK
下载SDK,双击,然后一路下一步,然后直到安装完成
2.在VS中导入库和包含文件
打开vs 然后在你的项目上右击属性,会进入属性界面,左侧点击VC++目录,如图,
在包含文件和库文件位置分别作相应设置,首先是包含文件,点击向下小箭头,然后再点编辑,会出现如下界面
点击上方新建文件夹那个黄黄的图标,地下框里会出现一行可编辑区域,右侧有一个方框里面有三个点,就点那个方框然后选择directx所在位置,默认情况下
64位所在位置:C:\Program Files (x86)\Microsoft DirectX SDK (June 2008)\Include
32位所在位置:C:\Program Files \Microsoft DirectX SDK (June 2008)\Include
把Include这个文件夹包含进来就可以了,
库文件相同道理,库文件所在位置
64位系统所在位置:C:\Program Files (x86)\Microsoft DirectX SDK (June 2008)\Lib\x86
32位系统所在位置:C:\Program Files \Microsoft DirectX SDK (June 2008)\Lib\x86
然后确定确定,大功告成,然后你就会发现d3dx9.h下面那个阴魂不散的小红波浪线没有了,但是,在一些个别情况,还有这样的错误
1>c:\program files (x86)\windows kits\8.1\include\um\propidl.h(1304): error C2061: 语法错误: 标识符“__RPC__inout_xcount”
1>c:\program files (x86)\windows kits\8.1\include\um\propidl.h(1305): error C2061: 语法错误: 标识符“__RPC__in_xcount”
没错,就是这货,可讨厌了,这个问题怎么解决呢
好办,首先,让我们打开刚才包含文件那个名叫Include的文件夹,然后在里面找到名为rpcsal.h的文件,打开它,然后随便找个合适的位置输入以下几行代码:
在Rpcsal.h中添加cxyc预编译指令
#define __RPC__out_xcount_part(size,length)
#define __RPC__in_xcount(size)
#define __RPC__in_xcount_full(size)
#define __RPC__in_range(min,max)
#define __RPC__inout_xcount(size)
然后保存,如果系统说你没有权限,那你就先另存为到桌面上,然后复制进去,替换就好,这回可是真真的没有问题了
运行结果如下
对,就是一个窗口,看起来,跟原版windows窗口只有颜色不一样,然而,除此之外,这个窗口是3D的,可以渲染3D图形。
总之,这篇博客上的direct的内容很基础,我之后还会再写一篇关于direct的文章,也很基础,逻辑上很简单,但是要记忆的东西比较多
本博客实例代码地址:http://download.csdn.net/detail/shangdi712/9052045
utility.h //-------Windows头及库文件------- #ifndef WINDOWS_PLATFORM_ #define WINDOWS_PLATFORM_ #include <Windows.h> #include <mmsystem.h> #pragma comment(lib,"Winmm.lib") #endif //-------D3D头及库文件------- #ifndef D3D_USEFUL_H_ #define D3D_USEFUL_H_ #include <d3d9.h> #pragma comment(lib,"d3d9.lib") #include <d3dx9.h> #pragma comment(lib,"d3dx9.lib") #endif //-------SAFE_DELETE_---------- #ifndef SAFE_DELETE_T_ #define SAFE_DELETE_T_ template<typename T>inline void Safe_Delete(T* & p) { if (p){ delete p; p = nullptr; } } template<typename T>inline void Safe_Release(T* & p) { if (p){ p->Release(); p = nullptr; } } #endif
这里稍微解释一下utility.h的代码,开始先引入window.h mmsystem.h两个头文件,和Winmm.lib 这个库的作用是为了生成windows窗口所用
之后引入directx 所需要的库和头文件
好了,重点来了,后面两个函数模板的作用是用来安全释放的,前一个用来释放普通指针,后一个用来释放directx定义的复杂指针,将安全释放的函数写成模板,之后随调随用,增强了代码的简洁性
好了,下面就是WinMain中的内容了
#include "Utility.h" HWND g_hWnd = 0; HINSTANCE g_hInstance = 0; /* 绘图窗口改造的步骤: 1、包含头文件及库文件,见Utility.h文件 2、声明变量 3、创建D3D接口指针 4、创建D3D设备指针 5、创建Sprite精灵指针 6、改造onRender函数 */ //COM:组件对象模型 LPDIRECT3D9 g_pD3D = nullptr; //D3D的接口指针,为了创建设备指针 LPDIRECT3DDEVICE9 g_pDevice = nullptr; //D3D的设备指针,为了创建精灵指针 LPD3DXSPRITE g_pSprite = nullptr; //D3D的精灵指针,为了画图 LRESULT CALLBACK WndProc(HWND hWnd ,UINT uMsg, WPARAM wParam,LPARAM lParam); VOID onInit() { //3、创建D3D接口指针 g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); D3DDISPLAYMODE d3ddm; //D3D显示模式结构体 ZeroMemory(&d3ddm, sizeof(d3ddm)); //获取当前显卡的显示模式 g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, //哪张显卡的显示模式 &d3ddm); //获取到的显示模式的存储位置 //4、创建D3D的设备指针 D3DPRESENT_PARAMETERS d3dpp; //描述D3D设备的能力 ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.BackBufferCount = 1; //后台缓冲区的个数(双缓冲技术) //-----窗口模式的写发----- d3dpp.Windowed = TRUE; //当前窗口是否为"窗口模式" ////-----全屏模式的写发----- //d3dpp.Windowed = FALSE; //d3dpp.BackBufferWidth = d3ddm.Width; //d3dpp.BackBufferHeight = d3ddm.Height; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //翻转效果:抛弃 //创建设备指针 g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, //默认显卡 D3DDEVTYPE_HAL, //硬件抽象层 g_hWnd, //所依附的窗口(要改造的窗口) D3DCREATE_SOFTWARE_VERTEXPROCESSING, //顶点软件处理模式 &d3dpp, //设备的能力 &g_pDevice //返回的设备指针 ); //5、创建精灵指针 D3DXCreateSprite( g_pDevice, //设备指针 &g_pSprite); //返回的精灵指针 } VOID onLogic(float fElapsedTime) { } VOID onRender(float fElapsedTime) { g_pDevice->Clear( 0, //清空矩形的数量 nullptr, //清空矩形的临接信息 D3DCLEAR_TARGET, //要清空颜色缓冲区 D3DCOLOR_XRGB(102,204,255), //清成什么颜色 由于我喜欢洛天依,我每次都清成天依蓝 1.0f, //深度缓冲区的初始值 0 //模板缓冲区的初始值 ); g_pDevice->BeginScene(); //获取绘制权限 //--------------------------------------- // 渲染代码 //--------------------------------------- g_pDevice->EndScene(); //结束绘制 //前后台缓冲区交换的"源动力" g_pDevice->Present(nullptr, nullptr, 0, nullptr); } VOID onDestroy() { Safe_Release(g_pSprite); Safe_Release(g_pDevice); Safe_Release(g_pD3D); } INT WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd ) { WNDCLASS wc; ZeroMemory(&wc,sizeof(wc)); wc.cbClsExtra = NULL; wc.cbWndExtra = NULL; wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); wc.hCursor = LoadCursor(0,IDC_ARROW); wc.hIcon = LoadIcon(0,IDI_APPLICATION); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = TEXT("Alibaba"); wc.lpszMenuName = NULL; wc.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wc); g_hWnd = CreateWindow(wc.lpszClassName, TEXT("Linimass"),WS_OVERLAPPEDWINDOW, 50,20,800,600,NULL,NULL,hInstance,NULL); if(g_hWnd) { g_hInstance = hInstance; onInit(); ShowWindow(g_hWnd,SW_SHOWNORMAL); UpdateWindow(g_hWnd); } MSG msg; ZeroMemory(&msg,sizeof(msg)); while ( msg.message!=WM_QUIT) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { static DWORD dwTime = timeGetTime(); DWORD dwCurrentTime = timeGetTime(); DWORD dwElapsedTime = dwCurrentTime - dwTime; float fElapsedTime = dwElapsedTime * 0.001f; onLogic(fElapsedTime); onRender(fElapsedTime); if (dwElapsedTime < 1000 / 60) Sleep(1000 / 60 - dwElapsedTime); dwTime = dwCurrentTime; } } onDestroy(); UnregisterClass(wc.lpszClassName, hInstance); return 0; } LRESULT CALLBACK WndProc(HWND hWnd ,UINT uMsg, WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_KEYDOWN: if(wParam == VK_ESCAPE) DestroyWindow(hWnd); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hWnd,uMsg,wParam,lParam); }
但是,问题来了,如果你按照我的代码写,甚至是把整个代码复制进去,运行的时候还是会有错的,如果你用的是高版本的visual stdio的话,估计在导入d3dx9.h的时候就会有一个红色的波浪线挥之不去,为什么呢,当然是没有安装directx的SDK啊,安装完directx 的SDK 并且把他导入VS里就可以了,具体步骤如下:
1.安装SDK
下载SDK,双击,然后一路下一步,然后直到安装完成
2.在VS中导入库和包含文件
打开vs 然后在你的项目上右击属性,会进入属性界面,左侧点击VC++目录,如图,
在包含文件和库文件位置分别作相应设置,首先是包含文件,点击向下小箭头,然后再点编辑,会出现如下界面
点击上方新建文件夹那个黄黄的图标,地下框里会出现一行可编辑区域,右侧有一个方框里面有三个点,就点那个方框然后选择directx所在位置,默认情况下
64位所在位置:C:\Program Files (x86)\Microsoft DirectX SDK (June 2008)\Include
32位所在位置:C:\Program Files \Microsoft DirectX SDK (June 2008)\Include
把Include这个文件夹包含进来就可以了,
库文件相同道理,库文件所在位置
64位系统所在位置:C:\Program Files (x86)\Microsoft DirectX SDK (June 2008)\Lib\x86
32位系统所在位置:C:\Program Files \Microsoft DirectX SDK (June 2008)\Lib\x86
然后确定确定,大功告成,然后你就会发现d3dx9.h下面那个阴魂不散的小红波浪线没有了,但是,在一些个别情况,还有这样的错误
1>c:\program files (x86)\windows kits\8.1\include\um\propidl.h(1304): error C2061: 语法错误: 标识符“__RPC__inout_xcount”
1>c:\program files (x86)\windows kits\8.1\include\um\propidl.h(1305): error C2061: 语法错误: 标识符“__RPC__in_xcount”
没错,就是这货,可讨厌了,这个问题怎么解决呢
好办,首先,让我们打开刚才包含文件那个名叫Include的文件夹,然后在里面找到名为rpcsal.h的文件,打开它,然后随便找个合适的位置输入以下几行代码:
在Rpcsal.h中添加cxyc预编译指令
#define __RPC__out_xcount_part(size,length)
#define __RPC__in_xcount(size)
#define __RPC__in_xcount_full(size)
#define __RPC__in_range(min,max)
#define __RPC__inout_xcount(size)
然后保存,如果系统说你没有权限,那你就先另存为到桌面上,然后复制进去,替换就好,这回可是真真的没有问题了
运行结果如下
对,就是一个窗口,看起来,跟原版windows窗口只有颜色不一样,然而,除此之外,这个窗口是3D的,可以渲染3D图形。
总之,这篇博客上的direct的内容很基础,我之后还会再写一篇关于direct的文章,也很基础,逻辑上很简单,但是要记忆的东西比较多
相关文章推荐
- 《笨方法学python》-3
- 在C#中调用C++写的DLL
- 专为设计师而写的GitHub快速入门教程
- 打印python的堆栈stack
- 编写高质量代码改善C#程序的157个建议——建议15: 使用dynamic来简化反射实现
- 构建施耐德楼控系统数据库后台服务器示例工程五(JAVA动态生成类)
- Qt中怎样把TXT文件中的数读入数组中
- Mac下添加java环境变量
- php 中关于静态的继承
- java 随机数 模拟双色球开奖
- 基于phpExcel写的excel类(导出为Excel)
- maven 项目出现 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
- 使用JDK提供的MD5算法对字符串进行加密
- django用户登录和注销
- c++,为什么要引入虚拟继承
- c#学习之双冒泡运算符
- How to Change the Size of a Box-Plot Label in MATLAB
- 大数据全栈式开发语言 – Python
- Producible Media Types
- Java第二十天