x01.Game.Main: 从零开始
一切从零开始,一切皆有可能。
浅墨,90后,《逐梦之旅》深入浅出,堪比大师。
1.安装 DXSDK_June10.exe 或更新版本。
2.运行 vs2012,新建 VC Win32 空项目 x01.Game.Main。
3.在项目属性 Directory 中添加 SDK 中的 Include 和 Lib\X86。在链接 Input 中添加相关依赖项如:d3d9.lib;d3dx9.lib; 等。
4.添加源文件 Main.cpp,内容如下:
// Main.cpp (2013.11.18 by x01)
//
// 1.安装 DirectX SDK 后,需在项目属性 Directory 中分别导入 SDK 中的 Include 和 Lib\X86。
// 2.在链接 Input 中添加相关依赖项: d3d9.lib; d3dx9.lib; #include <Windows.h>
#include <d3d9.h> #define RELEASE(p) if ((p) != NULL) { (p)->Release(); (p) = NULL; } const int ScreenWidth = ;
const int ScreenHeight = ; LPDIRECT3D9 g_D3D = NULL;
LPDIRECT3DDEVICE9 g_Device = NULL; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
bool InitD3D(HWND hwnd, bool isFullScreen);
void GameRender();
void GameClear(); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR cmdLine, int cmdShow)
{
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, , , hInstance, NULL, NULL, NULL, NULL,
L"x01GameMainClass", NULL };
RegisterClassEx(&wc); HWND hwnd = CreateWindow(L"x01GameMainClass", L"x01 Game", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, ScreenWidth, ScreenHeight, NULL, NULL, hInstance, NULL); UnregisterClass(wc.lpszClassName, wc.hInstance); if (!InitD3D(hwnd, false))
{
return ;
} ShowWindow(hwnd, SW_SHOWDEFAULT);
UpdateWindow(hwnd); MSG msg;
ZeroMemory(&msg, sizeof(msg)); while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, , , PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
GameRender();
}
} GameClear(); return ;
} LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage();
break;
case WM_KEYUP:
if (wParam == VK_ESCAPE)
{
PostQuitMessage();
}
break;
default:
break;
} return DefWindowProc(hwnd, message, wParam, lParam);
} bool InitD3D(HWND hwnd, bool isFullScreen)
{
g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
if (g_D3D == NULL)
{
MessageBox(hwnd, L"Create D3d failed.", L"Error", MB_OK);
return false;
} D3DDISPLAYMODE displayMode;
if (FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
{
MessageBox(hwnd, L"Get Adapter Display Mode Failed.", L"Error", MB_OK); return false;
} D3DPRESENT_PARAMETERS pp;
ZeroMemory(&pp, sizeof(pp)); if (isFullScreen)
{
pp.Windowed = false;
pp.BackBufferWidth = ScreenWidth;
pp.BackBufferHeight = ScreenHeight;
}
else
{
pp.Windowed = true;
} pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
pp.BackBufferFormat = displayMode.Format; if (FAILED(g_D3D->CreateDevice(
D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,&pp,&g_Device) ))
{
MessageBox(hwnd, L"Create Device Failed.", L"Error", MB_OK); return false;
} return true;
} void GameRender()
{
g_Device->Clear(, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(,,), 1.0f, );
g_Device->BeginScene();
g_Device->EndScene();
g_Device->Present(NULL, NULL, NULL, NULL);
} void GameClear()
{
RELEASE(g_Device);
RELEASE(g_D3D);
}
Main.cp
5.按 F5 调试运行,效果图如下:

该程序是对浅墨的高度模仿,但这并不妨碍我们学习。博客不仅是为了分享,更是对自己的一种总结。
以上项目可作为模板保存。什么时候需要新建项目,可将该模板简单 复制 重命名 即可。
x01.Game.Main: 从零开始的更多相关文章
- Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
学习架构探险,从零开始写Java Web框架时,在学习到springAOP时遇到一个异常: "C:\Program Files\Java\jdk1.7.0_40\bin\java" ...
- 从零开始编写自己的C#框架(20)——框架异常处理及日志记录
最近很忙,杂事也多,所以开发本框架也是断断续续的,终于在前两天将前面设定的功能都基本完成了,剩下一些小功能遗漏的以后发现再补上.接下来的章节主要都是讲解在本框架的基础上进行开发的小巧. 本框架主要有四 ...
- 从零开始编写自己的C#框架(17)——Web层后端首页
后端首页是管理员登陆后进入的第一个页面,主要是显示当前登陆用户信息.在线人数.菜单树列表.相关功能按键和系统介绍.让管理员能更方便的找到息想要的内容. 根据不同系统的需要,首页会显示不同的内容,比如显 ...
- x01.CodeBuilder: 生成代码框架
根据 Assembly 生成代码框架. 这是学习 AvalonEdit 的一个副产品.学习时,照着源代码新建文件夹,新建文件,添加方法与属性,虽然只是个框架,也要花费大量时间.为什么不让它自动生成呢? ...
- 从零开始学 Java - 利用 Nginx 负载均衡实现 Web 服务器更新不影响访问
还记得那些美妙的夜晚吗 你洗洗打算看一个小电影就睡了,这个时候突然想起来今天晚上是服务器更新的日子,你要在凌晨时分去把最新的代码更新到服务器,以保证明天大家一觉醒来打开网站,发现昨天的 Bug 都不见 ...
- x01.os.14: 时间都去哪儿了
时间都去哪儿了 老帕的“花儿为什么这样红”,三分钟引起六次欢呼,却败给了张碧晨.试想一下,如果是人气更高的陈冰,即使唱得和张碧晨一模一样,可能仍然不敌老帕,为什么张碧晨就能取胜呢?有这么个笑话:一人弹 ...
- x01.os.11: IPC 路线图
学习的最好方法就是看代码,所以我们不妨跟着 IPC 的调用路线图,来学习学习 IPC. 从 x01.Lab.Download 下载代码后,首先进入 main.c 文件,在 TestA 中,有这么一句: ...
- x01.os.9: 进程切换
进入内核后,当然不能无所事事.先创建三个进程,分别打印 A,B,C.虽然只是简单的打印,但却是一切扩展的基础,不可等闲视之. 进程切换,涉及一系列的寄存器需要保护,于是,就有了 ProcessStac ...
- x01.Lab.OpenCV: 计算机视觉
横看成岭侧成峰,计算视觉大不同.观看的角度不同,成像自然不同,这对计算机视觉来说,是个大麻烦.但计算机视觉应用如此广泛,却又有不得不研究的理由.指纹机大家都用过吧,这不过是冰山之一角.产品检测,机器人 ...
随机推荐
- [javaSE] 反射-获取类的成员属性和构造方法
成员属性和构造方法皆为对象,通过Class对象的方法可以得到 package com.tsh.reflect; import java.lang.reflect.Constructor; import ...
- FilterDispatcher已被标注为过时解决办法 >>> FilterDispatcher <<< is deprecated!
一些struts2的教程都是比较早的,当我们基于较新版本的struts2来实现代码的时候,往往会出现一些问题.比如这个警告:FilterDispatcher isdeprecated! 在web.xm ...
- jinfo命令的使用
jinfo命令 该命令可以打印出java进程的配置信息:包括jvm参数,系统属性等用法: jinfo [ option ] pid jinfo [ option ] executable core j ...
- 解析XML
1.解析String类型的XML字符串得到属性值 String resultXML = "<?xml version="1.0" encoding="U ...
- asp.net mvc4 使用 System.Web.Optimization 对javascript和style的引入、代码合并和压缩的优化(ScriptBundle,StyleBundle,Bundling and Minification )
Bundling and Minification两个单词对今天的内容有个比较好的总结. 问题所在 一. 在asp.net包括mvc项目中,引入js和css也许有人认为是个很容易和很简单操作的事情,v ...
- 如何订阅Form的自定义事件
Window Form类有很多的属性/方法和事件,其中事件属于一种发布订阅模式 .订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主体对象.这个主体对象在自身状态变化时,会通知所 ...
- Google Web Designer – 创建引人入胜的 HTML5 网站
Google Web Designer 可以帮助你创建引人入胜,互动的基于 HTML5 的设计和动画,可以在任何设备上运行.如果你喜欢自己动手,设计背后的所有的代码都是可以手工编辑的. 虽然可视化工具 ...
- Cool!15个创意的 CSS3 文本效果【下篇】
这里文章收集了15个创意的 CSS3 文本效果,所有的都是精心挑选,这些可能会增加创意的火花到你的下一个项目.其中有些是用于特定用途,而另一些则适用于多种用途.如果你想要一个精彩而又充满色彩的文字效果 ...
- MySQL的常规操作
MySQL的常规知识 show 查看数据库 show databases; 查看表 存在的所有表 show tables; 创建表的命令 show create table table_name; 表 ...
- [deviceone开发]-一个很炫的手势动画示例
一.简介 这是iOS下的效果,android下完全一致.通过do_GestureView组件和do_Animation组件,deviceone能很容易实现复杂的跨平台纯原生动画效果,这个示例就是通过手 ...