用户名: 密码: 验证码: QQ--程序群:31736530 动画群:38836599
闪无忧
 
首 页 业界新闻 业界杂谈 Flash教程 Flash源码 Flash图书 Flash酷站 Flex & AIR 供求信息
   本栏目通告:   有意向写收费精品教程的朋友,请联系本站合作
当前位置 :首页>flash教程>Flash as3.0教程>列表

flash地图游戏说明如何结合AS3.0使用

[来源:闪吧 | 作者:sxl001 | 时间:2008-09-02 | 点击:  | 收藏本文  【 】]

记得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;
   });
  }
}
}

源文件下载: map.rar

文章如果有错误或者缺少文件,请发邮件提交给我们
上一篇:2/8/10/16/32进制AS3自带函数进行互换
下一篇:AS3的网页参数处理
Tags:    
>>> 最新评论:(共有 1 位网友发表了评论)      查看所有评论
  发表评论
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
·本站发布内容均为客观表达作者观点,不代表闪无忧立场,请勿攻击和漫骂
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
  教程分类
  基础操作   动画特效
  应用开发   组件学习
  As程序   动画教程
  Flash cs3   AS 3.0
  FCS/FMS教程   Loading教程
  Flash与Web   Flash教程连载
  相关文章
·flash【.swf?id=】很简单的获取
·AS3.0 单一职责原则设计模式
·as3打造一个非常酷的莲花曲线效
·AS3制作MP3波形图
·AS3的网页参数处理
·flash地图游戏说明如何结合AS3.0
·2/8/10/16/32进制AS3自带函数进
·as3实现点击图片取色
·flash as3+php上传源文件下载
·TransformManager (AS3) - Inter
  热门文章
·Flash进度条的制作详细讲解(组图)
·flash幻灯片网页效果
·Flex 3 AdvancedDataGrid的使用(第二
·全Flash动画网站实现的基础教学
·flash水影效果字
·Flash打造简单的飘雪动画视觉特效
·FLASH+XML相册(附源码)
·超酷flash光晕移动效果
·Flash旋转拖尾文字效果的制作教程
·Flash制作大雪纷飞效果动画
·flash春雷闪电效果
关于我们 - 免责声明 - 网站地图 - 商务服务 - 联系我们 - RSS地图
©CopyRight 2006-2008, 5UFlash.COM, Inc. All Rights Reserved
鲁ICP备06034971号