主讲老师:Flash游戏开发大师Gary Rosenzweig

指定教材:《ActionScript 3.0游戏编程(第2版)》

参考书:ActionScript 3.0 Game Programming University, Second Edition 及其他

学习时间:2010.09~2010.10

历时一个月,我的AS3游戏编程课终于结束了。应该说,过程比我想象的要顺利一些。我喜欢游戏,包括Flash游戏,也曾学会一阵子Flash,但从来没有研究过如何开发Flash游戏。因此,上课前心情还是有些紧张的。好在,Rosenzweig不愧为个中里手,其讲解由浅入深、层次清晰,连我这样一个Flash菜鸟也能从中收获颇丰。

本课程内容丰富,Rosenzweig一共讲了25个完整的游戏示例。这些游戏类别多种多样,包括记忆游戏、射击类游戏、图片拼图、休闲游戏、文字游戏和动作类游戏等。甚至,还有3D游戏,Nothing is impossible,Rosenzweig就用了一整节课讲解如何用Flash制作3D游戏,道出了在2D环境营造3D效果的多种技巧。

不过,由于自身的水平及玩游戏的经历,我印象最深刻的还是同色消除游戏(国内常称为“对对碰”)。这款游戏有两大要点:一是查找匹配,即在游戏板上找到所有的匹配;二是寻找可能的移动,即寻找在进行交换后能连成3连的匹配。

为查找匹配,需要用到两个函数:getMatchHoriz和getMatchVert函数。getMatchHoriz函数有特定的运行步骤。传入一行和一列,它会判断下一个小块是否与当前小块类型匹配。如果匹配,就添加到一个数组中。它会不停的在水平方向进行判断,直到发现不匹配的小块。这时,它就返回得到的数组。如果当前小块与下一个小块就不匹配,这个数组就只有一个元素,就是当前小块。如果它们匹配,而再下一个小块也与它们类型相同,那么这个数组就会包含3个小块:

// 从当前点开始寻找水平方向的匹配 
public function getMatchHoriz(col,row):Array {
    var match:Array = new Array(grid[col][row]);
    for(var i:int=1;col+i<8;i++) {
        if (grid[col][row].type == grid[col+i][row].type) {
            match.push(grid[col+i][row]);
        } else {
            return match;
        }
   }
   return match;
}

getMatchVert函数几乎与getMatchHoriz函数相同,只是它沿着列进行匹配搜索。

而为寻找可能的移动,需要考虑两种模式:2+1和中间。2+1模式是指两个相同小块相连,要在它们的某一端找一个相同的小块。中间模式是指两个小块相间一个,要在它们中间小块的两边找一个相同的小块。这两种模式都是垂直和水平两种情况。以下是寻找可能的匹配的lookForPossibles函数:

// 查看游戏板上是否有可能的匹配 
public function lookForPossibles() {
    for(var col:int=0;col<8;col++) {
        for(var row:int=0;row<8;row++) {
            // 水平方向上,2+1模式 
            if (matchPattern(col, row,
                   [[1,0]], [[-2,0],[-1,-1],[-1,1],[2,-1],[2,1],[3,0]])) {
                return true;
            // 水平方向上,中间空缺
            if (matchPattern(col, row, [[2,0]], [[1,-1],[1,1]])) {
                return true;
            // 垂直方向上,2+1模式 
            if (matchPattern(col, row,
                   [[0,1]], [[0,-2],[-1,-1],[1,-1],[-1,2],[1,2],[0,3]])) {
                return true;
            // 垂直方向上,中间空缺
            if (matchPattern(col, row, [[0,2]], [[-1,1],[1,1]])) {
                return true;
            }
        }
    }
            // 没有发现可能的移动 
            return false;
}

一千个读者就有一千个哈姆莱特,同样,不同水平的学习者对本课程也会有不同层次的理解。期待您和大家一起分享自己的收获与体会。

(本文作者为本书执行编辑,所谓学习过程也是编辑过程。)