紧接着上一节,首先得解释一下为什么需要将这272张图片合成为一张大图。因为如果游戏中还有装备、坐骑等其他设置,那么我们就需要对图片源进行时时的合成;同时对272张甚至更多的图片进行合成效率高还是对2张大图进行合成效率高这是显而易见的。在本节例子中,主角由身体(衣服)及武器两个部分组成;因此,我们还需要定义一个交错数组来保存已经加载的角色装备合成图到内存中:
/// <summary>
/// 角色图片缓存
/// 交错数组示例PartImage[a,b][c,d]
/// a为衣服代号(在本例中也可以理解为身体代号,因为换衣服就相当于换角色身体)
/// b为武器代号
/// c为角色朝向代号
/// d代表当前动作帧所处于整合图中的列数
/// 本例中1-5列为站立,6-13列为跑动,14-20列为攻击,21-26列为施法,27-34列为死亡
/// 本例中PartImage = new BitmapSource[10, 20][,];即初步设定有10个角色,20种武器
/// </summary>
public static BitmapSource[,][,] PartImage = new BitmapSource[10, 20][,];
例如PartImage[0,6]即代表0号角色拿着6号武器8个方向所有动作帧图片源
PartImage[4,0]则代表4号角色空着手8个方向所有动作帧图片源
……依此类推
如果您的游戏中还有帽子及坐骑,则需要BitmapSource[,][,,,] PartImage这样将第二组定义为4维数组。
……依此类推
当然,你也可以使用Hashtable(哈希表)、Dictionary(字典)等来代替PartImage[,][,]。但是在数字类型键与对象值对应保存的方式中,我更倾向于交错数组,因为它更清晰、优雅且高效。
有了承接角色的载体,下面就是如何对上一节中合成的角色大图与武器大图(提取及合成方法同上一节相同)进行拼装,最后分帧存储进PartImage。嘿嘿,又现精华:
/// <summary>
/// 拼装角色+装备后切割成系列帧图片并保存进内存(装备角色)
/// </summary>
/// <param name="Equipment">装备代号数组</param>
/// <param name="rowNum">帧合成图行数</param>
/// <param name="colNum">帧合成图列数</param>
/// <param name="totalWidth">帧图合成后总宽</param>
/// <param name="totalHeight">帧图合成后总高</param>
/// <param name="singleWidth">单帧图宽</param>
/// <param name="singleHeight">单帧图高</param>
/// <returns>如果缓存中有则读取缓存,否则返回合成的图片源</returns>
public static BitmapSource[,] EquipPart(int[] Equipment, int rowNum, int colNum, int totalWidth, int totalHeight, int singleWidth, int singleHeight) {