序
前些年的呆游戏机公司,由零开始,时以xna为基础开发游戏机,开发并发布了跑马灯类游戏。其余零零碎碎做了些尚未商业化的游戏。同其他非设备类游戏比较,这类游戏多一些硬件通讯以及程序文件安全性问题处理。拿个大鱼吃小鱼的游戏show一下:
基础类
xna比起托管directx没多做多少工作,和其他称得上游戏引擎的平台,它需要你做一些工作。比起winForm,xna提供一个连容器都不是的Compent —— 相当于一个非容器式Control,对于构建部件之类的是不利的,因此我预期一个类类似Flash的动画剪辑的类 —— 容器,可绘制,作为动画的基础单元。
这是第二个版本,也是xna生涯的最后一个版本。类比较简单有效,没有像后来的cocos那样将动作之类的单独列为action容器;容器内也并未使用迭代器,使用简单暴力的for方式,这样删帧或其他对象时可以很简单(微软内部用的是迭代器,每次先拷贝从而回避这个问题)。
继续我们简单粗暴的设计 —— 对开发快速这个不用说了,这个东西本身实在开发的过程中完成的;当时还处于一些问题,比如一条鱼游动,如何来描述?纵观后来的cocos ide也不怎么好用,当时先试了位图点的方式,考虑到离散时当点越多越趋近于模式点,用ps做了好大的图,然后取rgb来算,末了,想到为什么不用flah,直接就是函数算出来的,用引导线几拉,什么位置什么速度,这就是超好的visual studio啊,最后用脚本输出成指定格式扔给ContentManage去处理,搞定。
动画也来回在第一版本时也考虑使用大图一个文件还是用多文件,终于在凌动板也差异不很大,抉择了多文件的方式,这样不用关心动画有多少张,反正一个目录一组动画。
Content结构:
至于绘制的begin和end问题,设置一个开关,也扔给每个动画类吧,否则全局一个begin - end(game);
字体很烦,用GDI+吧,省事方便;
粒子系统:我们使用ProjectMercury加个小小的类,反正大多数用xna的都会给出Compents的demo,容器的基于Compent总是有好处的,小小的改动粒子系统就进来了;
物理系统有个叫什么的用来倒是不错,就是有了自己的一套基类,不基于Compent,最后妥协还是大名鼎鼎的Box2D,这样也小改小改就进来了;
上面2D对于算是差不多了;
3D基类算了,别写了,引入JigLibX就行了,把他的继承修改修改,3d基元就收工,连物理都搞定了。
至于Kinect直接从Animation派生,FrameReady去改帧。
用到的图像基类差不多了。
安全是这个行业的挣钱手段,通讯鉴于硬件3des模块,使用3des,使用crc16容错,方便大家使用封装成事件驱动机制(若开销大自行异步处理)。至于程序集文件,其他厂家中有的用的加密狗,有的仅仅是凌乱;凌乱不是什么好方法,监控便能找出所有;狗买了、什么加密硬盘都试了,相对而言狗大约是目前较为安全点的方式,各方权衡后,最后决定直接扔一点后加载的信息到51上好了,跟加密狗也差不多原理了,再重载一下ContentManagement,要盗也不容易了(如果从内存盗取,那狗什么的都不是办法了,除非不让程序运起来)。
框架
这个大鱼吃小于算是这类游戏中稍微例外那么点的,这类游戏,几个场景,时序模式基本上差不太多,命中目标大多数要么是中心旋转或者多半就是每个边上的动物怎么怎么变化;
作为码员总是想偷懒的:抽象几个场景基类,时序,将两种常用的算中目标也写成抽象;
好了,从Program开始,搞几个派生->运行;全黑游戏就开始了;
来一个需要我让美工在flash里面标定好,马上就能搞一个跑马灯类游戏出来。
蛋疼的事
调试通讯:
这事原本设定51OK的,总是经常正确偶尔错误,苦逼的差事总是落到鄙人身上,过程代码理了多次,扯了几轮,最后把51的逻辑拿出来一扯,妈的,51重发时机未解密又加密,过去运行基本正常不代表没错误啊,还挖出几个潜在的bug(后来离开公司了,那些个不是我的货全XX了,我的神啊,早说了的)。
声音:
XP和Windows 7不一样啊,也是调试、调试,恍然自己的是windows 7。。。
不是我的蛋疼 —— 运行几天不经意时刻抛出个异常...,哥们抄代码抄全一点,容器管理别忘了检查,谁他娘的知道你的游戏跑了几天哪个对象跑丢了。
开始搞Kinect没有文档,终于把这3个位猜出来,—— 文档出来了。
小结
游戏带给我什么——
写游戏其实挺好玩的,带来了乐趣。
游戏挺有技术挑战性,带来了些许蛋疼之事。
正式因为如此,在技术认知上当事时带来不少新的理解。搞时下的view的时候会发现,form模式也许很烦很复杂(主要是非编辑模式,事件层毕竟是大事啊),换一种模式效果效率会很高。搞完游戏会发现做一枚跟踪导弹其实不难(测控技术点相对还多点),天气预报也不过如此(物理引擎不就是简易的天气预报库吗,再多加公式多加参数,越多越准确而已,运算量大了,好了——天河来帮忙吧)...;游戏让你彻底认识数学的重要性,一堆物理公式都不说了,毕竟一个简单的旋转也是需要学过高数才会明白的;你会为离散纠结;游戏的通讯让你彻底明白串行并行倍频怎么回事——做芯片也不过如此啊,高数还是重要吧,布尔这人真是牛掰,不然一个加法器逻辑还是摆不出来,何况乎这是个最简单的指令。游戏是个苦逼的事,大概这里的技术含量在我看来比其他的行业是比较复杂的吧,祝福这帮程序猿们好生珍重。
类参考见:http://yunpan.cn/cwUtzwNvQnwkP 访问密码 326d
xna framework for visual studio X: https://mxa.codeplex.com/releases