AIR Android:編寫(xiě)主類Main(1)
編寫(xiě)主類Main
接下來(lái)編寫(xiě)主類Main的代碼。按照之前的設(shè)計(jì),主程序主要有以下兩個(gè)功能:
創(chuàng)建棋盤(pán)
處理用戶的交互動(dòng)作
下面先來(lái)實(shí)現(xiàn)***個(gè)功能。
1.創(chuàng)建棋盤(pán)
上一節(jié)使用了二維矩陣來(lái)描述地圖數(shù)據(jù),其實(shí)編寫(xiě)代碼沒(méi)那么復(fù)雜,直接用一個(gè)二維數(shù)組就可以實(shí)現(xiàn)這個(gè)功能,代碼如下:
- var gameMap:Array = new Array();
- //每一行用一維數(shù)組來(lái)表示
- gameMap[0] = [BLACK, WHITE, WHITE, BLACK];
- gameMap[1] = [WHITE, BLACK, BLACK, WHITE];
- gameMap[2] = [WHITE, BLACK, BLACK, WHITE];
- gameMap[3] = [BLACK, WHITE, WHITE, BLACK];
BLACK和WHITE是兩個(gè)常量,這樣看起來(lái)更直觀。利用數(shù)組,正好將地圖上的信息全面展示出來(lái),從中可以看到每個(gè)棋子的初始狀態(tài)及在棋盤(pán)上的位置,創(chuàng)建棋盤(pán)的工作就變得簡(jiǎn)單多了,如代碼清單2-2所示。
代碼清單2-2 創(chuàng)建棋盤(pán)
- column_number = 4;
- var rowCount:uint = gameMap.length;
- var rowArray:Array;
- var i:uint, len:uint;
- var grid:Grid;
- //棋子的間距
- var space:int = 10;
- //根據(jù)數(shù)組創(chuàng)建棋盤(pán)
- for ( var row:uint = 0; row < rowCount; row++)
- {
- //獲取每一行的數(shù)據(jù)
- rowArray = gameMap[row];
- len = rowArray.length;
- for ( i = 0; i < len; i++)
- {
- //創(chuàng)建Grid,并賦予初始值。GRID_RADIUS常量定義了棋子的尺寸
- grid = new Grid(rowArray[i], GRID_RADIUS);
- //計(jì)算出棋子在棋盤(pán)上的編號(hào)
- grid.id = row * column_number + i;
- //設(shè)置棋子的坐標(biāo)
- grid.x = i * (GRID_RADIUS*2 + space);
- grid.y = row * (GRID_RADIUS*2 + space);
- //將棋子放在一個(gè)容器中,方便管理
- grid_container.addChild(grid);
- //按照編號(hào)將棋子保存在數(shù)組中,待以后查找
- grids[grid.id] = grid;
- }
- }
在創(chuàng)建棋盤(pán)時(shí),使用數(shù)組grids保存了對(duì)所有棋子的引用,且棋子在數(shù)組中的索引和棋子在棋盤(pán)上的編號(hào)一一對(duì)應(yīng),這樣在查找周邊棋子時(shí),只需要計(jì)算出周邊棋子的id即可。
棋盤(pán)創(chuàng)建完畢后,接下來(lái)處理用戶交互動(dòng)作。
2.處理用戶交互動(dòng)作
由于所有的棋子都被放在同一個(gè)容器中,因此可以只對(duì)容器添加監(jiān)聽(tīng)器,而不用監(jiān)聽(tīng)每個(gè)棋子的鼠標(biāo)事件,如代碼清單2-3所示。
代碼清單2-3 處理用戶交互動(dòng)作
- grid_container.addEventListener(MouseEvent.CLICK, onClickHandler);
- private function onClickHandler(e:MouseEvent):void
- {
- //由于沒(méi)有其他地方監(jiān)聽(tīng)對(duì)象的鼠標(biāo)事件,因此中止冒泡事件
- e.stopImmediatePropagation();
- var grid:Grid = e.target as Grid;
- //只有單擊對(duì)象是棋子才執(zhí)行后面的代碼
- if ( grid == null) return;
- //翻轉(zhuǎn)當(dāng)前單擊的棋子
- grid.doFlip();
- //翻轉(zhuǎn)周圍的四個(gè)棋子,用一個(gè)臨時(shí)數(shù)組存放周圍棋子的id
- var ids:Array = new Array(grid.id - column_number, grid.id + column_number);
- //如果棋子是在最左端,則左邊是空的,反之左邊存在棋子
- if ( grid.id % column_number != 0 )
- {
- ids.push(grid.id - 1);
- }
- //如果棋子是在最右端,則右邊是空的,反之右邊存在棋子
- if ( grid.id % column_number != (column_number-1) )
- {
- ids.push(grid.id + 1);
- }
- //記錄下棋子的總數(shù)
- var totalGrid:int = grids.length;
- //循環(huán)數(shù)組,翻轉(zhuǎn)周圍棋子
- for ( var i:uint = 0, len:uint = ids.length; i < len; i++)
- {
- var index:int = ids[i];
- //上面或下面的棋子可能不存在,需要判斷,如果超過(guò)數(shù)組界限,則不存在
- if (index <0 || index >= totalGrid) continue;
- grid = grids[index];
- if ( grid != null )
- {
- grid.doFlip();
- }
- }
- //處理完棋子的翻轉(zhuǎn)后,***檢查當(dāng)前棋子是不是都變白了
- if ( isAllWhite() )
- {
- //game over
- gameOver();
- }
- }