《孤胆之夜》


        刚出道时写过的3D游戏,以下是关于这款游戏的简单介绍:

类型:3DARPG+FPS

编译工具:VS2008

代码量:1万以上

资源来源:其中图片声音模型等资源皆来源于互联网或其他PC游戏中,仅供个人学习。

游戏概况:

游戏中有2个场景,第二个场景的界面方面就是模仿的抢滩登陆了。至于第一个场景开始有LOGO视频,加载界面,游戏中还有实际的人物踏船越过河流的过场动画.过场动画中的河里游走的海豚是唯一的关键帧动画。其它的都是纹理动画和骨骼动画,还有ARPG部分人物打斗,主角两个物理技能,包围盒碰撞检测,有第一人称摄像机和尾随摄像机的切换,人物蹲立,横跨等特殊动作。包含天空盒,高度地形,简单UI,2D和3D字体,人物伤害值计算,静态和动态模型,河流,粒子雪,粒子火焰和公告板爆炸,子弹射击,碰撞检测等技术。

功能实现:

各种菜单界面都有淡入淡出效果

场景选择界面

视频

加载界面

游戏场景中ARPG部分开始时的过场动画

ARPG部分的战斗

场景一中FPS第一部分场景

场景一中FPS第二部分场景

场景二中的菜单选择界面,包括后面几张图中门的推拉等这都是我模仿抢滩登陆自己写的UI逻辑,只是本人不是美工,所以直接用抢滩~的图片,什么?不信?不信我当场给你写一个。(使用ALPHA贴图,鼠标放到菜单选项上有不同的效果,下图为前后对比)

场景二中的进入菜单选项内部界面(点击前后箭头切换菜单选项并带有推拉门式的效果,下图为前后对比)

场景二中的FPS游戏界面(有玩家枪,准星,子弹,爆炸,2类NPC敌人,飞机绕8字形轨迹飞行)

场景二中的FPS游戏结束界面

将模型导出到Direct3D

(零)序言
你在3ds
max(以下称作max)或Maya(以下称作maya)中为一款游戏制作各种3D模型,你希望自己所做的模型能在一款3D游戏引擎中被活灵活现地显示出来。在那一刻你会感到非常喜悦,因为玩家那充满热情或惊叹的眼神使你感到自己的作品被承认、被赞赏。嗯,这的确值得我们去想象!

 
不过,先别急着去幻想那些情景啦,因为你在进入梦乡前会有足够的时间来想象这些情景。在此之前,你还是要务实一点,先要为能得到那样的眼神而付出相应程度的努力。

 
不知你是否清楚这样一个事实(或,我现在需要告诉你这个事实),那就是,你在max或maya中保存的.max或.ma、mb格式的文件是不能直接“放到”引擎中去显示的。一般来说,游戏引擎都不支持这些格式,通常它们会各自定义一些专门的文件格式来存储模型,而只有具有这种格式的文件才能被引擎直接使用。因此,你就需要将max或maya制作的模型导出为那些格式。

 
      

要知道一般3D游戏引擎都是基于Direct3D(以下简称D3D)或OpenGL编写的。而由于不同引擎支持的格式各不相同,所以在此很难逐一去讨论。正如文章的标题所示,本文主要讨论如何将模型导出到基于Direct3D编写的应用程序或引擎,再或者更精确地说(如果你了解Direct3D的话)导出到Direct3DX的.X文件格式。本文的首要目的就是让你了解导出一个3D模型的概念和具体做法;其次介绍了一种方法来验证你的模型是否能在D3D游戏中被正确的显示出来;最后指出在max中导出.X格式时会遇到的一个小麻烦及解决方法。

 
最后,我假设你用的3D建模软件是max或maya,整篇文章都是围绕在这两种软件中进行导出来说明的。并且我进一步假设你使用的是当前主流版本的max或maya,即3ds

max 5.0或Maya 4.0~5.0,如果你使用的是其它软件,或者版本号太旧或太新,则以下内容可能不是太适合于你。
 
      
OK,开始吧~!
(一)如何导出?
.X文件格式
.X文件是Direct3D开发包所直接支持的唯一一种3D模型格式,也就是说,如果你是一个程序员,你可以很轻松地写出一个Direct3D程序用于显示.X文件所存储的3D模型。.X文件包含了对于一款3D游戏而言有用的信息,诸如模型中顶点的位置、顶点颜色、材质、UV纹理坐标、动画关键帧等等。另外,.X文件有两种存储方式:文本和二进制,两者在功能和用途上没有任何差别,只是形式不同而已。

安装导出插件
      
另外,以下内容中的一些插图和说明以max为例。
 
l      
3ds max 5.0
1)       
如果max已经启动,则先关闭它。
2)       
复制:
XSkinExp.dle
到:
(3ds max所在目录)\plugins\
3)       
启动max后,选择菜单:
Customize-> Plug-in Manager...
检查弹出对话框的列表框中是否存在“XSKINEXP.DLE”,并且其Status是否为“loaded”,如下图:
 
       

l      
Maya 4.0~5.0
1)       
如果maya已经启动,则先关闭它。
2)       
复制:
xExport.mll
到:
(maya所在目录)\bin\plug-ins\
3)       
复制:
bicubicbezierpatches.mel和xfiletranslatoropts.mel
到:
(maya所在目录)\scripts\others\
4)       
启动maya后,选择菜单:
Window->Settings/Preferences->Plug-in
Manager...
检查弹出对话框的列表框中是否存在“xExport.mll”,并且是否构选了“loaded”和“auto
load”,如下图:
 
导出模型
l      
3ds max 5.0
1)       
选择菜单:
File->Export
在弹出对话框中选择保存类型为“X-File (*.X)”,并指定保存路径和文件名。
2)       
然后,可在弹出的导出选项对话框中进行设置,配置好以后按“Go!”按钮,导出选项和解释如下:
 
 
各个选项含义如下:
     
导出选项描述
     
Text文本
     
Binary
     
Binary Compressed二进制
     
压缩的二进制
     
Export Patch Data如果存在高次(high-order)表面则将导出patche以替代polygon网格
     
Include Animation Data是否同时导出动画数据,需要指定动画采样速率(单位:帧/秒)
     
Looping Animation Data是否循环播放动画

l      
Maya 4.0~5.0
1)       
选择菜单:
File->Export All…
在弹出对话框中选择保存类型为“xExport (*.*)”,并指定保存路径和文件名。
2)       

在文件保存的对话框中,按下左下角的“Options…”按钮后,可在弹出的导出选项对话框中进行设置,配置好以后按“Export”按钮,导出选项和解释如下:

 
 
各个选项含义如下:
     
导出选项描述
     
File Options选择文本、二进制、压缩的二进制
     
Tesselation
Options选择高次(high-order)和细分(subdivided)表面,或none为忽略这些表面
     
Material Options选择是否同时导出材质、是否翻转UV纹理坐标轴、纹理文件路径是采用限定路径,还是不限定路径
     
Animation Options“Export
     
Animation”用于选择是否保存动画属性。如果选择保存动画属性和“per-frame”后可以通过“Frame
     
Step”或拖动条来设置采样率;默认值是1,表示1:1的关系。该值与Maya的当前回放(playback)速度有关。
     
Skinning Options“Export
     
Skinning”允许你选择是否保存网格中skinning信息。如果没有选择该选项,则网格不能自我变形(deform),但如果网格继承于带有动画的层级的话,则它只可以在空间中移动。

观察导出结果
1)       
确认已安装了DirectX 9.0运行库(如果这个链接已失效,请点击这里来寻找最新的DirectX)。
2)       
运行Mesh Viewer,选择菜单:
File->Open Mesh File
选择相应的.X文件
1)       

你可尝试通过鼠标左、中、右键来旋转、缩放、移动地观察模型;你还可以选择显示法线、是否剔除(Culling)背面、以何种方式(点、线框、面)来显示模型等,以此来查看模型是否正确。

 
如果在Mesh
Viewer中一切显示正常,那么在基于Direct3D的程序中,一切也会表现良好。如果有些面没有正常显示或导出时就失败了,则说明你的模型存在一些问题,需要进一步检查一下模型,看看法线是否正确、多边形的边是否合拢、是否存在缝隙等。在max中进行导出时你会遇到一个小问题,你在导出前多做一件事情来解决这个问题。继续前进,来让我们看一下在max中导出时发生了什么“怪”事情。

(二)max的导出问题
起因
如果你以为将max制作的模型导出到.X文件后会有一样的外观的话,那你可把世事想得过于完美了。你至少会发现一个非常明显的错误,那就是:模型被关于XY平面作了镜像,譬如拿XY平面比作一面镜子,你在Direct3D中看到的将是那个在镜子中的模型(注意,我在这里没有提及maya,那是因为maya的导出插件已经处理了这个问题,真要感谢编写那个插件的那位作者!)。

 
以一个max模型(该模型系杨·为一同志所做,感谢他提供这个模型,正因为在导出这个模型时显露出来的错误使我更深入地研究了本文所涉及的主题J)为例,它显示出来导出前后模型的变换,导出前我们通过XY平面看到了狮子的背面,而导出后通过XY平面看到的却是狮子的腹部。如果想象原来的狮子站在一面镜子上,那么导出的就好比是那个镜子中的狮子。

 
         
(左图:在max中的模型;右图:导出后在Mesh Viewer中的模型)
 
好,现在你应该活动一下筋骨了,来尝试导出一个模型到.X文件吧。我建议你的试验模型最好不要是对称物体,并且具有一点能标识方向的几何体,我在这里提供了一个模型,如果你想偷点懒的话可以直接用它来做这个试验。然后亲身感受一下这个问题。

经过
      

那是什么原因造成了以上的问题呢?如果你是一个喜欢打破砂锅问到底的人,那这一段正是为你准备的。如果你是一个讲求实效或以“可用即可”作为行事准则的家伙,那么你可以直接跳到“结果”那段,“经过”对于这类人不是最重要的。

 
      

max和maya都使用了“右手坐标系”,以你计算机屏幕的左下角为坐标系原点的话,那么右手坐标系中X、Y、Z轴的正方向依次为向右、向上和向外(即指向你),如下左图。而Direct3D默认使用却是“左手坐标系”,与右手坐标系的唯一区别在于Z轴正方向相反,即向内(指向显示器内部)。另外,OpenGL使用的是右手坐标系,所以这些问题在OpenGL编程中不存在,无论你用max还是maya,直接导出原始的顶点数据即可通过OpenGL绘制出来。

 
(D3D使用的左手坐标系和max、maya、OpenGL使用的右手坐标系)
 
      
好了,当你明白这些知识后,让我们来看一下在从max或maya的右手坐标系转换成D3D的左手坐标系的过程中发生了什么。
 
      
考虑在使用右手坐标系的max中有一个顶点为(0, 0,
1),你应该可以想象它是位于Z轴的正方向那段上。当这个顶点被不加修改地以左手坐标系来解释的话,那么它还是位于Z轴的正向段的Z轴,但是绝对位置却发生了变换。那么当构成一个模型的所有顶点都被这样进行转变的话,那么得到的结果就好比是一个物体关于XY轴所构成的平面作了镜像转换。如下图所示:

        
(左图:建模完成的物体;右图:原来处于右手坐标系中的物体,直接转换到左手坐标系后的情况)
 
      

由上右图你可以看到,“镜子中”物体(即转换到左手坐标系后的物体)不是“现实”物体(原右手坐标系中的物体,也就是你建模完得到的物体)的副本,我希望你能明白我在这里所谓“副本”的含义,我指的是可以与原物体完全吻合的另一个物体、另一个复制品。而现在“现实”中物体无论如何旋转或移动是永远都不可能得到“镜子中”物体的,如果你不信可以想象或比划一下,是不是呢?不是吗?是的。J

结果
想知道解决方法吗?或许聪明的你已经知道该怎么做了。我这里有三种解决方法,可能你会更倾向于其中的某一种吧。
l      
美工解决(推荐)
众所周知,有一句话曰“负负得正”。既然导出后的结果是原模型的镜像结果,那何不在导出前先对模型作一次镜像呢?两次镜像的结果就是原来的样子。

 
在用max制作完一个模型准备导出前,做如下步骤:
1)       
选中整个模型
2)       
完成镜像操作,选择菜单:
Tools->Mirror
在弹出对话框中对于“Mirror Axis”选择“Z”,然后按“OK”按钮
3)       
导出
 
这样做的有两个前提:一、应选中场景中所有的物体来作镜像;二、物体应处于世界坐标系的原点。除非你知道当违反这两个前提时会得到什么结果,并对这样结果有所预期。不然你就应该保证这两点。

 
另外,你可以想象一下如果没有这两个前提的保证下会发生什么情况。对于不满足前提一来说,某些在max作了镜像的物体能如max中所显示的那样,而某些未作镜像的却在导出后被镜像了;而对于前提二来说,如果物体不处于世界原点,则导出结果的模型本身正确了,但位置却作了关于XY平面的镜像。

 
这个方法简单有效,不是吗?而且这种解决方法不是发生在游戏运行时刻,可以节省大量的运行时开销。顺便还能让程序员们可以轻松点!想想他们在成堆的代码中已经够可怜了(当然,有的程序员视为享受,天堂和地狱只在一念之间J),饶了他们吧。

l      
程序解决
你们注定是不平凡的,但同时也注定你们是最辛苦的。因为理论上任何开发相关的事情都可以由你们来完成,只是开发/运行效率存在高低之别而已。

 
      

在当前要解决的问题中,可以通过在程序中作一次镜像来完成,概念上与上述的“负负得正”一样。大致思想是:在进行单个导出物体的世界变换之前,先作关于XY平面的镜像(XY平面可以是世界坐标系的,也可以模型局部坐标系的,两者效果是不一样的),如果选择作关于世界坐标系的XY平面的镜像,则还需要将镜像后的结果移回到原来的位置,即按Z轴平移。以下代码演示了关于世界坐标系的一个镜像,然后将对象移回到原来位置。

 
D3DXMATRIX matWorld;
……
D3DXPLANE plane( 0.0f, 0.0f, 1.0f, 0.0f ); // 关于XY平面的镜像
D3DXMATRIX matReflect;
D3DXMatrixReflect( &matReflect,
&plane ); // 构建一个关于XY平面的反射(镜像)矩阵
float fZ = matWorld._43; // 记录下物体的原Z轴位置
D3DXMATRIX matMoveBack;
D3DXMatrixTranslation( &matMoveBack, 0, 0, -2 * fZ
); // 构建移回矩阵
matWorld = matReflect * matMoveBack * matWorld;
pDevice->SetTransform( D3DTS_WORLD,
&matWorld );
 
这段代码有几处值得进一步优化,但我现在这么写纯粹是出于让你看懂的目的,在你理解之后可作进一步的优化。
 
这种方法具有更多的灵活性,但你需要为此付出运行时开销。如果你用不到该方法带来的灵活性的话,还是从美工的角度来解决这个问题吧。

l      
工具解决
就我知道存在一个转换工具――Deep
Exploration(http://www.righthemisphere.com/),可以将诸如max、maya等多种格式的模型文件转换称.X文件,并且它已经处理了这个镜像的问题。该软件使用非常简单,选择相应的源文件,然后将其另存为.X类型的文件即可,在此就不展开讨论了。

 
可能还有更多工具有待你的发掘,如果找到别忘了告诉我一声。
(三)附录
l      
建模建议
1)       
如果建模软件支持更改坐标系的话,应尽量选择使用左手坐标系来制作将会在D3D用到的模型,由此避免了转换;
2)       
建模过程应尽量使物体的头方向朝着Y轴正方向,右方向朝着X轴正方向,前方向朝着Z轴正方向,这样也可以避免程序在运行时对物体模型进行旋转调整;

3)       
建模时应尽量使用相同比例的坐标单位,这也可以避免运行时的缩放;
4)       
导出模型前检查所有法线朝向是否正确,在max据说所知可以通过加一个XForm来检查。
文章转载自:

Homepage:http://www.zhouweidi.name
email & MSN Messenger:zhouweidi@hotmail.com

游戏开发工具浅谈

转载自http://job.17173.com/content/2008-10-30/20081030174833105.shtml

 作为目前国内游戏业的从业人员,我就我的工作经历把我知道的游戏开发知识分享给大家。所知有限,大家不要见笑哈~今天先说一下一个游戏制作团队需要使用的开发工具。毕竟“工欲善其事,必先利其器”,没有顺手的开发工具,表达和实现难免总是受限。

   
业界标准的游戏制作团队包括设计师(策划)、艺术家(美术)、架构师(程序)三部分,同时也要加上QC(测试)小组以保证迭代开发中的快速验证、除bug与模块稳健度。那么这次就主要介绍各个工作岗位的开发人员需要使用和建议使用的各种开发工具。

   
先从程序说起。程序员需要使用的工具,依据游戏平台的不同、开发端的不同有着不同的区分。但是一般都离不开C++,因此必备的开发工具就是Visual
Studio。以前PC平台上多用C开发,现在基本已经全部采用C++,但考虑到运行效率,有些网络游戏的服务器端开发仍然使用C。但是完全依靠人工写代码不但低效、劳累而且容易出错。因此出现了许多中间件(MiddleWare)开发套件,这些是封装好的图形、物理、粒子、AI、网络、声音、UI模块,内部嵌入了各种游戏中使用的函数。程序员只需要写好接口、加入针对性的运算函数便可以把这些部分的工作量减少很多了。而比较大型的中间件可能包含了这其中的许多模块,这便是游戏引擎(Game
Engine)。游戏引擎有很多种,有综合性的,比如unreal tournament、quake
3D、LithTech、jupiter等等。也有专注性的,最主要专注于两个方面——图形和物理。比如专注图形的ogre和专注物理的havok、ode,现在由于网络游戏开发比较热,引擎的网络部分也得到重视,一般采用C/S方式,也有P2P的方式,有些引擎会提供强大的分布式运算和ado技术。但也有一些引擎没有网络部分,一是由于调用数据的不确定,二是网络端会有专门的优化,许多程序员会写专门的算法处理这一部分。图形用户界面(GUI)有的为团队自己写,因为各种游戏界面需求不太一样。有的用引擎或第三方提供的GUI包写的。有很多……比较著名的是GTK+、wxWidgets、Qt

   
美术方面,二维的标准开发工具是painter和photoshop,三维的标准开发工具是3D
max和maya。二维不用多说,基本多少年都没什么变化。输出的标准格式早期是pcx、bmp,现在最常用的是tga、dds,tga是标准工业格式,已被业内大多数企业所接受很久。dds是为对应directX节省缓存的一种压缩格式,本身也有很多种格式,效果没有无损压缩图像那么好,但对于提高显示效率和节省游戏容量效果很好(图形是游戏中最占容量的部分)。png也是很好用的一种格式,正被逐渐接受。jpeg很少被使用,一是因为图像有损压缩,二是不支持alpha通道,无法实现一些特定效果。三维最早是max和lightwave,但maya的崛起使得其也逐渐成为游戏开发的标准工具。现在不少制作团队都开始转向maya,lightwave在欧美开发团队使用的比较少,日本的开发团队则非常喜欢lightwave。除此之外,由于CG产业的迅猛发展以及开发要求的提高,许多新型的优秀三维工具也进入游戏开发领域。比如softimage、motion
builder等,它们在动画制作方面有着强大的功能。三维输出的主要格式是max(流行)和obj。游戏中各种绚丽的效果是用粒子实现的,这也是美术工作的一部分。一般没有什么标准的工具,只要美术制作出粒子最基础的纹理材质图片(很小的二维图形,常用png格式),再导入到程序中计算路径、发射角、密度、生命周期、着色、受力等。也出现了一些独立的专门制作粒子特效的工具,二维游戏里面最常用的是particle
illusion(它本来是用于影视粒子特效制作的)。三维的有很多,比如particle accelerator、particle
editor等等。

   
策划方面的标准和使用的工具都很杂。由于策划是内容的开发者,所以首先要解决文字和数据的问题。MS 
word和excel是不可少的工具。虽然策划不是美术和程序,但是图像表达和逻辑表达也是策划应该尽量作到的。二维图像表达你至少要会使用word自带的绘图功能,但仍然建议掌握一些基础的平面绘图工具,比如photoshop、fireworks等等,如果你能用动画表示更好,比如flash、gif等;三维建议了解max、maya,我推荐使用轻型快速的三维工具进行表达,比如silo、sketchup等。它们都可以输出为obj格式,方便导入到max中(多用于查看,因为模型会有一定程度的破损,部分需要重新制作),也可以使用截图软件截屏然后制作二维示意图。策划的工作还涉及脚本(script)创作,比如游戏的部分AI、任务逻辑、物品(诞生、消失)控制、运算(hp减血、攻击数值)数据、物理碰撞锁死编辑、触发器等。这些方面的主要文件格式为ini、xml,还有直接封包为bin、pak以及程序自己开发的各种存储格式。不少游戏使用python、lua等通用的脚本语言进行解释,它们可以很方便的嵌入到宿主程序中,加快了调试效率。多数游戏引擎也会提供强大的脚本编译器。

   
其实策划拥有强大的编辑器就可以把上面这些全省了……不过需要程序先把框架搭好,美术先把资源做好,策划才可以拼接设计,这已经耗费了很多时间了。所以能保证制作之前完成规划性的设计是很重要的。策划还需要要考虑可用性、复用性、逻辑锁死以及提出的资源需求(包括质量、数量)对效率的影响。比如哪些美术资源是可以重复使用的,图像质量要求要达到什么程度(过高的要求会大大降低程序渲染效率,也会增加整个团队的工作量),数值变化的临界点以及控制机制。当然这些就是具体的工作内容了,这里不再详述。

   
音乐音效部分有专门的创作团队制作,多数游戏制作商为外包。但也有许多不太注重品质的制作商直接就让策划做了(无敌的音效库……)。标准的创作方法是,首先需要在录音室创作音源,用音频采集卡录制cd品质,在专业工具中进行编辑,包括采样、滤波、除噪、编辑通道、混音、剪辑和合成,最后输出为wav或ogg格式。ogg格式压缩率更高,品质也很好(强于mp3),比起wav格式更省体积;也可以直接创作数字音源,制作midi格式的音乐音效,这就要有更多的专业知识了。这方面的工具有很多,Cubase是标准的开发工具,也可以使用sound
forge、sound editor编辑。

教程:CS游戏服务器搭建全攻略

建立CS游戏服务器

  在CS游戏目录中,找到hlds.exe文件,创立快捷方式。

  右键单击快捷方式图标,察看快捷方式属性。

  在“目标”栏中,添加下面的参数

  hlds.exe -game cstrike -port 27015 +maxplayers 20 -nomaster
+sv_lan 1 -insecure +map de_dust2 +servercfgfile server.cfg

  注意,每个 + 号或者 - 号的前面都有一个空格。

  各个参数的意义如下

  -port 服务器端口

  +maxplayers 服务器最大多容纳人数

  -nomaster
让服务器不上WON认证,避免因为出国网络不通导致的服务器问题。这个参数使玩家可以使用盗版CDKey

  +sv_lan 1 指定其为一个LAN
server,即允许使用IPX协议进行游戏,同时不影响外网的人通过TCP/IP协议进入服务器,外网的人在internet
game里add server也可以进入服务器。值得一提的是,如果服务器及其使用的是双网卡或更多,那么sv_lan
1的话,服务器在建立的时候会自动搜索局域网的ip来作为服务器ip。单网卡服务器建议使用此参数。

  -insecure CS自带的VAC凡作弊系统,-号表示不使用,要使用的话就修改为 +insecure

  +map de_dust2 服务器起始地图

  +servercfgfile 服务器起始使用的config文件

  服务器的所有参数设置被纪录在一个cfg文件里面,+servercfgfile
server.cfg这个参数就是用来指定服务器初始化时读取的是哪个cfg的。

  我这里帖出一个本人根据2003WCG的比赛cfg修改得到的一个混战服务器的cfg。没有标明WCG比赛设置数值的,默认就是wcg设置了,由于混战服务器的需要做了修改的,都在后面标明了wcg设置的数值。

mp_maxrounds 0 最大局数,当双方开战的总局数达到多少时换地图,0表不限制

  mp_timelimit 30 最大时间,地图开始多少时间后换地图,以分钟记

  hostname "L.Doom CS1.5 Server" 服务器名字

  sv_password none 进入服务器的密码,none表没有

  sv_maxrate 10000 限制网络传输的资料最大值,最大25000,WCG比赛设置 25000

  sv_minrate 1000 限制网络传输的资料最小值

  sv_maxspeed 320 移动的最大速度

  pausable 0 玩家是否可以暂停游戏

  sv_cheats 0 是否允许作弊

  sv_aim 0 是否允许自动瞄准

  mp_flashlight 1 战术手电是否允许使用

  mp_footsteps 1 是否有脚步声

  mp_falldamage 1 高出落下伤害

  mp_autokick 3 睡死几局后自动踢出玩家

  allow_spectators 1 是否允许旁观

  mp_freezetime 6 每局开始时的买枪冰冻时间,以秒记,WCG 7

  mp_roundtime 3 单局的时间,以分钟记

  mp_buytime 1 可以买枪的时间,以分钟记,WCG 0.25

  mp_c4timer 35 C4的爆炸时间

  mp_startmoney 800 起始钱数

  mp_forcecamera 2 死后视角,0,自由移动,1,只能跟在玩家身后,2,固定不动

  mp_forcechasecam 2 死后视角,0,自由移动,1,只能看第一视角,2只能看队友第一视角

  mp_fadetoblack 0 死后黑屏,WCG 1

  mp_friendlyfire 1 友军伤害

  mp_tkpunish 1 杀死队友惩罚,即杀死队友后,下一局自动自杀

  mp_autoteambalance 2 自动人数调整,当双方人数差距多少时自动调整人数,WCG 0

  mp_limitteams 1 一方队伍的最少人数,WCG 0

  mp_hostagepenalty 10 杀了多少人质或队友后会被踢

  mp_fraglimit 0 最大杀人数模式,即有人杀人数到达多少时换地图,0表无限制

  mp_winlimit 0 最大胜利数模式,即某方胜利次数到达多少时换地图,0表无限制

  sv_allowdownload 1 允许玩家下载

  sv_send_logos 0 允许玩家上传logo贴图信息

  sv_send_resources 1 允许玩家发送资源信息

  sv_allowupload 0 允许玩家上传

  sv_gravity 800 重力设置,默认800

  mp_kickpercent 0.6 投票kick某玩家超过60%则kick,WCG 1

  mp_mapvoteratio 0.6 投票换某地图的人数达60%换地图,WCG 1

  mp_ghostfrequency 0.1 鬼魂每秒钟更新的频率

  sv_sendvelocity 0 设定1开启较复杂的花样以及物理设定,适用较快的Server

  mp_lowlag 0 子弹打在墙上的效果,速度快用0,慢用1

  mp_decals 300 最大同时显示贴图

  sv_voiceenable 1 是否允许语音通讯

  sv_alltalk 0 语音通讯对象,0 则语音通讯只有队友能听到,1 则所有人能听到

  log on 是否允许记录,关闭为log off

  mp_logfile 0 是否开启记录文件

  mp_logmessages 0 是否纪录玩家聊天内容,此项设定必需同时设定"log on""mp_logfile
1"才可生效

  sv_proxies 4 允许接入的hltv服务器的数量

  sv_rcon_maxfailures 5 试验op密码错误次数超过多少则ban ip

  sv_rcon_banpenalty 5 ban ip时间,以分钟记

  rcon_password "ldoom" 服务器远程op密码

  mapcyclefile maplst.txt 服务器地图循环文件

  maplst.txt文件举例:

  该文件是地图循环文件,默认为mapcycle.txt

里面的地图名字一行一个,不要加扩展名,例如

  de_dust2

  de_cbble

  de_aztec

  de_nuke

  de_train

  de_inferno

  de_prodigy

  远程op应用祥解

  作为客户端进入服务器后,在控制台输入 rcon_password oppw ,例如上面的设置,则输入
rcon_password ldoom

  如果控制台没有提示你输入了错误的密码,那么你就已经顺利的获得了管理员权限。

  获得远程op权限后,就可以远程遥控服务器了,可以更改几乎所有的服务器设置。

  命令格式为在服务器参数命令前加 rcon

  例如:

  rcon sv_restartround 1 1秒后刷新

  rcon mp_freezetime 3 将冰冻时间改为3秒

  rcon sv_restart 重新启动服务器

  rcon changelevel de_dust2 换地图到de_dust2

  rcon exec wcg.cfg 读取服务器端的wcg.cfg配置文件

  rcon sv_password welcome 设置进入服务器的密码为welcome

  rcon mp_friendlyfire 0 关闭友军伤害

  以此类推。

  有一个特殊的命令,就是是否允许暂停,这个命令不加rcon,也就是需要修改时,直接输入 pausable 0/1
就可以了。

关于“Class C”问题

  这是一个比较恼人的问题,但是解决该问题很简单,只要用一个破解程序破解swds.dll文件就可。只需服务器端破解该文件,与客户端无关。

  破解补丁下载,覆盖原文件即可。

  关于motd.txt文件

  这个文件是玩家进入游戏后看到的一个窗口,窗口上有个 “ok” 按钮,该窗口用以提供一些服务器信息等,可随意修改。

  简单建立和应用CS观众服务器

  如果要建立观众服务器,找到hltv.exe文件,创建快捷方式,添加参数如下:

  hltv.exe +connect ip:port -port 27020 +serverpassword ***
+maxclients 50

  参数意义:

  +connect ip:port 观众服务器连入哪一个游戏服务器

  -port 27020 观众服务器端口

  +maxclients 50 观众服务器最大容纳的观众人数

  +serverpassword *** 游戏服务器的密码

  这些信息也可以写在hltv.cfg文件中,但是要去掉+号和-号。

  观众服务器更多设置请用记事本打开hltv.cfg文件察看

  //进入游戏服务器所现实的名字

  name "HLTV Proxy"

  //hltv服务器的名字,加//屏蔽该命令的话,hltv服务器的名字将和连到的游戏服务器名字相同

  //hostname "HLTV Proxy"

  //转播延时时间,以秒记。

  delay 30.0

  slowmotion 0.5 0.2

  multicast 0

  //最高客户端速率,Internet互联网 3500 , Lan/IPX局域网 10000

  maxclientrate 4000

  // 是否记录HLTV日志文件到proxy.log文件

  logfile 0

  // 谈话模式 0禁止 1连接到同一个观众代理服务器的观众可以相互谈话 2 所有观众都能相互谈话

  chatmode 1

  //观众服务器远程op密码

  adminpassword "hltvadmin"

  // 允许客户端使用joingame命令加入游戏。

  allowjoingame 1

  //loopcmd 1 60(每隔60秒) localmsg "You're watching HLTV.
"(显示的信息内容) 5(显示5秒) -1(X轴-1表示中间) -1(Y轴-1表示中间)
7700FFFF(RGBA颜色值:红、绿、蓝、透明度 16进制2位表示)

  loopcmd 1 120 localmsg "You're watching HLTV. "5 -1 0.9
FFA000FF

  // 设置客户端的语音部分

  signoncommands "voice_scale 2; voice_overdrive 16; volume 0.5;
echo Voice adjusted for HLTV"

  录制录像的命令

  record *** 录制文件名为***_1的demo. 他在你的cstrike目录下

  用stoprecord命令来结束demo的录制

  当你开始运行hltv以后,他会自动不断地连接你所选择的服务器,每三秒
一次,直到连上为止。掉线也一样,他会自动将你得demo分段进行录制。

服务器反作弊插件

  仅以著名的反作弊插件Cheating-Death和WWCL为代表,简述反作弊插件的安装方法。

  首先需要安装metamod插件,将metamod.dll或metamod_i386.so解压到cstrike目录下的dlls目录中。

  用记事本打开cstrike目录下的liblist.gam文件。

  原文件内容为:

  game "Counter-Strike"

  url_dl ""

  version "1.5"

  size "184000000"

  svonly "0"

  secure "0"

  type "multiplayer_only"

  cldll "1"

  hlversion "1110"

  nomodels "1"

  nohimodel "1"

  mpentity "info_player_start"

  gamedll "dlls/mp.dll"

  gamedll_linux "dlls/cs_i386.so"

  trainmap "tr_1"

  修改gamedll行,保存得到新的liblist.gam文件,注意做好备份工作,这个文件至关重要。

  gamedll "dlls/metamod.dll"

  gamedll_linux "dlls/metamod_i386.so"

  然后在cstrike目录下创建一个文本文件保存为metamod.ini文件。

  安装C-D.

  将C-D服务器端解压到cstrike目录下,一般是一个addons文件夹。

  在metamod.ini文件中添加这样的命令行

  win32 addons/cdeath/cdmod.dll

  linux addons/cdeath/cdmod_i586.so

  保存后,运行服务器,将加载反作弊插件Cheating-Death,在服务器的DOS窗口中可以看到加载C-D的提示。

  安装WWCL.

  将WWCL服务器文件解压到cstrike目录下,一般是一个addons文件夹和一个wwclconfig.cfg文件。

  在metamod.ini文件中添加这样的命令行

  win32 addons/wwcl/dlls/pcawwclconfig_mm.dll

  linux addons/wwcl/dlls/pcawwclconfig_mm_i386.so

  保存后,运行服务器,将加载反作弊插件WWCL.

 

MMORPG游戏开发入门

 

 

原著:Radu Privantu
翻译:pAnic

  
  译者序:这是一篇讲解如何开发一款MMORPG的入门文章,作者本人也是一款游戏的开发者,文中的内容源于实践,有很高的参考价值。很多人都想拥有自
己的游戏,这篇文章对那些想自己开发游戏的人来说可能是一纸福音,也可能是一盆冷水。无论如何,开发游戏都不是一件简单的事情。以下是翻译正文:

  

  文章的中心是如何起步开发你自己的大型多人在线角色扮演游戏( 原文:Massive Multiplayer Online Role
Playing Games) (MMORPG)(译者注:俗称:网络游戏,网游)。针对的读者是经验和资源有限的开发者。
读完文章之后,你应该懂得如何起步,
还有一些关于什么是应该做的和不应该做的忠告。第一步是评估你的能力和资源。你必须对自己诚实,因为做你力不从心的事情会浪费你的时间并让你心灰意冷。

  
  第一步:评估你的能力
  
必须的技能:
  
  1、懂至少一种编程语言。 迄今为止, C++因为性能和效率的优越性成为游戏开发者的首选。 Visual Basic, Java
或者 C# 可能也是不错的选择;

  2、熟悉一种图形库。通常的选择是SDL, OpenGL,
或者DX/D3D。(译者注:网上也有很多免费/付费引擎下载和出售);

  3、选择一种网络通讯库。 你可以从WinSock, SDL_net,
或DirectPlay中选择。(译者注:很多人喜欢开发自己独特的网络库,这并不复杂,似乎ACE也是一种选择);

  4、对游戏开发有大体的经验。例如,事件循环,多线程,GUI 设计,等等。
  
强烈推荐的技能:
  
  1、C/S结构通讯;
  
  2、多平台开发。 你可能希望设计一个MMORPG, 尤其是服务器能运行在多种操作系统。为此,我推荐使用SDL, OpenGL
和SDL_net;

  3、网站开发。如果你想让用户通过网站查看玩家统计,服务器信息和其他信息,这是必须的。(译者注:其实网站可以交给其他人开发,如果有必要的话);

  4、安全管理。你当然不想因为有人攻击你的服务器而浪费时间!

  6、团队组织能力。 你需要一个你能成功领导和管理的团队;

  
  第二步:初步规划
  
  我注意到很多人在不同的论坛发帖子寻找团队开发MMORPG。他们中的大部分是这样:“我们成立了一个公司/游戏工作室,需要3个美工,两个程序,1个音乐制作,等等。为了创新,不要看过去的MMORPG,你有全部的自由用来创造你想要的世界,等等。
我们会在项目完成并赚到钱的时候付给你酬劳,等等”。不幸的是,以现有的技术和带宽,你无法拥有一个动态的世界。
朝向无法到达的目标前进只会导致失败。正确的做法是拿出一些小规模的,功能性强的,可扩展的设计和构架。,
  
基本软件构架
  
  首先,尝试创建一个简单的C/S模型,有如下功能:
  
  1、创建一个新角色;
  2、保存那个角色(服务器端);
  3、用那个角色登陆;
  4、能够和其他人交谈;
  5、能在3D空间游览;
  
  保存角色看起来简单,其实不然。 例如,有两种方式保存角色:使用数据库服务或者使用文件。两者有各自的优缺点:

 

数据库 文件
优点
  • 添加新域或者修改现有的都很简单。
  • 更新玩家统计数据非常简单(从游戏外)。
  • 你可以通过SQL查询方便的获取不同种类的统计结果。
  • 无需自行完成I/O操作,数据库会替你做好。
  • 易于更新/恢复。
  • 高速操作(读/写)。
  • 实现简单。
  • 无需额外的库。
  • 不依赖数据库服务器。因此你不必担心数据库升级或安全问题。
缺点
  • 容易出错。
    例如,做一个更新查询的时候遗漏了''where''子句。会导致惨痛的损失,尤其是你没有备份的时候。
  • 数据库会比打开/写入一个玩家档案文件慢。你查询一些数据的时候会耗费几个毫秒,尤其是大量玩家同时登入/登出的时候。
  • 需要额外的代码进行游戏和数据库间的数据转换。
  • 需要操作数据库和SQL的经验。并且需要一个程序和数据库之间的接口库。
  • 如果因为某些原因数据库文件损坏,那算你倒霉,你可能会丢失所有的玩家数据(尤其是短期内没有备份的时候)。
  • 很难添加新的域,除非一开始就很小心的设计了文件的格式/结构。
  • 没法做全体玩家的查询。(这可以通过每天晚上用程序把重要字段添加进一个数据库间接实现)。
  • 如果你想更新/检查玩家状态,你必须额外写代码。
  • 更新和还原比较复杂。

 

  现在你决定了如何存储角色,你还得选择C/S通讯的网络协议:TCP 还是
UDP?,我们都知道TCP速度慢,但是更准确,并且需要额外带宽。我实际使用TCP并没有遇到什么问题。
如果你有充足的带宽,TCP是个好选择,至少对初学者是这样。 UDP 会很麻烦,尤其是对新手。
记住,游戏或引擎的初步测试会在你的局域网进行,所有的包都会按顺序依次抵达。在Internet上无法保证这一点。虽然包会按顺序到达,但是有时候会丢包,这通常是个麻烦事。
当然,你可以设计你的协议使得C/S能够从丢包中恢复。但这对初学者来说很痛苦,不值得推荐。

 

第三步:选择数据传输协议
  
  又是看起来很简单,其实不然。你不能只是发送’’’’结尾的串。因为你需要一个通用的协议,能同时适用字符串和二进制数据。用0(或其他字符)做
结束符是不明智的,因为那个结束符可能是你要发送的数据的一部分。此外,如果你发送20字节,然后再20字节,服务器极有可能收不到两个20字节的包。取
而代之的是,它会一次性收到40字节,为了避免浪费带宽在不必要的头上。
而且,你可以发送1KB的包,但服务器会以两个小包的形式收到它。所以你必须知道哪里是一个包的开始,哪里是结束。在
“永恒大陆”(译者注:原文: Eternal Lands,本文的作者正在开发的一款MMORPG)中,我们用如下的方法:
  
  ·Offset 0: 1 字节 表示传输的命令;
  ·Offset 1: 2 字节,传输的数据长度;
  ·Offset 3: 变长,消息内容;

  这种方法有一致的优点:所有的数据传输有统一的标准。缺点是有些命令有固定已知的长度,浪费了一些带宽。以后我们会改成混合的方法。

  
  下一件事是决定服务器模型: “非阻塞soket,不使用线程”,或者“阻塞soket,使用线程”。两种方法(使用线程 vs
不使用线程)各有优缺点。
  
  线程:
  
  1、服务器响应会更加平滑,因为如果一个玩家需要大量时间(例如从数据库中读取数据),这会在它自己的线程中完成,不会影响其他人。(译者注:也许作者的意思是每个玩家都有独立的线程,但这对MMORPG不太现实);

  2、难以恰当的实现和调试:你可能需要大量同步,并且一个小疏忽就会导致灾难性的后果( 服务器瘫痪,物品复制,等等);

  3、可以利用多处理器;

  无线程:
  
  1、实现和调试更简单;

  2、响应速度慢;

  在我的公司,我们使用无线程的方法,因为我没有足够的资源和人力处理线程模式。
  
  第四步:客户端

  
  你打算做2D还是3D游戏?有些人认为2D游戏做起来简单。我两者都做过,并且我倾向于3D游戏更简单。容我解释。

  2D下,你通常有一个帧缓冲,也就是一个巨大的象素点数组。象素点的格式会因显卡的不同而不同。
有些是RGB模式,另一些是BGR模式,等等。每种颜色的bit数也会不同。只有在16bpp模式才有这个问题。8-bit和24-bit模式简单一些,
但有他们各自的问题(8-bit颜色数太少(256),而24-bit速度更慢)。同时,你需要制作你的精灵动画程序,不得不自己排序所有对象,以便他们
以正确的顺序绘制。
当然,你可以用OpenGL或者D3D制作2D游戏,但通常这并不值得。并不是所有人都有3D加速卡,所以使用3D库开发2D游戏一般会带给你两者的缺
点:不是所有人都能玩,你也不能旋转摄像机,拥有漂亮的阴影,和3D游戏炫目的效果。

  (译者注,目前绝大部分显卡都支持565的16bpp格式,这个也成为目前16位色的业界通用格式,有不少文章和代码都是讲述这一格式下图像处理的,尤其是使用MMX技术)

  3D的途径,正如我所说,更简单。但是需要一些数学(尤其是三角)的知识。现代的图形库很强大,免费提供了基本的操作(你不需要从后到前排列对象,改
变物体的色彩和/或帖图都十分简单,对象的光照会按照光源和它的位置计算(只要你为它们计算了法向量),还有更多)。并且。3D给了你的创作和运动更多的
自由度,缺点就是不是所有人都能玩你的游戏(没有3D卡的人数可能会让你大吃一惊的),并且,预渲染的图片总是比实时渲染的更漂亮。

  (译者注:市面上想买不支持3D的显卡目前很困难,只是高性能的3D卡价格也不低)

第五步:安全
  
  显然,不能相信用户。任何时候都不能假设用户无法破解你精巧的加密算法(如果你使用了的话)或者协议,用户发送的任何信息都要通过验证。极有可能,在
你的服务器上,你有固定的缓冲区。例如,通常有一个小(可能是4k)缓冲区用来接收数据(从soket)。恶意用户会发送超长数据。如果不检查,这会导致
缓冲区溢出,引起服务器瘫痪,或者更坏的,这个用户可以hack你的服务器,执行非法代码。每个单独的消息都必须检查:缓冲区是否溢出,数据是否合法(例
如用户发送“进入那扇门”,即使门在地图的另一端,或者“使用治疗药水”尽管用户没有那种药水,等等)。
我再次强调,验证所有数据非常重要。一旦有非法数据,把它和用户名,IP,时间和日期,和非法的原因记录下来。偶尔检查一下那个记录。如果你发现少量的非
法数据,并且来自于大量用户,这通常是客户端的bug或者网络问题。然而,如果你发现从一个用户或者IP发现大量非法数据,这是明显的迹象表明有人正在欺
骗服务器,试图hack服务器,或者运行宏/脚本。同时,决不要在客户端存储数据。客户端应该从服务器接收数据。换句话说,不能发送这样的消息“OK,这
是我得物品列表”或者“我的力量是10,魔法是200,生命值是2000/2000”。
而且,客户端不应收到它不需要的数据。例如:客户端不应该知道其他玩家的位置,除非他们在附近。
这是常识,给每个人发送所有玩家会占用大量带宽,并且有些玩家会破解客户端从中获取不公平的利益(像在地图上显示特定玩家的位置)
  
  (译者注:就像传奇的免蜡烛外挂)。所有这些似乎都是常识,但,再次,你会惊奇的发现有多少人不知道这些我们认为的常识。
    
  另一个要考虑的问题,当涉及到安全:玩家走动的速度必须在服务器计算,而不是客户端。
  
  (译者注:这是重要的原则,但是会耗费大量服务器资源。魔兽世界没有这样做,它采用类似其他玩家揭发的形式掩盖这个事实,导致加速外挂可以用,但是在有其他玩家的时候会暴露)。

  
  服务器应该跟踪时间(以ms为单位)当客户最后一次移动的时候,并且,移动的请求如果比通常的极限更快到来,这个请求应该被抛弃。不要记录这类虚假请求,因为这可能是因为网络延迟(也就是玩家延迟,过去的10秒内发送的数据同时到达了)。

    
  检查距离。如果一个玩家试图和100亿公里以外的玩家交易(或者甚至在另一张地图上),记录下来。如果一个玩家试图查看,或者使用一个遥远的地图对
象,记录它。小心假的ID。例如,正常情况下每个玩家都会分配一个ID(ID在登陆的时候分配,可以是持久的(唯一ID)。
如果ID在玩家登陆的时候赋予9或怪物被创建的时候),显然可以用玩家数组(保存玩家)的位置(索引)作为ID。
    
  所以第一个登陆的玩家ID是0,第二个是1,依此类推。现在,通常你会有一个限制,比如说2000个索引在玩家列表里。所以如果一个客户端发送一条命
令类似:“查看ID200000的角色”,这会使服务器当机,如果没有防备的话,因为服务器会访问非法的内存区域。所以,一定要检查,就像这样:
"if actor id<0 or if actor id> max
players 然后记录非法操作并且断开玩家。如果你使用C或者C++,注意或者定义索引为’’unsigned int’’
并且检查上限,或因为某些原因定义为int(int,默认是有符号的),记得检查 <0 and
>max
。没有做这些会严重挫伤你和其他用户。类似的,要检查超出地图坐标。如果你的服务器有某种寻路算法,并且客户端通过点击地面来移动,确保他们不要点击在地
图外部。
  
  第六步:获得一个团队
  
  制作游戏需要大量的工作(除非是个Pong and
Tetris游戏)。尤其是MMORPG。你无法单靠自己。理论上,一个完整的团队组成是这样:
  
  ·至少3 个程序员: 1
个做服务器,两个客户端(或者一个客户端,一个负责工具,例如美术插件,世界编辑器,等等)。有6个程序员是最好的,更多就没必要了。这取决于你的领导能
力。最少一个美工,2到3个更合适。如果这是个3D游戏,你需要一个3D美工,一个2D美工(制作帖图,界面,等等),一个动画师,和一个美术部负责人。
美术部应该由有经验的人组织和安排,除非你就是个艺术家。
  
  ·少数世界构建者:创建所有地图是个漫长的过程,
并且直接关系到游戏的成败。再次,你需要一个世界构建部的负责人。你的世界需要协调一致,所以不能只有一个意气用事的人。
  
  ·一个
网站管理员是必须的,除非你精通网站设计,并且愿意花时间做网站。音效和音乐不是必须的,但是有音效和音乐的游戏比没有的会更吸引人。

  
  ·一个游戏经济系统
设计师.。你也许觉得那很简单,可以自己来做,但事实上那是最复杂的工作之一。如果经济系统设计不良(比如物品没有平衡,资源在地图上随意放置,等等。)
玩家会觉得无聊并且退出游戏。我们早期的进展存在很大的问题,尤其是因为经济系统主要是由我(一个程序员)设计的,它没有被恰当的计划。
于是,我们花费了两个月来重新思考和建立一整个新的经济系统。这需要一次完全的物品清除。我告诉你,玩家会很不乐意你删除他们的物品。幸运的是,大部分玩
家赞同这个想法,但是这么多小时的争论,妥协,解释和时间的浪费还是让我们丧气。以后会更多。
  
  如前所说,你需要一个10~15人的团队,不包括协调员和管理者。这10~15人必须是有经验的。如果都是新手就不值得,因为你需要花大量时间解释要做什么,怎样做,为什么他现在的做法不好,等等。

  
  一开始就凑齐10~15人几乎是不可能的。不管你在不同的论坛发多少帖,你也无法找到合适的团队成员。毕竟,如果一个人熟练于他/她的领域,为什么在
你无法拿出任何东西的时候他/她要加入你的团队?很多人有远大的想法,但是实现它们需要大量时间和努力,所以他们宁可从事自己的工作也不会加入你。那如果
你需要10~15人,但是无法让他们加入你的团队,你如何才能制作一款MMORPG呢?
好,事实上,你一开始不需要所有人都到位。你真正需要的是一个程序员和一个美工。如果你是个程序员,只要找个美工就可以了。请求懂美术的朋友帮忙,花钱请
大学生/朋友做一些美术或者其他工作。
  
  现在你有了一个美工,你期待的游戏的样子,现在可以开始实现了。一旦你有了可以运行的C/S引擎,一些用来展示的截图(或者更好,玩家可以登陆你的世
界,四处走动,聊天),更多的人会愿意加入你的团队。更恰当的是,除非你使用独有的技术,否则你的客户端可以开源。许多程序员会加入(作为志愿者)一个开
源工程而不是非开源项目。而服务器不应该开源(除非你打算做一款完全开源的MMORPG)。
    
  其他一些忠告:在有东西可展示之前,不要夸大你的游戏。最惹人烦的事情之一就是一个新手发一个“需要帮助”的请求,要求一个巨大的团队加入他的游戏制
作,解释这个游戏到底有多酷。一旦你拥有了网站广告(通常是在一个免费主机),你会看到一个吸引人的导航条,包含“下载”,“截图”,“
原画”(译者注,原文:Concept
art,概念艺术,在游戏应该指美工的原始设计),“论坛”。你点击下载链接,然后看到美妙的“建设中”页面(或者更糟糕,一个404错误)。然后你点击
截图,得到同样的结果。如果你没有东西给人下载,就不要放下载链接。如果没有截图展示,不要放截图链接。然而更好的是,在工程进展10%(程序和美工)之
前,不要浪费时间在网站上。

第七步:打破某些神话
  
  1、你无法制作MMORPG, 只有大公司才可以。
  
  我不同意。虽然制作一款像魔兽世界(World of Warcraft),无尽任务2(Ever Quest
2),亚瑟王的召唤2(Asheron’’s Call 2),血统2(Lineage
2),和其他一些游戏对一个小的自发团队是不可能的,但是做一款像样的游戏还是可以的,只要你有经验,动机,和时间。,你需要1000小时的编程来制作一
个可运行的测试版,大概10~15k小时完成几乎完整的客户端和服务器。。但是作为团队领导者,你不能只编程。保持团队团结,解决争执,维护公共关系
(PR),技术支持,架设服务器,惩罚捣乱分子,自由讨论,等等都是你的职责。你可能会被非编程的任务淹没。你很可能需要上班/上学,这减少了你花费在项
目上的时间。我们很幸运,没有成员离开团队,但是如果这种事情发生,那的确是大问题。假设你的美工半途离开。或者更糟糕,他/她没有给你使用他/她作品的
许可。当然这可以通过和他们签订合同来解决,但找另外一个美工仍然很麻烦。一个工程中有两种不同的美术风格也是问题。
  
  2、需要大笔金钱(通常 4-6 位数) 用来架设一个 MMORPG 服务器.
  
  当然,这不是真的。我见过专业服务器,1000GB/月,不到100美元/月(2~300美元的初装费)。除非你的数据传输协议设计非常不合理,
1000GB/月对一个1000玩家在线(平均)的服务器来说足够了。当然,你还需要另一个服务器做网站和客户端下载(客户端下载会占用大量流量,当游戏
变得流行的时候)。我们的客户端有22MB,有时候会有400GB/月的传输量。而我们还没有很流行(仍然)。另一件事,我们不需要另一台专用服务器开启
这个工程。ADSL/cable服务器可以胜任,直到你的同时在线人数达到20~30。然后要么找一个友好的主机公司,用广告交换免费主机,要么就只能自
己掏腰包了。
  
  3、制作一个MMORPG很有趣。
  
  这不是真的。你可能认为每个人都会赏识你,玩家会支持你,你标新立异,并且,当然,很多玩家都玩你的游戏。玩家可能让人讨厌。即使是完全免费的游戏,
他们也能找到理由抱怨。更糟糕的是人们经常会抱怨矛盾的事。战士会抱怨升级太难,商人会对战士掠夺大量钱财很失望。如果你减少怪物掉落物品,有些玩家就会
威胁说要退出游戏。如果你增加,同样的一群人会不满新手能更简单赚钱的事实。
真是左右为难。改革和改进是必须的。如果你决定改变某些东西,例如给加工物品增加挑战性,有些人会说太难了。如果你不做,他们又会说太简单无味。你会发现
满意的玩家通常不会说什么并且感到满意,同时破坏者会怨声载道。
    
  MMORPG的经济比单机版难以平衡的多。在单机游戏,你可以逐渐改良武器,只要玩家进展,他/她可以使用更好的装备,丢弃(或者卖掉)旧的。另一方
面,在多人游戏里,这种观点不成立,因为每个人都试图得到最好的武器,而跳过低等级武器。大部分玩家宁可空手省钱,直到他们能买游戏中最好的武器。经济系
统设计要参考相关的文章。
    
  迄今为止我列举的所有事情,加上额外的工作和挑战,足以让你在决定涉足这个工程之前三思而行。你必须知道你的决定意味着什么。
  
  总结
  
  希望这篇文章能给你足够的知识。我的下一篇文章将介绍如何建立一个经济系统(更明确的,要避免哪些错误),还有一些调试服务器和客户端的信息。

  
  关于作者

  
  这篇文章作者是 Radu Privantu, 永恒大陆(Eternal Lands) www.eternal-lands.com的主程序和项目规划,
永恒大陆是一款免费,客户端开源的MMORPG。