(DirectX编程)修改和调试Allen Sherrod的程序真让我头疼

Preface:最近花时间在自己的课程设计的程序上了,所以一直没有在优快云上露面。而自己剩余的时间用在了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:
  1. //CreatetheD3DDevice
  2. if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_hwnd,
  3. D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_PUREDEVICE,
  4. &d3dpp,&g_D3DDevice)))returnfalse;

其实在这里我查了很多有关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:
  1. boolInitializeObjects()
  2. {
  3. //Initializeinput.
  4. if(!input.Initialize(g_hwnd,g_hInstance))//请注意是这里失败了
  5. returnfalse;

那么单击右键,转到定义。这里就是错误之源。这时可以把断点设在这里:

然后进行调试。调试能找出错误,但并不能完全地解决错误。我为了解决错误,甚至到国外的论坛上取经呢。

先把这个代码贴出来,然后我们一个个分析。

Code:
  1. boolCDirectInputSystem::Initialize(HWNDhwnd,HINSTANCEhInstance,boolmouseExclusive)
  2. {
  3. //Savecopies.
  4. m_hwnd=hwnd;
  5. gThis=this;
  6. //Createinputsystem.
  7. if(FAILED(DirectInput8Create(hInstance,DIRECTINPUT_VERSION,IID_IDirectInput8,(void**)&m_InputSystem,NULL)))returnfalse;
  8. //这里出错,DIRECTINPUT_VERSION在DirectInput中的确被定义了,但是没有值,也就是说,这里传的是一个空值,当然这是不允许的了,会returnfalse。
  9. //Initializethekeyboard.
  10. if(FAILED(m_InputSystem->CreateDevice(GUID_SysKeyboard,&m_Keyboard,NULL)))
  11. returnfalse;
  12. if(FAILED(m_Keyboard->SetDataFormat(&c_dfDIKeyboard)))returnfalse;
  13. if(FAILED(m_Keyboard->SetCooperativeLevel(m_hwnd,DISCL_FOREGROUND|DISCL_NONEXCLUSIVE)))
  14. returnfalse;
  15. /*if(FAILED(m_Keyboard->Acquire()))//这里出错,因为在DirectInput中它是被声明为虚函数的,没有函数的运行,返回的当然是失败了。
  16. {
  17. MessageBox(NULL,"在调用Acquire函数的时候发生了错误,可能没有Acquire成员函数。","系统提示错误。",NULL);
  18. system("pause");
  19. returnfalse;
  20. }*/
  21. //Clearkeyswillclearoutthearrayofkeyswehave.
  22. memset(m_Keys,0,sizeof(m_Keys));
  23. //InitializetheMouse.
  24. DWORDflags;
  25. if(FAILED(m_InputSystem->CreateDevice(GUID_SysMouse,&m_Mouse,NULL)))returnfalse;
  26. if(FAILED(m_Mouse->SetDataFormat(&c_dfDIMouse)))returnfalse;
  27. if(mouseExclusive)flags=DISCL_FOREGROUND|DISCL_EXCLUSIVE|DISCL_NOWINKEY;
  28. elseflags=DISCL_FOREGROUND|DISCL_NONEXCLUSIVE;
  29. if(FAILED(m_Mouse->SetCooperativeLevel(m_hwnd,flags)))returnfalse;
  30. /*这里出错,因为在DirectInput中它是被声明为虚函数的,没有函数的运行,返回的当然是失败了。
  31. if(FAILED(m_Mouse->Acquire()))returnfalse;
  32. */
  33. //Initializethegamecontroller.
  34. DIPROPRANGErange;
  35. DIDEVCAPScaps;
  36. m_InputSystem->EnumDevices(DI8DEVCLASS_GAMECTRL,(LPDIENUMDEVICESCALLBACK)gJSEnumDeviceCallBack,
  37. NULL,DIEDFL_ATTACHEDONLY);
  38. //if(!m_controllerFound)returnfalse;
  39. range.diph.dwSize=sizeof(DIPROPRANGE);
  40. range.diph.dwHeaderSize=sizeof(DIPROPHEADER);
  41. range.diph.dwHow=DIPH_BYOFFSET;
  42. range.lMin=-1000;
  43. range.lMax=1000;
  44. range.diph.dwObj=DIJOFS_X;
  45. /*这里出错,m_GameControl没有赋初值,所以以一个空值去调用成员函数,会出错。*/
  46. //m_GameControl->SetProperty(DIPROP_RANGE,&range.diph);
  47. range.diph.dwObj=DIJOFS_Y;
  48. /*这里出错,m_GameControl没有赋初值,所以以一个空值去调用成员函数,会出错。*/
  49. //m_GameControl->SetProperty(DIPROP_RANGE,&range.diph);
  50. /*这里出错,m_GameControl没有赋初值,所以以一个空值去调用成员函数,会出错。*/
  51. //if(SUCCEEDED(m_GameControl->GetCapabilities(&caps)))m_numButtons=caps.dwButtons;
  52. /*else*/m_numButtons=4;
  53. returntrue;
  54. }

在这里解释一下。我上网查了相关资料,说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成功别人的程序也是一件有成就的事,大家是不是这么认为的呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值