专栏导航
本节前言
对于本节所讲解的知识,有可能,你会需要时不时地参考本专栏之前的文章。真的遇到了需要参考之前的文章的知识点,请你自行查阅。
我呢,也会提到一部分的参考课节。但是呢,你不应该依赖于我的主动提及。最好呢,你自己能够多去了解和查看本专栏目录。
对于本节内容,你最好先去学习下述两篇文章的内容,然后再来学习本节。参考课节如下。
参考课节:开源项目介绍:VirtuaNES 模拟器
参考课节:VirtuaNES 模拟器的使用方法
本节,我们要来讲解,如何来下载和编译 VirtuaNES 模拟器源代码。
本节,我们需要用到的开发工具是 VS2010 。
我们开始。
一. 下载 VirtuaNES 模拟器源代码
下载 VirtuaNES 模拟器的源代码,可以在 CSDN 网站上进行。
你可以在 CSDN 首页的搜索框里搜索【VirtuaNES 源码】,我这里,有这样的几个词条。
图1
图2
图3
啊,可以搜索到的,包含源码下载的词条还是很多的。
你可以随便找一个,就可以下载的。
不过呢,你若是想要找一个,已经在 VS2010 里面,编译和调试好的,你可以下载下来以后,直接将项目导入到 VS2010 里面,来运行和调试的代码,那么,我推荐你使用我这里的一个代码仓库。
Gitee 代码仓库:VirtuaNES 模拟器源代码(使用 VS2010 编译通过)
如何从 Gitee 里面下载一个项目,你可以自己来研究。或者,你也可以参考本专栏的下述链接,来了解从 Gitee 网站中下载项目代码的方法。
参考课节:MFC笔记:本专栏课件
虽说,你可以使用我提供的,已经编译好了的项目,来调试和运行项目代码。不过呢,在本节,我们主要的任务,是让你在从 CSDN 里面,下载了相关的源代码以后,你可以自己使用 VS2010,来将其重新编译好。
在上面,我已经给你指出了,从 CSDN 里面下载源代码的方法。
不过呢,在本节,为了统一学习进度,我会把我收藏在网盘中的项目代码分享给你,并建议你从我的网盘分享文件中,下载项目代码。
等你学会了我的网盘分享文件的项目代码的编译方法以后,你可以再去尝试着编译来自 CSDN 的下载资源中的代码。
链接:https://pan.baidu.com/s/1BmqNW4mVqddW12JI_Q7MVQ
提取码:yhql
--来自百度网盘超级会员V4的分享
使用上述网盘链接,你会来到我的网盘的【水饺共享包】文件夹,进入里面,会看到下述东西。
图4
双击进入【FC 游戏】文件夹里面,结果如下。
图5
找到【模拟器项目源码】文件夹,双击进入这个文件夹。结果如下。
图6
图6 的两个红色框线,所框住的,都是 VirtuaNES 模拟器的源代码,两者,大体上应该是一样的吧。
左边的红色框线中的代码,应该就是我从 CSDN 下载的。而右边的红色框线所示的代码包,则是我从原作者的网站中下载的。
VirtuaNES 模拟器项目代码,应该是一个日本人开发的。因为,里面的好多的代码注释,都是用日语写的。本次,我们使用右边的红色框线所示的那个代码包。请将其下载下来,比如说下载到桌面,然后将其解压缩,然后呢,进入到解压缩之后的文件夹里面,结果如下图所示。
图7
这里面的内容还是很丰富的。
二. 编译 VirtuaNES 模拟器
接下来呢,我们打开 VS2010 软件。
打开了 VS2010 以后,请依次点选【文件】,【打开】,【项目/解决方案】菜单命令,过程如下面的几张截图所示。
图8
图9
图9 所示的对话框,为【打开项目】对话框。
请将打开项目对话框,浏览到图7 所示的路径中,也就是浏览到我们下载以后,解压好的代码文件夹之中。结果如下图所示。
图10
在图10 里面,没有【.sln】后缀的解决方案文件,但是它有【.dsw】后缀的文件,也就是红色框线所示的文件。我们单击选中红色框线所示的【VirtuaNES.dsw】文件,然后点击对话框右下角的【打开】按钮。
单击了【打开】按钮以后,VS2010 就会尝试着打开这一项目了。不过,VS2010 并未成功打开这一项目,而是会弹出下图所示的对话框。
图11
我的网盘中的源代码包,以及 CSDN 中的下载链接,大概都是用 VC++ 6.0 编译好的。而当今时代,使用 VC++ 6.0 的人,应该很少了吧。而使用 VS2010 的,应该还是有的。
用 VS2010 来打开 VC++ 6.0 的项目,会需要将 VC6 的项目格式,转换为 VS2010 的项目格式。不过,转换了以后,你就不能再用 VC6 来打开这个项目代码了。图11 中的提示信息,就是问你是否要进行这种转换。
我们单击选择图11 中的【是】按钮。这样一来,VS2010 就会尝试转换源码包中的 VC6 项目格式了,并在转换后打开它。
略微等一会儿吧。过一会儿,界面如下图所示。
图12
到了这里,我们就可以去尝试着编译项目了。
不过,在编译项目之前,我们还是先来做一个准备工作,那就是将【输出】窗口给拉高一些。
【输出】窗口,它是位于图12 的中间的下方的位置。相信你能够找到它的。找到它以后,将它给调的高一些。结果如下图所示。
图13
接下来呢,大家不见得非得和我的操作保持一致。
我的建议是,你先看一看我的整个的操作步骤。明白了以后,你再自己去操作。
接下来,我这里做的是,依次点选【生成】,【生成解决方案】菜单命令,结果如下。
图14
失败了。
为啥失败呢?
因为有几处代码是需要修改的,还有一个文件,是需要转换格式的。
接下来,我这里选择将鼠标放在输出窗口里面,然后通过让滚轮向上滚动,或者让输出窗口右侧的滚动条向上移动,以此让输出窗口中的信息缓慢地向下移动。
在挪动输出窗口中的信息的时候,我们需要重点查找【error】字样,查找编译中出错的地方。
我这里,查找到的第一个错误,如下图所示。
图15
我画红色框线的部分,是一条报错信息,我将报错信息摘录如下。
1>c:\users\administrator\desktop\virtuanessrc097\directdraw.cpp(1367): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
大意是,源代码中,使用的某个变量,没有明确地声明其类型。编译器不知道它想要使用什么数据类型,因此报错。编译器猜想,它可能要使用 int 类型,不过呢,C++ 不支持使用默认的数据类型,程序员必须要明确指定数据类型。
我们将鼠标光标移动到图15 中红色框线里面的 error 字样的区域中,然后双击。结果呢,VS2010 会打开错误代码的位置,如下图所示。
图16
【输出】窗口似乎被我给调的太高了,还是将其调低一些,结果如下。
图17
在图17 中,红色框线位置,圈出了一个 static 变量声明。这个变量声明中,的确是没有指定类型,我们将其指定为 int,如下图所示。
图18
这样一来,我们就处理掉了一个代码错误。然后呢,我们依次点选【生成】,【生成解决方案】菜单命令。结果呢,还是报错了。
我们再次将鼠标定位在【输出】窗口中,然后呢,通过让鼠标滚动向上滚动,或者让【输出】窗口右侧的滚动条缓慢向上移动,来让输出窗口中的信息缓慢向下运动。
在输出窗口中的信息移动的时候,我们重点关注【error】字样,以寻找报错信息。
这一次,我查到了下图所示的报错信息。
图19
图19 中,我所找到的几个报错信息,都是出现在同一个代码文件【joyaxisdlg.cpp】之中,且基本上都是由于使用了【i】这一未声明的标识符。我们将鼠标光标移动到红色框线所示位置的 error 文字区域中,然后双击。
双击之后,VS2010 会打开错误代码所在的代码文件,并定位到错误位置,结果如下。
图20
图20 的红色框线的位置,指示了变量 i 的位置。
我们再尝试着将鼠标滚动向上滚动,查看一下代码,查到了下述的代码。
图21
图20 中的变量 i 出现在 68 行,而图21 中的变量 i 出现在 60 行。
从图21 的 60 行号的代码来看,i 变量,其实是声明了的。
我猜,也许是说,在早期的编译器里面,for 语句的括号中,第一部分声明的东西,它的作用域,不仅仅是 for 循环体,而是说,for 循环体之后,也是可以使用 for 语句的括号中的第一部分所声明的变量的。
修改起来不难,我们只需要将图21 中的变量 i 的声明移到上一行就可以了,结果如下图所示。
图22
这样一来,我们就又解决了一个问题。
接下来呢,我们再次点选【生成】,【生成解决方案】菜单命令。结果呢,依然会报错。
我们再次将鼠标定位在【输出】窗口中,然后呢,通过让鼠标滚动向上滚动,或者让【输出】窗口右侧的滚动条缓慢向上移动,来让输出窗口中的信息缓慢向下运动。
在输出窗口中的信息移动的时候,我们重点关注【error】字样,以寻找报错信息。
这一次,我查到了下图所示的报错信息。
图23
又是【未声明的标识符】错误,且还是变量 i 的问题。不过,这次,是出在其它的 cpp 文件上。我们还是将鼠标指针移动到 error 字样的区域中,然后双击。然后呢,VS2010 会打开错误代码所在的文件以及错误位置,结果如下图所示。
图24
如图24 的左上角的红色框线所示,本次的错误代码所在的文件,为【MainFrame.cpp】代码文件。
最下方的红色框线,标出了变量 i 出现错误时的一个位置,是在代码行号 2828 行。而在图24 中,在行号 2826 行,中间的红色框线所标注的位置里,又一次出现了 for 语句的括号的第一部分,生命变量 i 的情况。对此问题的修改思路,与上一次的修改思路相同,修改结果如下图所示。
图25
到了这里,我们算是又一次处理了一个代码错误。
接下来呢,我们再次点选【生成】,【生成解决方案】菜单命令。结果呢,依然会报错。
我们再次将鼠标定位在【输出】窗口中,然后呢,通过让鼠标滚动向上滚动,或者让【输出】窗口右侧的滚动条缓慢向上移动,来让输出窗口中的信息缓慢向下运动。
在输出窗口中的信息移动的时候,我们重点关注【error】字样,以寻找报错信息。
这一次,我查到了下图所示的报错信息。
图26
唉,又是未声明的标识符。处理思路跟之前一样,双击【error】字样,让 VS2010 帮我们定位错误代码所在的文件与行号,结果如下图所示。
图27
本次错误代码所在的文件为图27 上方的红色框线所示的 MemoryView.cpp 。
错误代码的位置,我在图27 的下方的红色框线上标注出来了。
接下来,我们将鼠标滚轮向上滑动,找到如下位置。
图28
问题又是出在 for 语句的括号中第一部分的【INT i】。我们还是将声明挪到外面来,修改结果如下。
图29
接下来呢,我们再次点选【生成】,【生成解决方案】菜单命令。结果呢,依然会报错。
我们再次将鼠标定位在【输出】窗口中,然后呢,通过让鼠标滚动向上滚动,或者让【输出】窗口右侧的滚动条缓慢向上移动,来让输出窗口中的信息缓慢向下运动。
在输出窗口中的信息移动的时候,我们重点关注【error】字样,以寻找报错信息。
这一次,我查到了下图所示的报错信息。
图30
双击图30 中红色框线中的 error 字样,错误代码定位结果如下。
图31
我们依然是在错误代码文件中,将鼠标滚轮向上滑动,找到下图所示的代码。
图32
问题依然是出在 for 语句的括号中,第一部分的【INT i】上面。我们还是将声明挪到外面,修改结果如下。
图33
接下来呢,我们再次点选【生成】,【生成解决方案】菜单命令。结果呢,依然会报错。
我们再次将鼠标定位在【输出】窗口中,然后呢,通过让鼠标滚动向上滚动,或者让【输出】窗口右侧的滚动条缓慢向上移动,来让输出窗口中的信息缓慢向下运动。
在输出窗口中的信息移动的时候,我们重点关注【error】字样,以寻找报错信息。
这一次,我查到了下图所示的报错信息。
图34
双击 error 字样,错误代码定位结果如下。
图35
此处的错误,不是由于未声明的标识符。此处的错误代码,位于 Nes.cpp 中。错误代码行,使用了 C++ 标准模板库的语法,但是呢,这种用法不符合现如今的 C++ 标准模板库的使用方法。
错误代码行位于 NES::DelCheatCode 函数之中。我们将图35 中,用红色框线标注出来的错误代码行,替换为下图所示的代码。
图36
本次的修改,有点复杂。我们将修改之后的 NES::DelCheatCode 函数代码,放在下面的代码块中,以方便大家复制。
void NES::DelCheatCode( INT no )
{
if( m_CheatCode.size()-1 < no )
return;
int i = 0;
for (vector<CHEATCODE>::iterator it = m_CheatCode.begin(); it != m_CheatCode.end(); it++)
{
if (i==no)
{
m_CheatCode.erase(it);
break;
}
i++;
}
//m_CheatCode.erase( &m_CheatCode[no] );
}
在这里呢,C++ 标准模板库的用法,不知道你会不会用。我对于标准模板库还不太熟悉。
此处,我不想展开讨论标准模板库,本节,我只要求你照葫芦画瓢,能够把修改代码复制粘贴就可以了。
到了这里,我们又处理了一个错误。
接下来呢,我们再次点选【生成】,【生成解决方案】菜单命令。结果呢,依然会报错。
我们再次将鼠标定位在【输出】窗口中,然后呢,通过让鼠标滚动向上滚动,或者让【输出】窗口右侧的滚动条缓慢向上移动,来让输出窗口中的信息缓慢向下运动。
在输出窗口中的信息移动的时候,我们重点关注【error】字样,以寻找报错信息。
这一次,我查到了下图所示的报错信息。
图37
双击【error】字样,结果弹出下图所示的对话框。
图38
在图38 所示的对话框中,点击右下方的【是】按钮,然后呢,VS2010 会进行文件转格式操作。等一会儿之后,界面如下图所示。
图39
这样的话,转格式操作,就算是完事儿了。
接下来呢,我们再次点选【生成】,【生成解决方案】菜单命令。
结果,仍然是会报错的。本次的错误信息如下图所示。
图40
错误信息是说,无法打开 dinput.lib 文件。
这个文件,我们需要自己到网上去下载。
当然了,CSDN 里面就可以下载得到的。
不过呢,我这里,已经下载过了,并且,测试可用。请大家异步到下图所示的,我的网盘分享文件夹的某一个路径中。
图5 副本
在图5 中,有一个【资料】文件夹,我们双击进去。如下图所示。
图41
请大家将图41 中,红色框线所示的压缩包给下载回去。在我这里,我选择将其下载到桌面上,然后解压缩。解压好了以后,进入如下图所示的路径中。
图42
我们再找到下图所示的路径与界面。
图7 副本
请将图42 中红色框线所示的【dinput.lib】文件复制到图7 所示的路径里面,结果如下。
图43
接下来呢,我们再次点选【生成】,【生成解决方案】菜单命令。
图44
啊,终于编译成功了。
不过呢,也先不要高兴地太早。
三. 配置 VirtuaNES 模拟器
我们试着执行一下程序。依次点选【调试】,【开始执行(不调试)】菜单命令,结果如下。
图45
又报错了。原因何在?
这个错误,它并不是编译的错误,也不是链接阶段出了错误,而是软件运行中出现了错误。
这个错误,不是 bug 。
而是说,VirtuaNES 模拟器软件,它在运行时,需要一个语言插件。语言插件,原作者提供了很多种。英语的,俄语的,日语的,中文的,他都提供了。
语言插件是干嘛的,是用来设置软件的菜单所使用的语言的。如果你用的是简体中文语言插件,则菜单所使用的语言为简体中文。如果你用的是英文语言插件,则菜单所用的语言就是英文的。
我们先点击一下图45 中的【确定】按钮。关闭对话框。
然后呢,还是定位到我的百度网盘分享文件夹的下述路径与界面中。
图41 副本
图41 中,有一个【语言插件】文件夹,请将其下载到你的本机里面。在这里,我选择将其下载到桌面上。下载好了以后,进入这个文件夹里面,如下图所示。
图46
这里呢,是四个语言插件。其中呢,【Chinese.vlp】和【Sim_Chinese.vlp】是一样的,都是简体中文语言插件。【Tra_Chinese.vlp】是繁体中文语言插件,【English.vlp】是英文语言插件。
日语好的,自行寻找日语插件吧。我记得,原作者的语言插件里,还有俄语,法语,德语的语言插件。
不过,我想,对于大多数中国人来讲,简体中文与英语两种语言插件,应该就够用了。
接下来,还是请你找到下述路径。
图7 副本
假定,你选择使用简体中文语言插件,那么,请将图46 中的【Sim_Chinese.vlp】复制到图7 所示的路径中,结果如下图所示。
图47
复制好了以后,我们再次点选【调试】,【开始执行(不调试)】菜单命令,结果如下。
图48
默认的 VirtuaNES 模拟器的尺寸还是比较小的,且是一个正方形的。
这种尺寸,个人觉得并不合适。
我自己平时使用的 VirtuaNES 模拟器,其尺寸为 999 * 739 像素的尺寸。我的电脑的显示屏是 1920 * 1080 的分辨率。
调整完了以后,我们还需要来查看两个菜单项,如下图所示。
图49
如图49 所示,【编辑】菜单中的【即时读档】菜单项的快捷键为 L,而【即时存档】菜单项的快捷键为 S 。
在这里,我打算修改一下这两个快捷键。之所以选择修改,是因为,一般情况下,这两个菜单项,我不咋使用。而【即时存档】菜单项的快捷键 S,通常,我在设置模拟器的手柄时,会用到。
一般地,玩过电脑游戏的同学都会有经验,我们习惯用 ADSW 来作为游戏的方向键。也就是,令 W 键为【上方向键】,令 S 为【下方向键】,令 A 为【左方向键】,令 D 为【右方向键】。很多人,应该都会很习惯于这种设定的。而这种符合习惯的 S 键,恰好于 VirtueNES 模拟器的默认的【即时存档】快捷键 S 重合了,这个就不好了。我们还是来修改一下【即时存档】和【即时读档】的快捷键吧。
我们依次点选 VirtuaNES 模拟器的【选项】,【快捷键】菜单命令,结果会弹出下图所示的对话框。
图50
我们将图50 所示的界面,往下拉。也就是,将鼠标指针移动到对话框里面以后,让鼠标滚轮往下滚动,或者将右侧的滚动条往下移动。
将图50 所示的对话框界面往下拉,找到下图所示的区域。
图51
我们双击【即时读档】一行与【按键 1】一列所交汇的单元格,也就是双击字母【L】所在的单元格,然后对话框的标题栏会闪烁着【按任意键】的字样。在闪烁着【按任意键】字样时,我们按下键盘的【左方括号】键,结果如下图所示。
图52
然后呢,我们再双击【即时存档】一行与【按键 1】一列所交汇的单元格,也就是双击字母【S】所在的单元格,然后对话框的标题栏会闪烁着【按任意键】的字样。在闪烁着【按任意键】字样时,我们按下键盘的【右方括号】键,结果如下图所示。
图53
然后呢,我们点击图53 所示对话框中的【确定】按钮。
这样一来,VirtuaNES 模拟器的基本配置工作,也就完成了。
到了这里,我想,本节也就该结束了。
至于说,VirtuaNES 模拟器如何使用,如何用它来玩游戏,那么,你可以在本篇文章的前言部分,点击讲解 VirtuaNES 模拟器使用方法的那篇文章。
本节,就到这里吧。
总 结
我想,VirtuaNES 模拟器的编译步骤,应该还是很重要的吧。
希望大家能够学好本节知识。
学会了本节以后,你可以自己去下载 CSDN 中的 VirtuaNES 源码资源,参照着本节内容,再试着自己编译一次。
以后,如果你想要学习好 Windows 程序设计,并且已经达到了进阶学习的阶段,那么,我想,VirtuaNES 模拟器的源代码,应该会有用的。
本节结束。