引擎图包
- 图片序列编号
- 美术不用起名
在游戏制作中往往一套新的物件图片诞生过程是美术先行之后程序配合的,也就是说图片的名字要由美术先起。但名字在程序使用时是有固定规则的,并且每一个名字的规则都不相同。程序不可能事先告知美术每一个名称的规则,因为程序在没有编码到那一步之前他也不知道规则是什么。而美术是先于程序制作的并且保存图片时必须要起名,那么美术把图片给到程序手中时名字已经起好了,这些名字又不符合程序的使用规则,那程序就只能对这些图片重新起名了。重新起名的工作量大而且没意义,它还会导致被程序改过名的图片回交给美术时美术与自己制作的原始图片对应不上而找不到对应的psd原图。
举个例子,你说“小木屋”的图片名字应该叫什么呢?“WoodenHouse”?但我告诉你,程序会把名字起为“HouseWooden”。这是程序为了方便类型密集排列,因为还会有“HouseIron”和“HouseGlass”等等。当前面的三个名字与我后面写的“WallWooden”和“WallIron”这两个名字排列在一起时,你会发现相同的事物在排序后是紧挨在一起的。
在图片序列编号的模式下,美术想添加新图片时只要在图包的末尾按连续序号依次添加即可。最重要的是这个过程不用与程序实时沟通,可以实现并行工作。
- 程序不用频繁改代码
程序在使用图片时要在代码中写上相应的名字才能加载相应的图片,也就是说每多加一张图片程序就要多写一段代码。这还不是最糟糕的,最糟糕的是每废弃一张图片程序就要删除一段代码,不删除就会导致程序崩溃。图片序列编号后因为所有图片都没有了五花八门的名字而取代之的是有规则的连续编号,所以一个图包只要一段代码就能完成整体的加载,如果包中图片废弃被删除,引擎在渲染不存在的图片时会自动用本包中的零号图片代替。这样一来美术在没有程序配合的情况下换包中图片时怎么也不会遭遇因程序崩溃而无法判断哪里出错的情况。
举个例子,你说“围墙”改叫“栅栏”后会怎么样?在程序的前期我们为虚拟世界设计了围墙,当时的外观是石头材质。后来世界升级了,我们又制作出了更坚固的围墙,这个更坚固的围墙用石头材质更合适,而先前的那个围墙改成木头材质就完美了。这样一来我们要做的工作就是把先前那个围墙外观改成木头材质,把新添加的围墙外观改成石头材质,那先前的围墙就要改名为“栅栏”了。这种情况如果是用名字来定位图片,改过外观后,图片里画的是木栅栏而名字叫“围墙”这就很难受了。改名就要改程序,不改名人类大脑又无法接受。
在图片序列编号的模式下,原来000080.png画的是石头材质围墙,后来画的是木头材质栅栏,但编号本身没意义,所以人类大脑也可以轻松接受这种改变。
- 程序定位简单
一个图包中最多可以承载65536张图片,假设我们要存放1百个怪物的图片,每个怪物有1千张图片,那么图片总数就是10万。我们为了方便描述算法,只在每个图包中存放1万张图片,所以我们共需要10个图包“Monster00.sil ~ Monster09.sil”。怪物的编号是0~99,一共100个。现在我们来看第89个怪物的起始图片是如何定位的,它的算式为“89×1000=89000”定位起始图片绝对编号,“89000÷10000=8”定位包名“Monster08.sil”,“89000mod10000=9000”定位包内图片名“009000.png”。在这种算法下,怪物个数无限增加,程序处理丝毫不用变动。
- 用移位来解决图片空位不足
图片没有名字只有编号,所以它的编号改成什么数值都无所谓,因为编号本身没有对应的实际意义。假设我们在游戏开发前期玩家人物只有5张图片“面朝上、面朝右、面朝下、面朝左、尸体倒地”它们的图片是“000080.png ~ 000084.png”,后期我们要把人物每个方向的图片都改成有10张图片的动画序列帧,很显然这时如果“000084.png”后面的“000085.png”是其它物件的图片时我们的空位就不足了,这时我们就要把“000080.png ~ 000084.png”移动到图包的尾部去。假如这时的图包尾部最后一张图是“000999.png”,那么移动后的人物图片就是“001000.png ~ 001004.png”,每张图片变成10张序列帧后,图片的编号将变成“001000.png ~ 001049.png”。最终的图片排序是“面朝上001000.png ~ 001009.png、面朝右001009.png ~ 001019.png、面朝下001019.png ~ 001029.png、面朝左001029.png ~ 001039.png、尸体倒地001039.png ~ 001049.png”。这种移位方法由于只变动了人物的编号,其他物件图片没有变化,所以程序中只要修改两个数值就能配合这个变动,第一修改起始编号80为1000,每二修改帧动画张数1为10。
图片移位有专用的第三方工具可以实现批量改名。
- 用预留空位来处理序列帧
在开发过程中我们可能会遭遇个别建筑有动画的情况,比如烟囱里冒烟的房子。假设我们有10座房子,只有一座是有烟囱的,冒烟的动画有8帧。我们可以给每座房子留出10张图片的空位,有烟囱的房子用8张,其余房子只用1张。这样就可以用同一套图片定位算法去处理有无动画两种情况的房子了。
- 使用图片序列编号的游戏举例
传奇2 WIL包 WIL编辑器 WIL图片提取
帝国时代2 DRS包 DRS编辑器 SLP包 SLP编辑器 SLP图片提取
- 一次性打包解包工具
- 浏览
一次性解包工具可以把一个sil包里所有的图片解到一个文件夹中,我们利用windows资源管理器自身的功能就可以浏览图片并查看图片的各种属性。这样就省去了自制浏览工具的麻烦,而且美术也不会有学习工具用法的烦恼。由于时间有限并且工作量巨大,程序员不可能作出完美的浏览工具,所以自制浏览工具的方案既不方便又影响整体工期。图片散在文件夹中的情况,我们可以利用能运行于windows上的第三方工具对图片进行批量改名和缩放等操作。
- 查找
我们利用windows资源管理器自身带的搜索功能就可以用缩略图方式查看搜索结果。如果不满意windows的搜索效果,还可以利用第三方工具。
- 提交到代码仓库
我主要用的代码仓库是SVN,这个玩意很怕提交时文件数量过多,但不怕单个文件尺寸过大。当年翻版传奇2时一次要提交10万张图片,SVN几个小时都完成不了提交,因为文件太碎了。如果是把这10万张图片放到sil包中,有10个包就全搞定了,而且包中的容积也未用满。