记得AS2.0帮助文档还未看到1/100时,AS3.0就铺天盖地席卷而来,本人在AS2.0到AS3.0的转变过程中苦闷过,记得刚接触AS3.0时真是一头雾水,有时真想摔本来就破的PC,转变是必经历阵痛,现在仍在阵痛期,也许还将持续很长时间的痛苦期,这是规律,没办法。为使像我这样的初学者少走一点点弯路,今天以一个最简单的游戏为例说明AS3.0中的一些使用方法。愿抛砖引玉,呼出高手。
先看效果:(方向键左右移动红色方块,设法到达蓝色方块所在地。)
(全as):
package sxl{//包路径,也就是建一个sxl文件夹,里面放此MainMap.as文件 import flash.display.Sprite;//显示对象容器 import flash.display.MovieClip;//方块需要附加坐标等属性,所以选它 import flash.display.DisplayObject;//不一一加注释了,自己看吧 import flash.text.TextField; import flash.events.Event; import flash.events.MouseEvent; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import flash.display.StageScaleMode; public class MainMap extends MovieClip { /* | container 路与障碍方块容器 | man 游戏主角 | GoldCoin GoldPos_array GoldXY 金币 金币可待放置坐标 金币产生顺序 | Score_txt 得分 | row col 方块列数 方块行数 | W_H 正方形边长及水平与垂直每步行走幅度 | stageW stageH 场景的宽与高 | list_array 存贮所有地面方块(可通行绿色方块和障碍方块) */ private var container:Sprite=new Sprite; private var man:MovieClip; private var GoldCoin:MovieClip; private var GoldPos_array:Array; private var GoldXY:uint=0; private var Score_txt:TextField; private var row:uint=28; private var col:uint=20; private var W_H:uint=20; private var stageW:uint=560; private var stageH:uint=420; private var list_array:Array; public function MainMap() { stage.scaleMode=StageScaleMode.NO_SCALE; // 大背景 var Bg:MovieClip=new MovieClip; createRect(Bg,stageW,stageH,0x808080,0xDCF76F); addChild(Bg); addChild(container); initList_array(); // 创建主角 man=new MovieClip ; createRect(man,W_H,W_H,0xFFFF00,0xFF0000); man.x=0; man.y=W_H; man.X=0; man.Y=0; addChild(man); // 创建上方背景 setTopBg(); // 创设地面 initMap(); } //..... 创建上方背景区 ................................................................... private function setTopBg() { var topBg:MovieClip=new MovieClip; createRect(topBg,560,W_H,0x000000,0xEEEEEE); topBg.y=-1; var title_txt:TextField=new TextField; title_txt.text="by 老苏 QQ: 285510591 地图设置 得分:"; title_txt.width=400; title_txt.height=18; title_txt.x=10; topBg.addChild(title_txt); Score_txt=new TextField(); Score_txt.width=60; Score_txt.height =18; Score_txt.x=400; topBg.addChild(Score_txt); addChild(topBg); var textBg:MovieClip=new MovieClip; createRect(textBg,55,16,0xEEEEEE,0xEEEEEE); textBg.x=500; var txt:TextField=new TextField; txt.text=" 魔法地图"; txt.height=18; txt.width=55; textBg.addChild(txt); textBg.mouseChildren=false; textBg.addEventListener(MouseEvent.CLICK,onReSet); addChild(textBg); } //..... 重新设置主角和地面区 ..................................................................... private function onReSet(event:MouseEvent) { if (GoldXY>0) { GoldXY--; var score:uint =GoldXY*50; Score_txt.text=String(score); } else { Score_txt.text="魔法用完"; event.target.removeEventListener(MouseEvent.CLICK,onReSet); } // 创建主角 man=new MovieClip ; createRect(man,W_H,W_H,0xFFFF00,0xFF0000); man.x=0; man.y=W_H; man.X=0; man.Y=0; addChild(man); // 重新设置地图 reSetMap(); } //..... 重新设置地面区 ......................................................................... private function reSetMap() { // 清除container容器中的子元素(即所有地面方块:绿色方块和障碍方块) var long:int=container.numChildren - 1; for (var i:int=long; i >= 0; i--) { container.removeChildAt(i); } stage.removeEventListener(KeyboardEvent.KEY_DOWN,onKeyDowns); //清除list_array数组中元素,并初始化它为二维数组 initList_array(); //铺设地面方块 initMap(); } // 初始化 list_array 为二维数组 private function initList_array() { list_array=[]; for (var i:uint=0; i < row; i++) { list_array=new Array(col); } } //........ 铺设地面方块区 ..................................................... private function initMap() { //清空金币与其可待放置坐标值 GoldPos_array=[]; //n rand 控制深色墙的创建 | m no 控制黄色块的创建 var n:uint=0; var m:uint=Math.random() * (row - 1) * (col - 1) + 2; var no:uint=1; for (var i:uint=0; i < row; i++) { for (var j:uint=0; j < col; j++) { no++; var cell:MovieClip=new MovieClip; // rand 随机数决定障碍方块的数量,也就是地面可通行的复杂程度 var rand:uint=Math.random() * 2 + 1; cell.x=i * W_H; cell.y=W_H + j * W_H; cell.X=i; cell.Y=j; if (rand == 2) { n++; } if (n % 3 == 0 && no != m) { if (cell.x == man.x && cell.y == man.y) { //创建可通行绿色方块, 属性K=0表示可通行 createRect(cell,W_H,W_H,0x808080,0xDCF76F); cell.K=0; //金币与其可待放置坐标 GoldPos_array.push(cell); } else { //创建不可通行的障碍深色墙,属性K=1表示不可通行 createRect(cell,W_H,W_H,0x808080,0xCEBB0F); cell.K=1; } } else if (no != m) { //创建可通行绿色方块, 属性K=0表示可通行 createRect(cell,W_H,W_H,0x808080,0xDCF76F); cell.K=0; //金币与其可待放置坐标 GoldPos_array.push(cell); } else { //创建可通行绿色方块, 属性K=0表示可通行 //createRect(cell,W_H,W_H,0x808080,0xDCF76F); cell.K=0; //金币与其可待放置坐标 GoldPos_array.push(cell); GoldCoin=new MovieClip ; createRect(GoldCoin,W_H,W_H,0x808080,0x2BBFFF); GoldCoin.name="GoldCoin"; //if (goldBoolean) { GoldCoin.x=cell.x; GoldCoin.y=cell.y; container.addChild(GoldCoin); } // 方块存贮到数组中 list_array[j]=cell; // 方块加入到容器中 container.addChild(cell); } } addChild(container); // 主角在container容器上面,实现总是处于可见状态 this.swapChildren(man,container); // 金币与其可待放置坐标数组乱序 randomArray(GoldPos_array); // 创建地面后,加入键盘侦听实现移动主角的功能 stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDowns); } //..... 键盘侦听区 ..................................................................... private function onKeyDowns(event:KeyboardEvent) { // 取得主角X Y值,用于判断它是否可移动(根据此X Y值由list_array数组确定上下左右四方向的地面方块,取上下左右四方向的地面方块的K值是否为0,为0可移动,为1不可移动) var X:uint=man.X; var Y:uint=man.Y; switch (event.keyCode) { case Keyboard.UP : if (Y == 0) { // 如果超出上边界时,设置主角坐标到最下方,同时重新设置地面方块,表示进入一个新的地面 man.Y=col - 1; man.y=stageH - W_H; reSetMap(); } else if (list_array[X][Y - 1].K == 0) { // 紧临的上方方块的K如果为0,表示是可通行的绿色方块 // 主角上移一格,同时,主角的Y值减1 man.y-= W_H; man.Y--; } break; case Keyboard.DOWN : if (Y == col - 1) { // 如果超出下边界时,设置主角坐标到最上方,同时重新设置地面方块,表示进入一个新的地面 man.Y=0; man.y=W_H; reSetMap(); } else if (list_array[X][Y + 1].K == 0) { // 紧临的下方方块的K如果为0,表示是可通行的绿色方块 // 主角下移一格,同时,主角的Y值加1 man.y+= W_H; man.Y++; } break; case Keyboard.LEFT : if (X == 0) { // 如果超出左边界时,设置主角坐标到最右边,同时重新设置地面方块,表示进入一个新的地面 man.X=row - 1; man.x=stageW - W_H; reSetMap(); } else if (list_array[X - 1][Y].K == 0) { // 紧临的左方方块的K如果为0,表示是可通行的绿色方块 // 主角左移一格,同时,主角的X值减1 man.x-= W_H; man.X--; } break; case Keyboard.RIGHT : if (X == row - 1) { // 如果超出右边界时,设置主角坐标到最左方,同时重新设置地面方块,表示进入一个新的地面 man.x=0; man.X=0; reSetMap(); } else if (list_array[X + 1][Y].K == 0) { // 紧临的右方方块的K如果为0,表示是可通行的绿色方块 // 主角右移一格,同时,主角的X值加1 man.x+= W_H; man.X++; } break; default : break; } var objisplayObject=container.getChildByName("GoldCoin"); if (man.x == obj.x && man.y == obj.y) { container.removeChild(obj); //创建GoldCoin //金币产生顺序值 if (GoldXY<GoldPos_array.length) { GoldXY++; var score:uint =GoldXY*50; Score_txt.text=String(score); } else { // game over Score_txt.text="you vin!"; } GoldCoin=new MovieClip ; createRect(GoldCoin,W_H,W_H,0x808080,0x2BBFFF); GoldCoin.name="GoldCoin"; GoldCoin.x=GoldPos_array[GoldXY].x; GoldCoin.y=GoldPos_array[GoldXY].y; container.addChild(GoldCoin); } } //..... 创建长方形区 ........................................................................... private function createRect(sprite:MovieClip,w:uint,h:uint,lineCor:uint,fillCor:uint) { sprite.graphics.lineStyle(1,lineCor); sprite.graphics.beginFill(fillCor); sprite.graphics.drawRect(0,0,w,h); sprite.graphics.endFill(); } //----- 数组乱序区 ------------------------------------------------------------- private function randomArray(Target_array:Array){ Target_array.sort(function () { return Math.round(Math.random()) ? 1 : -1; }); } } } |
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |