flash 贪吃蛇游戏

www.111cn.net 更新:2008-02-22 编辑:kp12345 来源:转载

1.首先规定蛇的运动区域宽度(stagew)和高度(stageh)
2.增加键盘侦听,获得键控代码,如果该键与前一个键是反向的则不予改变
3.初始化中, 请注意:蛇头、蛇身、食物的大小均为 7 象素
4.每一次移动的步长(Move)均为8象素,以实现身体为一格一格的效果
5.吃到食物后,蛇身(body)长度增加5个单位,复制出5个身体
6.履带式前进:从尾部开始,后一个跟随前一个的位置,最前面的跟随蛇头



图示:
1.整体思路

SnakeTree.jpg

2.蛇头、蛇身、食物的大小均为 7 象素,步长 8 象素

SnakeTree.jpg


步骤1:

SnakeTree.jpg

  *绘制一个正方形做(代表蛇头、蛇身、食物),尺寸随意,保存为影片剪辑
   注册点在左上(0,0),连接—>导出—>标志符"block"

  *FPS为18左右
步骤2:
加入AS代码

//========== 绘制出蛇活动的区域 ==========
var stagew:Number = 447;
var stageh:Number = 255;
beginFill(0xeeeeee);
moveTo(0, 0);
lineTo(stagew, 0);
lineTo(stagew, stageh);
lineTo(0, stageh);
endFill();
//========== 创建一个文本框用于显示信息 ==========
_root.createTextField("txt", -100, 1, 255, 400, 30);
txt.text = "贪吃蛇游戏   按'方向键'开始";
//========== 建立键盘侦听 ==========
Key.addListener(txt);
//使用一个已有的对象txt作侦听,免去了新建侦听对象了,节约了空间
var NowKey:Number;
//NowKey全局变量用于存储当前按下的键
txt.onKeyDown = function() {
var c = Key.getCode()-37;
//c= 左键0 上键1 右键 2 下键3
if ((c<4) && (Math.abs(NowKey-c) != 2)) {
  NowKey = c;
//如果蛇正在向左移动那么他就不能向右移动,如果正向上移动就不能向下移动
//左(0)和右(2)相差2,上(1)和下(3)相差2,所以如果他们相差2则该键无效

}
};
//========== 下面是一系列初始化 ==========
_root.attachMovie("block", "head", -1, {_width:7, _height:7});
//首先创建蛇头,它的大小为7像素
var Move:Number = 8;
//每次移动的距离比蛇头多出1像素,这样就可以做出一格一格的效果了
head._x = head._y=20*Move;
//蛇头的起点位置要(移动距离的倍数)
var body:Number = 0;
//蛇身的长度初值
var GameOver:Boolean = false;
//标志游戏是否结束的标记
//========== 创建食物的函数 ==========

createfood();
function createfood() {
_root.attachMovie("block", "food", 0, {_width:7, _height:7});
//食物的深度永远为0,这样省去了删除被吃掉的食物的操作
new Color(food).setRGB(0xff0000);

//食物为红色的block
var Colum:Number = stagew/Move;
var Row:Number = stageh/Move;
//Colum为总列数,Row为总行数
food._x = random(Colum)*Move;
food._y = random(Row)*Move;
//食物随机出现的位置(移动距离的倍数)
}
//========== 主函数 ==========
_root.onEnterFrame = function() {
switch (NowKey) {
  //根据方向键值决定蛇头的移动方向
case 0 :
  head._x -= Move;
  break;
case 1 :
  head._y -= Move;
  break;
case 2 :
  head._x += Move;
  break;
case 3 :
  head._y += Move;
}
if (head._x<0 || head._x>stagew || head._y<0 || head._y>stageh) {
  GameOver = true;
  //头部出界则游戏结束
}
if (head.hitTest(food)) {
  createfood();
  //头部与食物接触后,调用新的食物
  for (var i = 1; i<=5; i++) {
   _root.attachMovie("block", "body"+(body+i), body+i, {_width:7, _height:7, _x:-50, _y:-50});
   //同时,蛇的身长增加5个单位,初始大小 7 ,初始位置在场景外
  }
  body += 5;
  txt.text = "分数 "+body;
}
for (var i = body; i>0; i--) {
  if (head.hitTest(this["body"+i])) {
   GameOver = true;
   //判断蛇体是否与头部接触,如果是游戏结束
  }
  if (i == 1) {
   this["body"+i]._x = head._x;
   this["body"+i]._y = head._y;
  } else {
   this["body"+i]._x = this["body"+(i-1)]._x;
   this["body"+i]._y = this["body"+(i-1)]._y;
  }
  //这个循环从尾至头各向前移动一个单位,与蛇头最近的身体与蛇头重合

}
if (GameOver) {
  //标志位GameOver为真时,显示游戏结束,删除onEnterFrame,移动停止
  txt.text = "游戏结束";
  delete this.onEnterFrame;
}
};

Flash 充电1: mc.attachMovie()
作用: 从库中复制影片剪辑

语法:
mc.attachMovie(id:String, name:String, depth:Number, [initObject:Object])
mc:MovieClip - 为该影片的父级影片
id:String - 库元件的链接名称;
name:String - 该影片剪辑实例的唯一名称;
depth:Number - 指定 SWF 文件所放位置的深度级别;
initObject:Object [可选] - 影片剪辑的属性的对象。

例如: 在库中有一元件标识符为"block"
_root.createEmptyMovieClip("MC", -1);
for (var i = 0; i<10; i++) {
MC.attachMovie("block", "b"+i, i, {_width:30, _height:30, _x:i*30, _y:10});
}
trace(MC["b"+0]._parent);
//被复制出的影片剪辑的父级影片为MC
trace(MC["b"+0]._parent._parent);
//被复制出的影片剪辑的父级影片的父级影片为_root


Flash 充电2: mc.duplicateMovieClip()
作用: 复制舞台上的影片剪辑

语法:
mc.duplicateMovieClip(name:String, depth:Number, [initObject:Object])
mc:MovieClip - 被复制的对象
name:String - 该影片剪辑实例的唯一名称;
depth:Number - 指定 SWF 文件所放位置的深度级别;
initObject:Object [可选] - 影片剪辑的属性的对象。

例如: 舞台中有一影片剪辑实例名为"MC"
for (var i = 0; i<10; i++) {
MC.duplicateMovieClip("M"+i, i, {_width:30, _height:30, _x:i*30, _y:10});
}

Flash 充电3: 影片剪辑的删除
注意:在删除时要区分复制的影片剪辑和非复制的影片剪辑
      对于复制的影片剪辑使用 removeMovieClip(target:Object)
      对于非复制的影片剪辑使用 unloadMovie(target:Object)
复制的影片剪辑: 指用duplicateMovieClip()、MovieClip.duplicateMovieClip()、MovieClip.createEmptyMovieClip() 或 MovieClip.attachMovie() 创建的影片剪辑实例。
非复制的影片剪辑: 指一开始就存在于舞台上的影片剪辑,即不是使用代码复制出来的影片。