AIR Android:编写主类Main(2)

移动开发 Android
第一个AIR Android程序:翻转黑白棋,本模块将编写一个完整的移动小游戏,并把它部署在手机上。因此,我们将亲历一个移动程序完整的诞生过程,从程序设计、代码编写,到最后的安装。在这个过程中会涉及很多Android开发的技术细节,读者也可以近距离感受AIR带来的开发乐趣。本文为大家介绍编写主类Main。

编写主类Main

在翻转周边棋子时,由于要验证棋子的真实性,代码稍显烦琐。总的说来,就是先获取上下两个棋子的id,以及左右存在的棋子的id,然后对棋子进行翻转。

翻转完毕后,判断棋子是否全部变白的代码也很简单。代码如下:

  1.        var grid:Grid;  
  2.         for ( var i:uint = 0len:uint = grids.length; i < len; i++)  
  3.         {  
  4.                 grid = grids[i];  
  5.                 //只要发现有一个棋子不是白色,则表明游戏还没有结束  
  6.                 if( grid.isWhite() == false )  
  7.                 {  
  8.                        //只要一个为false,则表示游戏还没有结束  
  9.                 }  
  10.         }          

我们的游戏只有一关,因此用户过关就意味着游戏结束。gameOver函数中,使用了一个文本框来显示提示信息,由于和程序逻辑没有联系,这里略去不提。

至此,主程序的主要代码介绍完毕,完整的代码见代码清单2-4。

代码清单2-4 FlipIt项目的Main.as文件

  1. package  
  2. {  
  3.   import flash.display.Sprite;  
  4.   import flash.display.StageScaleMode;  
  5.   import flash.display.StageAlign;  
  6.   import flash.events.Event;  
  7.   import flash.events.MouseEvent;  
  8.   import flash.text.TextField;  
  9.   import flash.text.TextFormat;  
  10.   import flash.text.TextFormatAlign;  
  11.     
  12.   [SWF(backgroundColor="#B6B5C1")]  
  13.   public class Main extends Sprite   
  14.   {      
  15.     //使用常量增强程序的灵活性和可读性  
  16.     private const BLACK:Boolean = false;  
  17.     private const WHITE:Boolean = true;      
  18.     private const GRID_RADIUS:int = 30;      
  19.     private var grid_container:Sprite;  
  20.     private var game_tip:TextField;  
  21.       
  22.     //在数组元素的类型确定的情况下,尽量使用Vector,而不用Array,性能更佳  
  23.     private var grids:Vector.<Grid> = new Vector.<Grid>();      
  24.     private var column_number:uint;  
  25.       
  26.     public function Main():void   
  27.     {  
  28.       init();        
  29.     }  
  30.       
  31.     private function init():void  
  32.     {  
  33.       //设置舞台属性,为了自动适应屏幕尺寸,必须设置  
  34.       stage.scaleMode = StageScaleMode.NO_SCALE;  
  35.       stage.align = StageAlign.TOP_LEFT;        
  36.       //创建棋子容器  
  37.       grid_container = new Sprite();  
  38.       addChild(grid_container);        
  39.       //创建文本框,用来显示游戏结果  
  40.       game_tip = new TextField();  
  41.       var tf:TextFormat = new TextFormat("Droid Serif", 24);  
  42.       tf.align = TextFormatAlign.CENTER;  
  43.       game_tip.defaultTextFormat = tf;  
  44.       game_tip.width = stage.stageWidth;  
  45.       game_tip.y = 500;  
  46.       game_tip.selectable = false;  
  47.       addChild(game_tip);              
  48.       //创建棋盘  
  49.       createMap();        
  50.       //将棋盘屏幕居中放置  
  51.       grid_container.x = (stage.stageWidth - grid_container.width) / 2;        
  52.       grid_container.y = 120;          
  53.       //利用事件流的冒泡机制,只监听容器的鼠标单击事件  
  54.       grid_container.addEventListener(MouseEvent.CLICK, onClickHandler);  
  55.     }  
  56.       
  57.     private function createMap():void  
  58.     {  
  59.       var gameMap:Array = new Array();        
  60.       gameMap[0] = [BLACK, WHITE, WHITE, BLACK];  
  61.       gameMap[1] = [WHITE, BLACK, BLACK, WHITE];  
  62.       gameMap[2] = [WHITE, BLACK, BLACK, WHITE];  
  63.       gameMap[3] = [BLACK, WHITE, WHITE, BLACK];  
  64.         
  65.       //列数  
  66.       column_number = 4;  
  67.       //总行数  
  68.       var rowCount:uint = gameMap.length;  
  69.       //临时变量  
  70.       var rowArray:Array;  
  71.       var i:uint, len:uint;  
  72.       var grid:Grid;  
  73.       //棋子的间距  
  74.       var space:int = 10;        
  75.       //根据数组创建棋盘  
  76.       for ( var row:uint = 0; row < rowCount; row++)  
  77.       {  
  78.         //获取每一行的数据  
  79.         rowArray = gameMap[row];  
  80.         len = rowArray.length;          
  81.         for ( i = 0; i < len; i++)  
  82.         {  
  83.           //创建Grid,并赋予初始值。GRID_RADIUS常量定义了棋子的尺寸  
  84.           grid = new Grid(rowArray[i], GRID_RADIUS);  
  85.           //计算出棋子在棋盘上的编号  
  86.           grid.id = row * column_number + i;  
  87.           //设置棋子的坐标  
  88.           grid.x = i * (GRID_RADIUS*2 + space);  
  89.           grid.y = row * (GRID_RADIUS*2 + space);  
  90.           grid_container.addChild(grid);  
  91.           //按照编号将棋子保存在数组中,待以后查找  
  92.           grids[grid.id] = grid;  
  93.         }  
  94.       }        
  95.     }  
  96.       
  97.     private function onClickHandler(e:MouseEvent):void  
  98.     {  
  99.       e.stopImmediatePropagation();  
  100.       var grid:Grid = e.target as Grid;  
  101.       //只有单击的对象是棋子才执行后面的代码  
  102.       if ( grid == null) return;  
  103.       //翻转当前单击的棋子  
  104.       grid.doFlip();  
  105.       //同时翻转周围的4个棋子  
  106.       var ids:Array = new Array(grid.id - column_number, grid.id + column_number);  
  107.       //如果棋子是在最左端,则左边是空的,反之左边存在棋子  
  108.       if ( grid.id % column_number != 0 )  
  109.       {  
  110.         ids.push(grid.id - 1);  
  111.       }  
  112.       //如果棋子是在最右端,则右边是空的,反之右边存在棋子  
  113.       if ( grid.id % column_number != (column_number-1) )  
  114.       {  
  115.         ids.push(grid.id + 1);  
  116.       }  
  117.         
  118.       var totalGrid:int = grids.length;  
  119.         
  120.       for ( var i:uint = 0len:uint = ids.length; i < len; i++)  
  121.       {  
  122.         var index:int = ids[i];  
  123.           
  124.         if (index <0 || index >= totalGrid) continue;  
  125.           
  126.         grid = grids[index];  
  127.         //上面或下面的棋子可能不存在,需要判断  
  128.         if ( grid != null )  
  129.         {  
  130.           grid.doFlip();  
  131.         }  
  132.       }        
  133.       if ( isAllWhite() )  
  134.       {  
  135.         //game over  
  136.         gameOver();  
  137.       }  
  138.     }  
  139.       
  140.     private function gameOver():void  
  141.     {  
  142.         grid_container.removeEventListener(MouseEvent.CLICK, onClickHandler);  
  143.       game_tip.text = "顺利过关!";  
  144.     }  
  145.       
  146.     private function isAllWhite():Boolean  
  147.     {  
  148.       var grid:Grid;  
  149.       for ( var i:uint = 0len:uint = grids.length; i < len; i++)  
  150.       {  
  151.         grid = grids[i];  
  152.         if( grid.isWhite() == false )  
  153.         {  
  154.           return false;  
  155.         }  
  156.       }  
  157.       return true;  
  158.     }      
  159.   }    
  160. }
责任编辑:闫佳明 来源: book.51cto.com
相关推荐

2013-05-14 10:13:52

Android开发主类Main

2013-05-14 10:23:31

Android开发主类Main

2013-05-14 11:04:58

AIR AndroidTouchEvent类

2013-05-14 11:01:34

AIR AndroidTouchEvent类

2013-05-03 15:17:59

Android开发Android SDK

2013-05-14 11:18:24

AIR AndroidSwipe手势

2011-06-16 10:25:29

AndroidAIR

2013-05-14 09:57:37

2013-05-14 10:27:46

Android开发设置程序属性

2013-05-14 11:16:26

AIR Android旋转手势

2013-05-14 10:37:10

AIR Android设置访问权限

2013-05-14 10:39:27

AIR Android打包APK文件

2013-05-14 10:56:45

AIR Android多点触摸

2013-05-14 10:10:28

Android开发棋子类Grid

2013-05-14 09:50:44

Android开发Flash Build

2013-05-14 10:05:10

Android开发游戏设计

2012-03-09 13:26:53

2013-05-14 09:54:27

Android开发开源开发环境

2010-08-18 08:21:49

Adobe AIRAndroid

2013-05-14 11:13:02

AIR Android放大缩小手势
点赞
收藏

51CTO技术栈公众号