合金弹头技术文案

平台:
利用System.getProperty("microedition.platform")来判断平台类型

I/O
建立流连接的方式很奇怪,经过讨论初步猜测是遇到了什么技术问题因而写出了这么乱七八糟的代码(源引Gameloft Lyman)

protected final InputStream stream_create(String filename){
  InputStream in = getClass().getResourceAsStream(filename);
  while(in == null) in = getClass().getResourceAsStream(filename);
  return in;
}

图片利用GIF89a这种文件格式,下列代码说明一定有图片数据转换工具可以随意转换图片格式
 

byte[] gifdata = new byte[readWord(in)];
    in.read(gifdata, 6, gifdata.length - 6);
    System.arraycopy("GIF89a".getBytes(), 0, gifdata, 0, 6);
    tank_face = Image.createImage(gifdata,0, gifdata.length);

动画:
已经有了动作,帧和Module的概念,也有了碰撞盒子和攻击盒子,但Module数量是写死的,看来动画工具还不够完善

架构
process_set用来关闭状态,转状态和初始化状态,而且调用灵活,这种方式不错
refresh分散在各函数调用,使得游戏结构分散不统一
按键处理在keyPressed直接处理,造成程序结构中有三处switch状态处理,结构比较臃肿。有了key_Statuse把按键部分提出的做法,但还不彻底
mainmenu_execute的命名不错,过去我都写作chooseMenu,呵呵
没有引擎类做支持
process_lock用来控制paint和run是否处理,个人认为没有这个必要

声音:
用诺基亚的声音,处理方式一般

游戏部分:
图像动画:
drawFace是游戏的主要图像显示函数,用alpha_draw里用drawPixels来做淡入淡出是图像显示的亮点
已经有了hero_setaction的概念,但是因为架构在数组上的缘故,所以无法完全将所有Actor统一为setAction接口
在游戏中经常直接操作帧数据,未将动画层完全分离
利用movi_create来创建动画播放是一个比较好的做法

背景:
三层卷动,未用缓冲。back_draw用来画天空背景,fact_draw_back用来画底层地表Tile,fact_draw_fore用做遮挡主角的那部分Tile

关卡
游戏中人为将关卡分段,用plat_next来判断读取存储在plat.bin中的关卡数据,这样可以有效的降低关卡在内存占用量

碰撞检测:
与地形的碰撞主要是采用grid_cellvalue函数来获得,然后做判定、调整,例如:
  if(((grid_cellvalue(x, y - 1) == 1) || (grid_cellvalue(x, y - 1) == 2)) &&
    (grid_cellvalue(x, y - 2) == 0)) hero_pos_y -= 8;
主角未与敌人做碰撞检测,敌人间也可以互相穿梭,未作碰撞检测,大大降低了游戏复杂度和碰撞检测的花费
与道具的碰撞可能是为了加快速度,游戏中未使用统一碰撞函数,而是直接写在各函数内,比如
    if((prop[PROP_POS_X] + (PROP_POS_W >> 1) > hero_pos_x - hero_frectw) &&
      (prop[PROP_POS_Y] > hero_pos_y - hero_frectt) &&
      (hero_pos_x + hero_frectw > prop[PROP_POS_X] - (PROP_POS_W >> 1)) &&
      (hero_pos_y + 11 > prop[PROP_POS_Y] - PROP_POS_H))


利用hero_nexus来做主角于子弹的碰撞检测(为什么不做个统一的碰撞检测函数)
将各种类Actor分类写在各Vector里可以有效减少碰撞判定次数

AI:
敌人根据预先设好的模式属性来做相应的AI,有主角靠近逃跑模式,来回移动等待攻击模式,来回飞行攻击模式等。根据自身模式属性,大体依据与主角距离来产生相应动作。模式是游戏AI较常使用的方式。

技巧:
主角状态常数,分两部分,字节低位大状态,高位字节小状态。然后用&来与大状态做运算,取小状态的做法比较新颖
changeCRC和updateCRC用来计算图片CRC校验码的方式比较实用

架构:
整个架构架构在数组之上,使用常量做标识,各个Actor更像是C语言里的结构类型。

总的来讲合金弹头这个游戏写的还是不错的,注释清楚,各状态转换明确,代码层次结构清晰。但是由于主角未与敌人做碰撞检测,敌人自身也未做碰撞检测,游戏复杂度不高.与彩虹六号、第一滴血、帝国时代等差距相当明显。目前国内的开发水平也可窥见一斑。