前言:我想做游戏

缘起

我记得自己很小的时候(大概3岁还是4岁),我爸喜欢用红白机玩坦克大战和魂斗罗。但是我妈不喜欢,她认为打游戏会影响休息,而且伤眼睛,还减少电视机的寿命。我印象里面他们为此吵过架,我妈赢了,还把游戏机摔坏了,我们就没得玩了。

小霸王游戏机

直到再后来我快10岁,我爸以学电脑、练五笔打字为由,又弄回来一台小霸王学习机。放假的时候我们爷俩终于又可以一起通关魂斗罗了。但是平时我妈依然不让我玩,而且这次我爸也跟她站在同一边了,因为玩游戏影响学习。

我最恨别人跟我说玩游戏影响学习。

小霸王学习机

当自己没得玩的时候,看别人玩游戏也是很有意思的。而比没游戏玩更痛苦的事情,则是连看都没得看。

我爸平时玩得少,而我小时候特别听老师的话,从来都不去游戏机厅,真正的是连看都没得看。实在没办法了,我只好反复看小霸王游戏机的说明书解馋。那本书其他部分都很简单,只有最后一部分讲G-BASIC的内容让我难以理解,所以我就看得特别仔细。

小霸王界面

谁知道这是一条不归路啊!

G-BASIC界面

很快我就完成了自己的第一个游戏“猜数字”,然后迅速迷上了这个新玩具。

10 A = RND(5)
20 B = RND(5)
30 C = INPUT()
40 IF C=(A+B) THEN PRINT "NI YING LE!" ELSE PRINT "NI SHU LE!"
50 END

这个“新游戏”的玩法跟以前完全不一样。以前都是别人做好的游戏我来玩,现在则完全是由我自己来定义游戏的玩法。

这意味着我可以有数不尽的新游戏可以玩!

当时的我就是那么想的,认为自己可以创造无穷无尽的新玩意。那年我多大?10岁?反正还在上小学。

当我了解了G-BASIC的语法规则之后,即使没有机会玩游戏也不那么难受了。我在脑中设计程序,在草稿纸上把程序写下来,然后推算程序的运行结果。那种感觉就仿佛拥有了一个只属于自己的世界,规则明确,没有限制,充满了可能。

插曲 - 精灵

初中时期,网易代理了一款韩国游戏,精灵(Priston Tale)。这是国内出现的第一款3D MMORPG。

精灵

只看了一眼我就被她的3D画面征服了,整个初中我都在玩这个游戏。

森林1

别人的初恋是人,我的初恋是这个游戏。

弓箭手

然后她死了。

关于停止收费运营暨合并服务器的致歉信

致全体亲爱的精灵玩家:

  时间过的飞快,《精灵》在中国已经运营两年了,八月是一个喜庆的日子,因为《精灵》她两周岁了!可是八月也是个伤心的日子,因为《精灵》她被“外挂”这个病魔折磨的快要失去了生命!

  由于《精灵》的在线人数已经达到了一款游戏正常运营的最低谷,虽然我们有一千个一万个的不愿意,我们也只能无奈的“正式停止《精灵》在中国的收费运营”,我们感到非常的遗憾,同时也对做出这样的决定给玩家造成的不便和困扰感到深深的歉意,在此我们给两年来一直支持和热爱《精灵》的玩家致以最真诚的谢意,感谢广大玩家对《精灵》游戏的支持,同时为了给予喜欢和热爱《精灵》的玩家一个继续游戏的空间,我们将合并现有的8组服务器到一组“追忆世界”,提供给玩家们免费游戏。

  《精灵》正式停止收费运营的时间是2004年8月23日,届时之后将进行服务器的合并工作,并在8月26日重新开放服务器。如果您是《精灵》的忠实玩家,请您登陆合并后的服务器“追忆世界”继续游戏,并且我们也请您互相转告您身边的精灵玩家这一消息。对于停止收费运营和合并服务器给您带来的不便和困扰,我们再次致以深深的歉意。

精灵运营小组

2004年08月04日

我曾经最大的理想就是开发一个这样的游戏,后来我的理想是靠自己的力量让她复活。

然而讽刺的是她根本就没死。

这个游戏只是被网易放弃了,它在韩国运营得很好。网易之后“易当”公司获得了国内的代理权,改了名字叫做“精灵复兴”。

推波助澜 - 文曲星

另一个契机是在高中的时候,当时我爸为了奖励我的月考成绩,给我买了一台“文曲星NC3000”电子辞典,目的是学英语。

(我的文曲星不在手边,下面的图都是借用闲鱼上某卖家的贴图。) NC3000

NC3000

  • 在绝大多数同学眼里,这是个电子词典+计算器+游戏机+小说阅读器;
  • 在老师眼里,这是个作弊的工具+游戏机;
  • 在家长眼里,这是个电子辞典+游戏机。

他们都错了,这是台移动智能电脑。

关于它的历史,感兴趣的人可以读读这篇文章:星界历史

它的外观设计类似现代的笔记本,只是更加小型。除了内存小一点,芯片性能弱一点,不能直接上网(需要连电脑),其他功能和现在的智能手机没有什么本质区别,甚至还要强一些。

  • 超大屏幕(相对其他电子词典)
  • 全键盘
  • 使用2节5号电池
  • USB数据线
  • 红外功能,两台文曲星可以在一米内联机。
  • 有麦克风,有MP3播放器
  • 64KB闪存
  • 6502 CPU

它的超前之处在于,从很早的型号开始就自带了一款名为GVBASIC的解释器,允许用户直接在文曲星上编写BASIC程序,并可以保存程序文件。

用户可以通过数据线,将电脑上的文件传输到文曲星中,也可以将文曲星中的文件传输到电脑上。比如我就把精灵的LOGO做成了文曲星的开机启动画面。

NC3000传输文件

这让文曲星变成穿越到了10年前的树莓派,用户自发打造了专属于文曲星的AppStore + Steam,而且还是免费的!

当年的星迷(包括我)都是一帮狂热分子,各种有趣的、有用的、让人瞠目结舌的应用层出不穷。

比如可以在文曲星上运行的IDE,EWayWriter+GVMaker编译器。没错确实是IDE,可以编写代码、语法检查、编译程序。编译后可以直接在机器上运行。

比如RPG游戏“黄金英雄坛说”、“神洲”、“我的世界”、“龙之传说”;即时战略游戏“星际争霸”。你能想象在160*80象素分辨率的机器上怎么玩星际争霸吗??

感兴趣可以点击下面两个链接进去看看,这只是其中一小部分。

让我列举一下高中时,我通过文曲星学会并实践过的技术。

1. GVBASIC编程

文曲星自带BASIC解释器,对我来说简直太完美了。除了部分函数和内置图片以外,其他都都GBASIC没有什么本质区别。以前我只能拿着纸写程序,现在有了文曲星简直如虎添翼。

2. 6502汇编

当我开始尝试做一些复杂的游戏时(包含过场动画),BASIC的执行效率开始让人无法忍受。而且文曲星上的BAS程序有最大8K的限制,程序内容太大的话,一个文件保存不了。

文曲星采用的是6502单片机,于是我自学了6502汇编,开始用下面这种方式写程序。

LDA #$82
STR X
LDA #$83
ADD X
STR #$82

3. 编译原理

对,你没看错,是编译原理。这门课一般大学本科3年级才会开,专科一般都不学。在学了6502汇编之后,我就开始尝试根据大神的指导,使用debug模式侵入文曲星系统内部,逐字节地阅读GVBASIC解释器的程序,看看它是怎么工作的。

虽然当时并不懂什么词法分析、语法分析、语义分析之类的概念,但是我大致明白了这个解释器是怎么运行BASIC程序的,然后自然领悟出了注入攻击内存溢出攻击

4. 内存溢出攻击

我当时并不明白知道这是一种攻击方式,只是想到了一种让BASIC程序突破8K限制的方式。

基本思想是在解释器执行到BASIC程序的下一个语句之前,读入一段超长的数据,使内存溢出。这段数据要计算好偏移量,让溢出部分覆盖掉后面的语句。通过这种方式就可以动态改变内存中的文件内容,在8K的内存中运行超过8K大小的程序!

后来更进了一步,直接让溢出的数据覆盖掉解释器本身,使用汇编代码重写GVBASIC解释器的函数,从而改变或增加新功能。

再后来,通过大神的指点,我又做了一点优化:用文件编辑器将汇编代码直接接在BAS文件的尾部,然后在BAS程序中以中断的方式来调用汇编代码。这样可以把一些执行起来非常耗时的代码用汇编来写,然后在BAS程序中通过函数接口来调用,从而提升程序性能。

5. Java语言、C语言

虽然6502汇编的性能提升是显著的,但是编程的过程太蛋疼的,而且把程序移植到不同型号的文曲星时非常痛苦。

有大神(LEE)借鉴了Java语言的特性(字节码)和C语言的语法,为文曲星创造了一种名为Lava的编程语言,从跨平台和效率两方面同时获得了大量进步。

LAVA

于是我又自学了C语言,用Lava来编程。大学后应为Lava这个名字的缘故,又自学了Java。

.lav格式的文件,曾经极多的应用。游戏、音乐、电子书不胜枚举。 lav文件

6. 计算机图形学

高中那个时期最难的课程是数学,各种解析几何、不等式、排列组合的问题。考试的时候我喜欢偷偷用文曲星把函数编程图形,并通过观察法暴力法直接得到答案,然后再写推导过程。

那么问题就来了,如何在一个只有80*160像素的屏幕上,用汇编代码画线、画圆、画椭圆、画三角形,还要尽量标识精确?

输入函数表达式,自动生成图形,计算最大值、最小值、交点坐标。是不是很像MATLAB?

我自己做了一套功能类似的学习(作弊用)工具,甚至还尝试利用灰度不同来实现抗拒齿。

挫折 - 大学

高考前夕,我对未来的职业方向发展没有任何犹豫,我想做游戏。

游戏是复杂的程序,一个人是很难完成的,需要以工程化的方法来团队开发。我认为自己的编程基础还可以,所以没有选“计算机科学”专业,而是选了“软件工程”专业。

我的填了3个不同的学校,志愿都是“软件工程”专业,后来就如愿了。

事后证明选什么都是白扯淡。软件工程专业直到大三才开始上软工的课程,此前的课程都跟计科没有什么实质区别,而且巨大部分专业课我都学会了。

太无语了。

更无语的是,学院根本就不上游戏相关的课程。大学里稍微沾边一点的专业应该是数字传媒,而这一点我是在毕业2年后才搞明白的。数字传媒也不学做游戏,而是平面设计、Photoshop、Flash、Max 3D建模。事实上大学里根本就没有做游戏这门课。

再加上我单相思的女生不喜欢我,导致我感情上受到了成吨的打击,一学期下来我的考试成绩全线飘红。

当时我的想法是,反正也学不到有用的东西,别人也不喜欢我,干脆打游戏好了。

然而我DOTA打得也不够好,总送人头/吐血。

于是我注册了一个WOW号,在网上找了个3天60级的攻略开始练级,花了4天练了个70级猎人,每天打副本。又注册了一个“洛奇”号,每周练级,修炼各种生活技能。又注册了N个精灵私服号,练级打宝PK。

总之就是各种玩,昼夜颠倒,浑浑噩噩,反正也没人能管我。熬到大三了,真正开始上软件工程课程了,我已经彻底失去了兴趣。

本来我感觉自己已经成了一条废狗,但是学校寒暑假搞了实训,还算有些意思。

先是和安博集团合作,把我们送到昆山的基地封闭实习,带我们做Java Web项目。要知道我最喜欢的就是写代码了和学新技术了,很快就把框架的用法记住了,并且投入了相当大的精力来制作当时那个电子商务网站项目。

另外几次实训学校是和软酷网合作,分别作了“数字图像识别”、“电商+搜索引擎”的项目,后一个项目成为了我的毕业设计。

我喜欢这种学习新知识时大脑飞速运转的感觉,更喜欢在开发项目时爆发脑力和集中心神的状态。尤其喜欢实训过程中完整的软件工程实践,这不正是我刚入学时想学而没学到的东西吗?

于是毕业后我加入了软酷网。

穷极思变

我在软酷网从事实践教学产品研发工作,这个工作需要学很多东西,还要熟悉很多学校的教学体系。我喜欢这个工作,这与我想做游戏并不矛盾,唯一问题是公司的发展方向貌似离游戏开发还有很远很远的距离。

现在国内的游戏市场完全处于野蛮生长状态,做游戏的公司眼里只有用户留存,唯一想的就是怎么从用户荷包里掏钱。有想法的游戏人要么是独立制作,要么还在挣扎创业,就算我想加入游戏公司也很困难,再说我也不打算离开公司。

我不能被动等着一家企业按我的意图来调整方向,然后再利用公司资源来学习。目前国内的IT市场主要发展方向依然是Web+移动端电商,教育是为市场需求服务,短时间内不可能转变方向的。

难道我就应该放弃梦想吗?

显然不是,想做我干嘛不自己做呢?

现在想想,大学时候我就做错了:

  • 高中的时候有那么多外部压力还能自学很多东西,凭什么到了大学因为没有马上教我想上的课自己就不学了呢?
  • 高中时期虽然我“会编程”了,但很多知识都不成体系。学校好几门专业课本来都是我很想学的,却恨屋及乌都不学了,这就没道理了。

学习从来都不是靠别人教的。

2015年的夏天,我又一次想通了这个问题,那就自学吧。

首先我选择的是Unity3D,我想把精灵的模型导入到Unity3D中,然后在这个引擎中重新编写游戏的逻辑。我进行了尝试,但是失败了,有很多原因。

  1. 精灵这个游戏太老,它的模型格式是ASE,高版本的3DMAX不识别,低版本的3DMAX没法把ASE转成fbx。
  2. Unity3D不开源,我没法搞清楚它内部的数据结构,直接写代码来进行数据结构的转换。
  3. 当时网上能找到的Unity3D教程都是傻瓜式的,他们的教学思路是让初学者通过Unity3D引擎的功能来开发游戏,各种资源从AssetStore买来用就好。把另一个引擎的数据结构转成Unity3D的数据结构,这个问题有点略复杂,绝大部分教程里面都没有讲。
  4. 它用的是C#语言,虽然我也会C#,但是没有Java顺手,很多库函数都不太熟悉。

我想到了更换引擎,就找到了jMonkeyEngine,一款纯Java的开源3D游戏引擎。

我花了大概1周左右熟悉这个引擎,再花了2周研究3DMAX的数据结构和ASE文件的数据结构,同时还花了2周左右学习3D图形学的一些基本概念。

我写了一个小程序来测试精灵的模型,可以正常显示了,挺让我高兴的,还专门总结了几个帖子:jME3的资源管理器

导入模型

然后就是更进一步,重制整个地图的场景。

显示场景

这个过程我重新学习了大学的线性代数,因为很多3D数学计算用到了矩阵(Matrix),那些表达式我看都看不懂,尝到了大学时期不好好学的恶果。

除此之外,我还学习了部分3D图形学、3D数学、着色器编程、建模、实体组件系统等,现在还在继续学。

在学习jMonkeyEngine引擎的过程中,我发现这确实是一个非常不错的引擎。我中间穿插着学习了libGDX、cocos2d、Unity3D等多个引擎,jMonkeyEngine再功能并不输给这些引擎,而且学习曲线更平缓。

唯一头疼的是缺乏中文资料。

我本人可以阅读英文源码和官方的教程。但我认识另外一些国内的jMonkeyEngine爱好者对英文很恐惧,因此我打算做一整套jME3的中文教程。

想要实现理想,靠的还是自学和实践。

与君共勉。