目录 ~ IPel
!V<c:6"
2 游戏实践讨论 <OX_6d *@
2.1 制作概况 R,]J~TfPK
2.2 模块划分 MK"p~b0->
2.3 游戏引擎 9'1XZpM1
2.4 关键讨论 ~3f`= r3/.
2.5 希望 /wt!c?wR
z|KQiLza
Ptt
2 游戏实践讨论 ;Jh=7wx
ss{y=O%9"
现在有很多人对国产游戏事业是又爱又恨的。爱的是希望能够出现一批真正属于我们自己的好游戏,恨的是这些游戏制作者们太不争气,到现在也没有做出来。我非常感谢他们,因为假如没有他们,也就没有了我们。我也感到非常抱歉,因为我们的作品目前还不能让人们满意。我想多说什么都是无用的,只有实事才能说话。前面我所说的大多是理论上的内容,是我们在几年的游戏制作过程中总结出的经验。这些内容有些可能是错误的,因为我们还没有从正面证明它,有些对我们至今仍然只是个美好的愿望,我们自己还没有真正做到。所以请大家在阅读时针对自己的情况进行取舍。 {RG4 m{#9
下面我利用我们曾经做过的一个游戏,具体分析它的制作过程和制作方法。希望借此为那些关心游戏制作的人提供尽可能多的材料,让他们了解得多一些。也为那些有志于游戏制作的人提供一些经验和教训,让他们少走一些弯路。要说明的是,我们在处理某些问题的时候,所使用的方法很可能是非常普通的,甚至是笨拙的,别人看来可能有更好的办法。但是我不想与各位争论,假如您有什么更好的想法和办法,就把它用到你的游戏中去吧,我希望每一个喜爱游戏制作的人都能够制作出更好的游戏来。 UY(pKe>
@u@N&{b5"
2.1 制作概况 kGz0`8URu
<赤壁>作为瞬间工作室成立以来的第一个作品,是1997年7月上市的,这个版本称作标准版。其后增加了网络功能,修改了一些Bug,增加了一些游戏事件,被称作增强版,增强版于1997年底上市。在此期间,我们又制作了日文版,韩文版和繁体版,又为国内的OEM厂商制作了相应的版本。据说<赤壁>全部的销售量超过了十万份,其中零售量超过一万五千份。这是与前导公司所有员工的努力分不开的。 xqZZ(jZ
}da}vR"iL
<赤壁>的策划工作开始于<官渡>制作的后期,1996年6月。而程序开始的时间要晚一些,在1996年9月。那时侯我们碰巧见到了另一部国产游戏<生死之间>的早期版本。这给我们的震动非常大,因为这两个游戏的类型比较接近,而我们才刚刚开始这个游戏的制作而已。从程序开始动工,到第一个版本发行,一共9个月,先后参与程序编写的程序员有5人,总的工作量大约40个人月。程序代码的总量约为90000行,2.6MB。大部分用C++编写,少部分由C和汇编编写。我们使用Microsoft Visual C++ 4.0编译<赤壁>标准版,Microsoft Visual C++ 5.0编译<赤壁>增强版。可执行文件大小约为500多KB。 V-1H(wRu
m`;dFL7"E
<赤壁>的工作进度如下: ~J~@mE2ks
程序设计期:1996年9月初至1996年11月底。 hg2a,EU\Z
底层制作期:1996年12月初至1997年2月底。 9Dat
oi
游戏编写期:1997年3月初至1997年5月底。 V(lxkEu/Fj
游戏测试期:1997年6月初至1997年6月底。 !6`pq
PZ#\O
日文版: 1997年8月。 `\p5!Iq
Q
OEM版: 1997年9月。 QL].)Vgf
韩文版: 1997年11月。 QPD[uJ(I
繁体版: 1997年12月。 `>HM<Nn-0
增强版: 1997年12月。 !t;B.[U *
%qycxEVP
需要说明一点:那就是我们的所有程序全部都是自己完成的,没有使用任何其他人其他公司提供给我们的代码。要知道,我们公司当时还没有能力去购买国外的游戏引擎,而我个人连SoftICE都不会使用,更不要说跟踪研究别人的代码了。我们对别人的学习方式非常简单和直接,就是观察。通过观察猜测它所使用的方法,然后考虑自己如何把它实现。这可能是我想到的最笨的一种方法,如果一个程序员能力强,在制作游戏以前,详细分析了解别的游戏的算法我想一定是非常有用的,他在制作游戏时一定可以节约不少走弯路的时间。 \GF9;N}V
另外,我们对<赤壁>的测试时间也是很短的,在程序基本稳定之后,我们大概只剩下两个星期左右的时间。所以有很多Bug。 5WlBec@
q0m>NA
2.2 模块划分 E;o
"^[we
]QJN` ;b0
赤壁的程序分成五个大的部分和19个模块: nB|m!fi<
显示模块 TPBL|^3K
战场显示模块 &.v|yG]&
分为通用显示底层和游戏战场显示。 ,(;T V_@$
通用显示底层是基于DirectDraw的一套函数。 G7qB
有关内容请详见DDApi.h, DDCompo.h。 tM:%{az
su}n3NsJ
游戏战场显示是根据游戏单元的类型,位置,状态,动画帧等数据将单元位图以适当形式显示在战场的适当的位置上。要显示的内容有:地形,单元(士兵/建筑/将领),攻击效果,魔法效果,远程武器物体,阴影等。 y/.I<5+Bu
主要功能有:对图素的压缩和读取,图像的显示,单元归属颜色的转换,边界剪裁,遮挡关系,缩略图显示和响应,屏幕移动,阴影遮挡判断,攻击效果,魔法效果,远程武器物体的显示和移动。 v1R t$[
有关内容请详见CBDraw.h, 显示单元的位图 GG=R!+p2
CBDrawM.h, 显示特殊效果,比如水。 6f'THU$
CBDrawOT.h, 显示特殊物体。 -f-@[; D
CBMini.h, 显示缩略图。 w/oXFs&FK
CBMap.h, 图素的操作。 5/E7@h ,
CBShadow.h, 阴影的计算和显示。 Pb]EpyAW
CBOther.h, 特殊效果的显示和计算。 2(i@\dZCb<
b(HbwOt~3
界面显示模块 v =]!Po&Q-
根据游戏设计需要,在显示器相应的位置上显示游戏的各层界面。 Hob n{E
它分为两个部分:界面底层部分和游戏界面部分。 rw }wQP_'
界面底层是属于底层部分的通用函数库。它包括按钮,对话框,滑块,检查框等界面元素的实现。 EyDH-}Y
有关内容请详见DDBitmap.h, 显示位图的基类。 NI^jQS
M]
DDButton.h, 按钮。 }8LTYn
DDCheck.h, 检查框。 4(D1/8
DDList.h, 列表框。 s?yl4\]Muf
DDMenu.h, 菜单。
PKg>|]Rf.
DDScroll.h, 滚动条。 @Rw]boC
DDText.h, 文字。 '89nyx&W
$/FL)m8.3
游戏界面主要有:游戏主菜单,新游戏菜单,读取进度菜单,保存进度菜单,网络选择菜单,系统设置菜单,任务提示菜单,结束菜单,错误处理对话框等。 GlOSCJZ
有关内容请详见Interfac.h, 提供基本的游戏界面接口函数。 DX(!G a
Interfa1.h, 处理所有的按钮Button信息。 T1U8ZEK<iu
Interfa2.h, 处理所有鼠标操作发出的消息。 x:E:~h[.^
net_face.h, 网络部分界面。 }8Yu"P${Y
Marco.h, 所有按钮的消息ID。 IJk<1T7:(W
CBprompt.h, 游戏战场中屏幕右方信息的显示。 ^//`Dz
CBAarray.h, 对游戏元素的查询。 v\G+t2{
DDComUn.h, 针对游戏中下达命令时的命令组。 M\D25=(
IIY3/
过场动画模块 1~ZFkcV_C
显示公司标志,制作群,历时回顾,片头,片尾和过场动画。 nc9sfH3
它有两个部分,第一是播放视频图像,第二是调用其它进程。 5_[we1$P
有关内容请详见CBAvi.h, 视频图像的播放。 y[DS$>E
Mciapi.h, 播放AVI文件的底层函数。 [;pL15-}4
VCMApi.h, 高效率的播放AVI的底层函数。 )ZMR4U$+v
CBGame.h, 播放结尾。 'pHxO,vo
Interface.h, 程序状态的转换。 fo_*Uva_
*q*$%H
单挑显示模块 nC5]IYL|
武将单挑时出现的专门画面。本部分与原始设计有出入,原始设计中可以对单挑进行操作,后来删减称为只播放一段Video。有关内容请详见CBAvi.h。 HXb_k1n
D}OhmOu3
控制模块 f/vsf&^O
鼠标控制模块 YZZog 6%
根据鼠标的位置设置鼠标的形状,对鼠标的操作对响应单元发出命令。 71c(Nw~iQ
主要内容有:鼠标点击检测,目的地模式,命令构造,可建造区域判定,鼠标形状转换。 hiw>Q7W
鼠标点击检测,主要判断鼠标点击的位置是否在某个单元上或地形上。详见CBMouse.h。 rAZ~R PrW
目的地模式,主要控制鼠标选择了单元(命令主体)后,可能对单元下达的命令的模式,根据不同的命令可能需要不同的目的地类型和命令参数。详见CBCtrl.h。 x-s\0l
命令构造,通过鼠标的点击选择或按下某个,命令按钮,构造出具有命令主体,命令ID和命令客体的命令,放到命令队列中,供执行。详见CBCtrl.h。 ^IqD^(Kb
可建造区域判定,在建造建筑时需要判断哪里可以建造哪里不可以, 并且显示出来。详见CBBuild.h。 4O7
{a
鼠标形状转换,鼠标移动到某个界面或某个单元上时,或处于命令构造阶段时,需要对鼠标的形状做一定的改变,以显示当前的操作状态。详见CBMouse.h。 UgTgva>?
F13vc~$Ky
命令处理模块 Gx;-1
根据鼠标和人工智能发出的命令,传送给对象单元,并将其转化成为单元的相应状态序列。 IqCh4y3
根据单元状态,判断单元状况,更改单元的状态。 }$` PZUw>
详见CBCtrl.h, 命令的构造保存和传递。 Xu7lV
CBRun.h, 命令的执行。 nk"nSXm3SR
CBRDelay.h, 命令执行时需要的一些变量。 4"s/T0C
/pL'G`
攻击计算模块 I_is3y0
根据敌我双方的攻防力量,计谋的实施和阵型计算每一次打击敌人生命的损失。 gTk*v0WBm
详见CBRun.h, 攻击计算。 L}VQc9"gc
CBZhenFa.h, 阵法计算。 Qov*xRO6
"""pe+Y
行军控制模块 kZ'wXtBYe
根据单元的位置,速度,目的地和地形数据,计算行军路线,设置单元的下一步。详见March_n.h。 NEt_UcC
6E$ET5p&