(DirectX编程)修改和调试Allen Sherrod的程序真让我头疼
2010-09-27 23:20
393 查看
Preface:最近花时间在自己的课程设计的程序上了,所以一直没有在CSDN上露面。而自己剩余的时间用在了DirectX编程上了。大家看过了我最近上传的GIF动态图片吗?这些就是我最近进行的DirectX学习的成果。没有看过的请看:
当然了,我现在还是看《Ultimate Game Programming with DirextX》这本书。这本书的作者是Allen Sherrod。作者现在28岁,相当的年轻。他有个网站:www.UltimateGrameProgramming.com。但是我不管怎样都无法访问这个网站。
现在我看了这本书,发现了不少的错误。这本书的封面如图所示。
这里的源程序出现了很多很多的错误,真的让我头疼。最简单的错误如下所示:
缺少#pragma comment(lib, "d3dx9.lib")这个连接动作,
然后大概很多人编译程序成功后都会遇到这样一个未知的错误,就是程序无法运行。确切地说,每当点运行的时候,窗口一闪而过,然后就没有动静了。这常常让人摸不着头脑。其实,懂得使用VC的人应该觉得这件事很简单就能够解决,因为从VC6.0到VS2005,都有debug(调试)的模块。我使用的是VS2005中文版,操作起来比较好用。当定位到程序某条语句的时候,就知道是这条语句出了错误了。Allen Sherrod的程序大多数都是这么写的。
Code:
// Create the D3DDevice
if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hwnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,
&d3dpp, &g_D3DDevice))) return false;
其实在这里我查了很多有关D3DCREATE_HARDWARE_VERTEXPROCESSING和D3DCREATE_SOFTWARE_VERTEXPROCESSING的资料,得出的结论是大多数笔记本电脑都不支持D3DCREATE_HARDWARE_VERTEXPROCESSING(我和同学们的都是这样的)。所以我们必须将D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE改为D3DCREATE_SOFTWARE_VERTEXPROCESSING,连 D3DCREATE_PUREDEVICE都不能要。
接下来我就要介绍自己怎样debug难缠的程序:第十章的DirectInput演示程序。
首先,程序乍一看能够编译连接成功,但是仍然出现窗口一闪的情况,是上述的问题那么简单吗?不。虽然该项目也有上述问题。但是修改HARDWARE为SOFTWARE后,仍然出现了这样的错误。这究竟是怎么回事呢?当我调查main.cpp文件时,发现了这里的错误:
Code:
bool InitializeObjects()
{
// Initialize input.
if(!input.Initialize(g_hwnd, g_hInstance)) //请注意是这里失败了
return false;
那么单击右键,转到定义。这里就是错误之源。这时可以把断点设在这里:
然后进行调试。调试能找出错误,但并不能完全地解决错误。我为了解决错误,甚至到国外的论坛上取经呢。
先把这个代码贴出来,然后我们一个个分析。
Code:
bool CDirectInputSystem::Initialize(HWND hwnd, HINSTANCE hInstance, bool mouseExclusive)
{
// Save copies.
m_hwnd = hwnd;
gThis = this;
// Create input system.
if(FAILED(DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void **)&m_InputSystem, NULL))) return false;
//这里出错,DIRECTINPUT_VERSION在DirectInput中的确被定义了,但是没有值,也就是说,这里传的是一个空值,当然这是不允许的了,会return false。
// Initialize the keyboard.
if(FAILED(m_InputSystem->CreateDevice(GUID_SysKeyboard, &m_Keyboard, NULL)))
return false;
if(FAILED(m_Keyboard->SetDataFormat(&c_dfDIKeyboard))) return false;
if(FAILED(m_Keyboard->SetCooperativeLevel(m_hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
return false;
/*if(FAILED(m_Keyboard->Acquire())) //这里出错,因为在DirectInput中它是被声明为虚函数的,没有函数的运行,返回的当然是失败了。
{
MessageBox(NULL,"在调用Acquire函数的时候发生了错误,可能没有Acquire成员函数。","系统提示错误。",NULL);
system("pause");
return false;
}*/
// Clear keys will clear out the array of keys we have.
memset(m_Keys, 0, sizeof(m_Keys));
// Initialize the Mouse.
DWORD flags;
if(FAILED(m_InputSystem->CreateDevice(GUID_SysMouse, &m_Mouse, NULL))) return false;
if(FAILED(m_Mouse->SetDataFormat(&c_dfDIMouse))) return false;
if(mouseExclusive) flags = DISCL_FOREGROUND | DISCL_EXCLUSIVE | DISCL_NOWINKEY;
else flags = DISCL_FOREGROUND | DISCL_NONEXCLUSIVE;
if(FAILED(m_Mouse->SetCooperativeLevel(m_hwnd, flags))) return false;
/*这里出错,因为在DirectInput中它是被声明为虚函数的,没有函数的运行,返回的当然是失败了。
if(FAILED(m_Mouse->Acquire())) return false;
*/
// Initialize the game controller.
DIPROPRANGE range;
DIDEVCAPS caps;
m_InputSystem->EnumDevices(DI8DEVCLASS_GAMECTRL, (LPDIENUMDEVICESCALLBACK)gJSEnumDeviceCallBack,
NULL, DIEDFL_ATTACHEDONLY);
//if(!m_controllerFound) return false;
range.diph.dwSize = sizeof(DIPROPRANGE);
range.diph.dwHeaderSize = sizeof(DIPROPHEADER);
range.diph.dwHow = DIPH_BYOFFSET;
range.lMin = -1000;
range.lMax = 1000;
range.diph.dwObj = DIJOFS_X;
/*这里出错,m_GameControl没有赋初值,所以以一个空值去调用成员函数,会出错。*/
//m_GameControl->SetProperty(DIPROP_RANGE, &range.diph);
range.diph.dwObj = DIJOFS_Y;
/*这里出错,m_GameControl没有赋初值,所以以一个空值去调用成员函数,会出错。*/
//m_GameControl->SetProperty(DIPROP_RANGE, &range.diph);
/*这里出错,m_GameControl没有赋初值,所以以一个空值去调用成员函数,会出错。*/
//if(SUCCEEDED(m_GameControl->GetCapabilities(&caps))) m_numButtons = caps.dwButtons;
/*else*/ m_numButtons = 4;
return true;
}
在这里解释一下。我上网查了相关资料,说DIRECTINPUT_VERSION未被定义为某值,而且编译的时候会出现
1>C:/Program Files/Microsoft DirectX SDK (February 2010)/Include/dinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800
这个问题,所以按照GameDev网站上的解决方法(请访问http://www.gamedev.net/community/forums/topic.asp?topic_id=116163),在头文件定义的时候(这里是指CDirectInput.h文件头)加一条语句:#define DIRECTINPUT_VERSION 0x0800,编译时的信息就没有了。而其它的问题,我也查了相关的资料,可惜的是,由于才疏学浅(具体的是,我无法为虚函数写出实例函数),我无法解决问题,所以就索性地注释掉了。
结果还不错,程序能够运行,并没有什么缺胳膊少腿,程序运行如图所示:
Post script:太好了,自己终于debug程序成功了。有时候debug成功别人的程序也是一件有成就的事,大家是不是这么认为的呢?
当然了,我现在还是看《Ultimate Game Programming with DirextX》这本书。这本书的作者是Allen Sherrod。作者现在28岁,相当的年轻。他有个网站:www.UltimateGrameProgramming.com。但是我不管怎样都无法访问这个网站。
现在我看了这本书,发现了不少的错误。这本书的封面如图所示。
这里的源程序出现了很多很多的错误,真的让我头疼。最简单的错误如下所示:
缺少#pragma comment(lib, "d3dx9.lib")这个连接动作,
然后大概很多人编译程序成功后都会遇到这样一个未知的错误,就是程序无法运行。确切地说,每当点运行的时候,窗口一闪而过,然后就没有动静了。这常常让人摸不着头脑。其实,懂得使用VC的人应该觉得这件事很简单就能够解决,因为从VC6.0到VS2005,都有debug(调试)的模块。我使用的是VS2005中文版,操作起来比较好用。当定位到程序某条语句的时候,就知道是这条语句出了错误了。Allen Sherrod的程序大多数都是这么写的。
Code:
// Create the D3DDevice
if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hwnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,
&d3dpp, &g_D3DDevice))) return false;
其实在这里我查了很多有关D3DCREATE_HARDWARE_VERTEXPROCESSING和D3DCREATE_SOFTWARE_VERTEXPROCESSING的资料,得出的结论是大多数笔记本电脑都不支持D3DCREATE_HARDWARE_VERTEXPROCESSING(我和同学们的都是这样的)。所以我们必须将D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE改为D3DCREATE_SOFTWARE_VERTEXPROCESSING,连 D3DCREATE_PUREDEVICE都不能要。
接下来我就要介绍自己怎样debug难缠的程序:第十章的DirectInput演示程序。
首先,程序乍一看能够编译连接成功,但是仍然出现窗口一闪的情况,是上述的问题那么简单吗?不。虽然该项目也有上述问题。但是修改HARDWARE为SOFTWARE后,仍然出现了这样的错误。这究竟是怎么回事呢?当我调查main.cpp文件时,发现了这里的错误:
Code:
bool InitializeObjects()
{
// Initialize input.
if(!input.Initialize(g_hwnd, g_hInstance)) //请注意是这里失败了
return false;
那么单击右键,转到定义。这里就是错误之源。这时可以把断点设在这里:
然后进行调试。调试能找出错误,但并不能完全地解决错误。我为了解决错误,甚至到国外的论坛上取经呢。
先把这个代码贴出来,然后我们一个个分析。
Code:
bool CDirectInputSystem::Initialize(HWND hwnd, HINSTANCE hInstance, bool mouseExclusive)
{
// Save copies.
m_hwnd = hwnd;
gThis = this;
// Create input system.
if(FAILED(DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void **)&m_InputSystem, NULL))) return false;
//这里出错,DIRECTINPUT_VERSION在DirectInput中的确被定义了,但是没有值,也就是说,这里传的是一个空值,当然这是不允许的了,会return false。
// Initialize the keyboard.
if(FAILED(m_InputSystem->CreateDevice(GUID_SysKeyboard, &m_Keyboard, NULL)))
return false;
if(FAILED(m_Keyboard->SetDataFormat(&c_dfDIKeyboard))) return false;
if(FAILED(m_Keyboard->SetCooperativeLevel(m_hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
return false;
/*if(FAILED(m_Keyboard->Acquire())) //这里出错,因为在DirectInput中它是被声明为虚函数的,没有函数的运行,返回的当然是失败了。
{
MessageBox(NULL,"在调用Acquire函数的时候发生了错误,可能没有Acquire成员函数。","系统提示错误。",NULL);
system("pause");
return false;
}*/
// Clear keys will clear out the array of keys we have.
memset(m_Keys, 0, sizeof(m_Keys));
// Initialize the Mouse.
DWORD flags;
if(FAILED(m_InputSystem->CreateDevice(GUID_SysMouse, &m_Mouse, NULL))) return false;
if(FAILED(m_Mouse->SetDataFormat(&c_dfDIMouse))) return false;
if(mouseExclusive) flags = DISCL_FOREGROUND | DISCL_EXCLUSIVE | DISCL_NOWINKEY;
else flags = DISCL_FOREGROUND | DISCL_NONEXCLUSIVE;
if(FAILED(m_Mouse->SetCooperativeLevel(m_hwnd, flags))) return false;
/*这里出错,因为在DirectInput中它是被声明为虚函数的,没有函数的运行,返回的当然是失败了。
if(FAILED(m_Mouse->Acquire())) return false;
*/
// Initialize the game controller.
DIPROPRANGE range;
DIDEVCAPS caps;
m_InputSystem->EnumDevices(DI8DEVCLASS_GAMECTRL, (LPDIENUMDEVICESCALLBACK)gJSEnumDeviceCallBack,
NULL, DIEDFL_ATTACHEDONLY);
//if(!m_controllerFound) return false;
range.diph.dwSize = sizeof(DIPROPRANGE);
range.diph.dwHeaderSize = sizeof(DIPROPHEADER);
range.diph.dwHow = DIPH_BYOFFSET;
range.lMin = -1000;
range.lMax = 1000;
range.diph.dwObj = DIJOFS_X;
/*这里出错,m_GameControl没有赋初值,所以以一个空值去调用成员函数,会出错。*/
//m_GameControl->SetProperty(DIPROP_RANGE, &range.diph);
range.diph.dwObj = DIJOFS_Y;
/*这里出错,m_GameControl没有赋初值,所以以一个空值去调用成员函数,会出错。*/
//m_GameControl->SetProperty(DIPROP_RANGE, &range.diph);
/*这里出错,m_GameControl没有赋初值,所以以一个空值去调用成员函数,会出错。*/
//if(SUCCEEDED(m_GameControl->GetCapabilities(&caps))) m_numButtons = caps.dwButtons;
/*else*/ m_numButtons = 4;
return true;
}
在这里解释一下。我上网查了相关资料,说DIRECTINPUT_VERSION未被定义为某值,而且编译的时候会出现
1>C:/Program Files/Microsoft DirectX SDK (February 2010)/Include/dinput.h: DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800
这个问题,所以按照GameDev网站上的解决方法(请访问http://www.gamedev.net/community/forums/topic.asp?topic_id=116163),在头文件定义的时候(这里是指CDirectInput.h文件头)加一条语句:#define DIRECTINPUT_VERSION 0x0800,编译时的信息就没有了。而其它的问题,我也查了相关的资料,可惜的是,由于才疏学浅(具体的是,我无法为虚函数写出实例函数),我无法解决问题,所以就索性地注释掉了。
结果还不错,程序能够运行,并没有什么缺胳膊少腿,程序运行如图所示:
Post script:太好了,自己终于debug程序成功了。有时候debug成功别人的程序也是一件有成就的事,大家是不是这么认为的呢?
相关文章推荐
- 页面03---练习调试篇(程序是修改出来,不是写出来的)
- OMAPL138/AM1808 修改调试串口为UART1后通过CCSV4下载程序的全过程(原创)
- OD调试篇6--对一些真正的小程序进行一点点的修改
- 解决调试asp.net程序时无法修改代码的问题(提示: 当调试器已经附加到已经运行的进程...)
- android加固系列—2.加固前先要学会破解,调试内存值修改程序走向
- windows下eclipse cdt 无法运行和调试程序,没有输出(调试和运行时不修改系统变量导入第三方dll库)
- 关于调试----在单步执行某个程序的中间修改源代码,当修改代码之后移动到下一步时,调试器自动在执行下一语句之前重新编译
- 《数据结构》链队列同学程序调试修改
- 内存调试,3天值吗 (默认程序调试器的修改)
- 解决在VS(winform)程序中无法在调试时修改代码的问题(也就是“编辑并继续”功能无效)
- 《数据结构》同学链表程序的调试修改代码示例(有代表性,请看看)
- 工作笔记-修改Iperf的Makefile文件编译出调试程序
- 调试mozilla程序需要修改的配置
- vs.net 2005中修改程序为可调试
- [RK3288][Android6.0] 调试笔记 --- 修改默认system/bin/下可执行程序权限
- 实验 8 数组2 1、程序调试,按照“分析结果、设置断点、使用单步执行并观察变量、分析变量结果、修改程序”五个阶段调试和改正程序;
- IDA附加调试apk程序,并修改内存,编写IDA脚本程序,把修改后的dex文件dump到本地
- 解决调试asp.net程序时无法修改代码的问题
- vs2010 修改程序代码,调试程序时,“当前不会命中断点,源代码与原始版本不同。” 的解决方案, 及vs调试时,不能修改源代码的解决方案。
- android加固系列—2.加固前先要学会破解,调试内存值修改程序走向