好久没碰游戏开发的老家伙,最近也不知道怎么,突然就想翻出XNA Framework 4.0来玩玩。可能是看有些独立游戏还在用,也可能是纯粹怀旧,就想着自己动手实践一下,看看这老东西现在还能不能跑起来。
折腾环境
第一步自然是找安装包。这玩意儿微软早就停止支持,官网是别想。费点劲,在一些老论坛、犄角旮旯的地方才扒拉出来。下载下来,还得配特定的Visual Studio版本,我记得好像得是VS 2010才比较稳妥。电脑上早就装新版的VS,还得整个虚拟机或者想办法兼容安装,稍微折腾一下。
装好XNA Game Studio 4.0插件后,启动VS2010,感觉一下子就回到那个年代。界面那叫一个朴素。
第一个“游戏”
接着就是新建项目。按照记忆和搜到的一些零碎资料,找到模板:新建 -> 项目 -> Visual C# -> XNA Game Studio 4.0,然后选那个Windows Game (4.0)。给项目随便起个名字,比如“MyXnaTest”啥的,点击确定。
VS哐当一下生成一堆文件,有个核心的`*`文件。啥也没改,直接按F5运行。编译一小会儿,弹出来一个窗口,里面啥都没有,就是一片纯净的亮蓝色背景。成,这就是XNA最基础的程序跑起来的样子。虽然简单,但当时心里还挺高兴,至少环境没问题。
加点东西试试
光一个蓝屏没意思,总得加点我找张以前留下来的小图片,想把它显示到屏幕上。
- 先在项目里那个`Content`项目上右键,添加现有项,把我的图片文件(比如叫 `*`)加进去。
- 然后在`*`里,先在类顶部声明一个`Texture2D`变量,比如叫`playerTexture`。
- 接着找到`LoadContent`方法,在这个方法里写代码加载图片:`playerTexture = *
("player");` (注意这里不用写扩展名`.png`)。XNA这个Content Pipeline会自动处理,这点当时觉得还挺方便的。 - 一步是在`Draw`方法里把它画出来。找到`*()`和`*()`,在中间加上一句:`*(playerTexture, new Vector2(100, 100), *);` 这意思就是在屏幕坐标(100, 100)的位置画出这张图。
再次按F5运行,蓝色的窗口中间,我那张小图片显示出来!虽然还是静止的,但比刚才的空窗口强多。
让它动起来
静态图看久也腻,就想让它动一动。这主要就得在`Update`方法里做文章。
我在`*`里又加个`Vector2 playerPosition = new Vector2(100, 100);` 变量来存位置。
然后在`Update`方法里,读取键盘输入。比如,如果按右方向键,就把`playerPosition.X`加一点;按左方向键就减一点。代码大概是这样:
KeyboardState keyState = *();

if (*(*))
playerPosition.X += 2;
if (*(*))

playerPosition.X -= 2;
// 其他方向键类似...
把`Draw`方法里画图那句的坐标改成用这个变量:`*(playerTexture, playerPosition, *);`
再次运行,这回我按键盘左右方向键,屏幕上的小图片果然跟着左右移动!虽然简单,但这基本上就是游戏最核心的“输入 -> 更新 -> 绘制”循环。
搞完之后的想法
整个过程折腾下来,感觉XNA 4.0这套东西,思路挺清晰的,`Initialize`, `LoadContent`, `Update`, `Draw`这几个核心方法把游戏流程切分得很明白。对于学习游戏开发的基本原理,比如游戏循环、资源加载、2D渲染这些,还是挺有帮助的。
跟现在流行的Unity、Unreal比起来,XNA功能就太基础,也没啥可视化编辑器,很多东西都得手写代码。开发效率肯定没法比,而且平台也受限(主要是Windows,以前还有Xbox 360和WP)。
不过这回实践纯粹是体验和记录,跑通基本流程,也算是却一桩小小心愿。感觉就像是翻出老工具箱,把里面的锤子、螺丝刀拿出来擦拭一遍,虽然现在可能用电动工具更方便,但体会一下手动操作的感觉,也别有一番滋味。