记得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