版本:VS2015 语言:C++
今天开始进入游戏开发最底层的Windows程序开发!
新翻开这本《Windows游戏编程大师技巧》,感觉真的是棒极了,恨不得十年之前就能学到这么好的书,可惜环境所迫啊。
一开始的时候作者给出了一个9页代码的小程序,仔细看了一下,虽然不是很懂windows程序,但大体的思路大概知道了,然后作者对读完本章的要求是能把这个游戏编译通过运行出来。
这本书确实很老了,使用的是VC++6.0的编程环境,还记得大学第一年打开VC那时候的神秘感……额,扯远了,总是现在除了大学里教师们教学还在用这个古董品外,大部分的window开发应该都已经到了VS了吧。
想着既然如此,为何不把游戏文件移植到VS上呢(才不告诉你我的VC++添加文件就挂)。
说干就干,周日的时候跟英文版的VS2013和VS2015较劲了半天,最终放弃了,还是用中文版的VS2015吧。
新建一个windows工程,默认配置就OK,删除多余的代码后,开始移植。首先导入作者写的DirectX——blackbox.h和blackbox.cpp,并把入口文件的中内容换成freakout.cpp中的内容,注意如果只有blackbox的两个文件,会报一个奇怪的错误:
因为backbox的main_window_handle是链接外部的一个变量,如果freakout的内容没有导入,则没有这个变量的定义。
接着有一个非常常见的错误:
就像想把const char*转换成LPCWSTR失败,网上查找了一下,大概有这么几种方案来解决这个问题:
1.使用TEXT或_T
2.将项目属性——配置属性——常规——项目默认值——字符集使用未设置就OK
3.(LPCWSTR)强制转换,以上不行的可以使用这种方式
这样就OK了,第二个是需要强制转换的,大家看一下:
winclass.lpszClassName = TEXT(WINDOW_CLASS_NAME);
TextOut(xdc, x, y, (LPCWSTR)text, strlen(text));
此时编译的话仍会有一堆错误和警告,首先将头文件包含给解决了,把所有包含的头文件都放到stdafx.h中,然后由blackbox.cpp包含stdafx.h。搞定之后跳过包含的警告就没了。
第二比较常见的错误是这个:
这个是有了函数的声明,但没有lib包提供函数的实现,解决方法就是,在链接器——输入——附加依赖中添加draw.lib,这个就是传说中的D3D的lib了。需要注意的是,这边直接包含是会使用VS中内置的包,最好是把书中提供的包导入到工程中:
VS目录中添加自己需要包含的目录,就OK了。注意在这边还要在stdafx.h中添加这一句,让下面的包能够使用:
#pragma comment(lib, "dxguid")
最后有这么一个问题,sprintf的:
一堆英文,意思就是这玩意不安全,你最好改了,如果你不想改的话,请使用命令不让提醒生效。
命令是/D _CRT_SECURE_NO_WARNINGS ,在C/C++——命令行中添加。
能够运行了!虽然看起来并不是很完美,但是也算是完成第一章的任务了:
总结(网上摘抄一句):
1.添加头文件:C/C++——常规——附加包含目录
2.添加文件lib静态路径:链接器——常规——附加库目录
3.添加lib文件名:链接器——输入——附加依赖项
4.dll动态库:直接放到可执行目录
基本的错误都是引入的问题,掌握了上面的方法就离熟悉VS环境又更近一步了。
最后的最后,直接在论坛上复制lzj891013的话:
1.可执行文件目录:搜索可执行文件时使用的路径。与环境变量PATH相对应。
2.包含目录:搜索包含文件时使用的路径。与INCLUDE相对应;
3.引用目录:搜索通过#Using引入的文件时使用的路径。与环境变量LIBPATH相对应;
4.库目录:搜素库文件时使用的路径。与环境变量LIB相对应。
这样看来基本上只会使用到附加包含目录,嗯,现在清晰多了。明天开始正式进入windows编程!(哈,还是想写一句,这几天赶工作,各种BUG,真想哭啊。。。)