一堂豐富的AS3遊戲程式設計課

walkee發表於2011-10-18

主講老師: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;
}

一千個讀者就有一千個哈姆萊特,同樣,不同水平的學習者對本課程也會有不同層次的理解。期待您和大家一起分享自己的收穫與體會。

(本文作者為本書執行編輯,所謂學習過程也是編輯過程。)

相關文章